# dmidecode 2.4 (=> Type: laptop) SMBIOS 2.31 present. 27 structures occupying 1211 bytes. Table at 0x000DF810. Handle 0x0000 DMI type 0, 20 bytes. BIOS Information Vendor: ACER Version: 3A14 Release Date: 04/20/2004 Address: 0xE5160 Runtime Size: 110240 bytes ROM Size: 512 kB Characteristics: ISA is supported PCI is supported PC Card (PCMCIA) is supported PNP is supported APM is supported BIOS is upgradeable BIOS shadowing is allowed ESCD support is available Boot from CD is supported 3.5"/720 KB floppy services are supported (int 13h) Print screen service is supported (int 5h) 8042 keyboard services are supported (int 9h) Serial services are supported (int 14h) Printer services are supported (int 17h) ACPI is supported USB legacy is supported AGP is supported Smart battery is supported BIOS boot specification is supported Handle 0x0001 DMI type 1, 25 bytes. System Information Manufacturer: Acer Product Name: TravelMate 6000 Version: Rev 1 Serial Number: LXT41050014200085CEF00 UUID: E043E530-B1A3-D811-8AAC-00C09F3DF593 Wake-up Type: Power Switch Handle 0x0002 DMI type 2, 8 bytes. Base Board Information Manufacturer: Acer Product Name: TravelMate 6000 Version: Rev 1.0 Serial Number: LXT41050014200085CEF00 Handle 0x0003 DMI type 3, 17 bytes. Chassis Information Manufacturer: Acer Type: Notebook Lock: Not Present Version: Rev.1 Serial Number: LXT41050014200085CEF00 Asset Tag: ................................ Boot-up State: Safe Power Supply State: Safe Thermal State: Safe Security Status: None OEM Information: 0x00001234 Handle 0x0004 DMI type 4, 35 bytes. Processor Information Socket Designation: uFCPGA2 Type: Central Processor Family: Pentium M Manufacturer: Intel ID: 95 06 00 00 BF F9 E9 A7 Signature: Type 0, Family 6, Model 9, Stepping 5 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (Fast floating-point save and restore) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) TM (Thermal monitor supported) SBF (Signal break on FERR) Version: Intel(R) Pentium(R) M processor Voltage: 1.2 V External Clock: 400 MHz Max Speed: 1600 MHz Current Speed: 1600 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x0008 L2 Cache Handle: 0x0009 L3 Cache Handle: Not Provided Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Handle 0x0005 DMI type 5, 20 bytes. Memory Controller Information Error Detecting Method: None Error Correcting Capabilities: None Supported Interleave: One-way Interleave Current Interleave: One-way Interleave Maximum Memory Module Size: 1024 MB Maximum Total Memory Size: 2048 MB Supported Speeds: 60 ns Supported Memory Types: DIMM Memory Module Voltage: 3.3 V Associated Memory Slots: 2 0x0006 0x0007 Enabled Error Correcting Capabilities: None Handle 0x0006 DMI type 6, 12 bytes. Memory Module Information Socket Designation: DIMM 1 Bank Connections: 0 1 Current Speed: 75 ns Type: DIMM SDRAM Installed Size: 256 MB (Double-bank Connection) Enabled Size: 256 MB (Double-bank Connection) Error Status: OK Handle 0x0007 DMI type 6, 12 bytes. Memory Module Information Socket Designation: DIMM 2 Bank Connections: 2 3 Current Speed: 75 ns Type: DIMM SDRAM Installed Size: 256 MB (Double-bank Connection) Enabled Size: 256 MB (Double-bank Connection) Error Status: OK Handle 0x0008 DMI type 7, 19 bytes. Cache Information Socket Designation: L1 Cache Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 32 KB Maximum Size: 32 KB Supported SRAM Types: Burst Pipeline Burst Asynchronous Installed SRAM Type: Asynchronous Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x0009 DMI type 7, 19 bytes. Cache Information Socket Designation: L2 Cache Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: External Installed Size: 1024 KB Maximum Size: 1024 KB Supported SRAM Types: Burst Pipeline Burst Asynchronous Installed SRAM Type: Burst Speed: Unknown Error Correction Type: Unknown System Type: Unknown Associativity: Unknown Handle 0x000A DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: LPT 1 Internal Connector Type: None External Reference Designator: Parallel External Connector Type: DB-25 female Port Type: Parallel Port ECP/EPP Handle 0x000B DMI type 8, 9 bytes. Port Connector Information Internal Reference Designator: U28 Internal Connector Type: None External Reference Designator: PS/2 Mouse External Connector Type: Circular DIN-8 male Port Type: Keyboard Port Handle 0x000C DMI type 9, 13 bytes. System Slot Information Designation: PCMCIA socket 0 Type: 32-bit PC Card (PCMCIA) Current Usage: Unknown Length: Long ID: Adapter 0, Socket 0 Characteristics: 5.0 V is provided 3.3 V is provided PC Card-16 is supported Cardbus is supported Modem ring resume is supported PME signal is supported Hot-plug devices are supported Handle 0x000D DMI type 10, 10 bytes. On Board Device 1 Information Type: Video Status: Disabled Description: Montara-GME On Board Device 2 Information Type: Sound Status: Disabled Description: AC97 Audio On Board Device 3 Information Type: Other Status: Disabled Description: TI TSB43AB21 IEEE-1394 Controller Handle 0x000E DMI type 11, 5 bytes. OEM Strings String 1: SMBIOS 2.3 String 2: Customer Reference Platform Handle 0x000F DMI type 12, 5 bytes. System Configuration Options Option 1: No Jumper On This Platform. Handle 0x0010 DMI type 15, 29 bytes. System Event Log Area Length: 0 bytes Header Start Offset: 0x0000 Header Length: 16 bytes Data Start Offset: 0x0010 Access Method: Memory-mapped physical 32-bit address Access Address: 0x00000000 Status: Invalid, Not Full Change Token: 0x00000000 Header Format: Type 1 Supported Log Type Descriptors: 3 Descriptor 1: POST error Data Format 1: POST results bitmap Descriptor 2: Single-bit ECC memory error Data Format 2: Multiple-event Descriptor 3: Multi-bit ECC memory error Data Format 3: Multiple-event Handle 0x0011 DMI type 16, 15 bytes. Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: None Maximum Capacity: 3 GB Error Information Handle: Not Provided Number Of Devices: 2 Handle 0x0012 DMI type 17, 27 bytes. Memory Device Array Handle: 0x0011 Error Information Handle: No Error Total Width: 64 bits Data Width: 64 bits Size: 256 MB Form Factor: DIMM Set: 1 Locator: DIMM 0 Bank Locator: Bank 0, 1 Type: SRAM Type Detail: Synchronous Speed: 333 MHz (3.0 ns) Manufacturer: Not Specified Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Handle 0x0013 DMI type 17, 27 bytes. Memory Device Array Handle: 0x0011 Error Information Handle: No Error Total Width: 64 bits Data Width: 64 bits Size: 256 MB Form Factor: DIMM Set: 1 Locator: DIMM 1 Bank Locator: Bank 2, 3 Type: SRAM Type Detail: Synchronous Speed: 333 MHz (3.0 ns) Manufacturer: Not Specified Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Handle 0x0014 DMI type 19, 15 bytes. Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0001FFFFFFF Range Size: 512 MB Physical Array Handle: 0x0011 Partition Width: 0 Handle 0x0015 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x0000FFFFFFF Range Size: 256 MB Physical Device Handle: 0x0012 Memory Array Mapped Address Handle: 0x0014 Partition Row Position: 1 Interleave Position: 1 Handle 0x0016 DMI type 20, 19 bytes. Memory Device Mapped Address Starting Address: 0x00010000000 Ending Address: 0x0001FFFFFFF Range Size: 256 MB Physical Device Handle: 0x0013 Memory Array Mapped Address Handle: 0x0014 Partition Row Position: 1 Interleave Position: 1 Handle 0x0017 DMI type 21, 7 bytes. Built-in Pointing Device Type: Mouse Interface: PS/2 Buttons: 2 Handle 0x0018 DMI type 22, 26 bytes. Portable Battery Location: Right Side Manufacturer: Sanyo Name: Sanyo Chemistry: Lithium Ion Design Capacity: 4400 mWh Design Voltage: 14800 mV SBDS Version: Bat123 Maximum Error: 6% SBDS Serial Number: 04D2 SBDS Manufacture Date: 1985-08-25 OEM-specific Information: 0x00000000 Handle 0x0019 DMI type 32, 20 bytes. System Boot Information Status: <OUT OF SPEC> Handle 0x001A DMI type 127, 4 bytes. End Of Table n100' href='#n100'>100</a> <a id='n101' href='#n101'>101</a> <a id='n102' href='#n102'>102</a> <a id='n103' href='#n103'>103</a> <a id='n104' href='#n104'>104</a> <a id='n105' href='#n105'>105</a> <a id='n106' href='#n106'>106</a> <a id='n107' href='#n107'>107</a> <a id='n108' href='#n108'>108</a> <a id='n109' href='#n109'>109</a> <a id='n110' href='#n110'>110</a> <a id='n111' href='#n111'>111</a> <a id='n112' href='#n112'>112</a> <a id='n113' href='#n113'>113</a> <a id='n114' href='#n114'>114</a> <a id='n115' href='#n115'>115</a> <a id='n116' href='#n116'>116</a> <a id='n117' href='#n117'>117</a> <a id='n118' href='#n118'>118</a> <a id='n119' href='#n119'>119</a> <a id='n120' href='#n120'>120</a> <a id='n121' href='#n121'>121</a> <a id='n122' href='#n122'>122</a> <a id='n123' href='#n123'>123</a> <a id='n124' href='#n124'>124</a> <a id='n125' href='#n125'>125</a> <a id='n126' href='#n126'>126</a> <a id='n127' href='#n127'>127</a> <a id='n128' href='#n128'>128</a> <a id='n129' href='#n129'>129</a> <a id='n130' href='#n130'>130</a> <a id='n131' href='#n131'>131</a> <a id='n132' href='#n132'>132</a> <a id='n133' href='#n133'>133</a> <a id='n134' href='#n134'>134</a> <a id='n135' href='#n135'>135</a> <a id='n136' href='#n136'>136</a> <a id='n137' href='#n137'>137</a> <a id='n138' href='#n138'>138</a> <a id='n139' href='#n139'>139</a> <a id='n140' href='#n140'>140</a> <a id='n141' href='#n141'>141</a> <a id='n142' href='#n142'>142</a> <a id='n143' href='#n143'>143</a> <a id='n144' href='#n144'>144</a> <a id='n145' href='#n145'>145</a> <a id='n146' href='#n146'>146</a> <a id='n147' href='#n147'>147</a> <a id='n148' href='#n148'>148</a> <a id='n149' href='#n149'>149</a> <a id='n150' href='#n150'>150</a> <a id='n151' href='#n151'>151</a> <a id='n152' href='#n152'>152</a> <a id='n153' href='#n153'>153</a> <a id='n154' href='#n154'>154</a> <a id='n155' href='#n155'>155</a> <a id='n156' href='#n156'>156</a> <a id='n157' href='#n157'>157</a> <a id='n158' href='#n158'>158</a> <a id='n159' href='#n159'>159</a> <a id='n160' href='#n160'>160</a> <a id='n161' href='#n161'>161</a> <a id='n162' href='#n162'>162</a> <a id='n163' href='#n163'>163</a> <a id='n164' href='#n164'>164</a> <a id='n165' href='#n165'>165</a> <a id='n166' href='#n166'>166</a> <a id='n167' href='#n167'>167</a> <a id='n168' href='#n168'>168</a> <a id='n169' href='#n169'>169</a> <a id='n170' href='#n170'>170</a> <a id='n171' href='#n171'>171</a> <a id='n172' href='#n172'>172</a> <a id='n173' href='#n173'>173</a> <a id='n174' href='#n174'>174</a> <a id='n175' href='#n175'>175</a> <a id='n176' href='#n176'>176</a> <a id='n177' href='#n177'>177</a> <a id='n178' href='#n178'>178</a> <a id='n179' href='#n179'>179</a> <a id='n180' href='#n180'>180</a> <a id='n181' href='#n181'>181</a> <a id='n182' href='#n182'>182</a> <a id='n183' href='#n183'>183</a> <a id='n184' href='#n184'>184</a> <a id='n185' href='#n185'>185</a> <a id='n186' href='#n186'>186</a> <a id='n187' href='#n187'>187</a> <a id='n188' href='#n188'>188</a> <a id='n189' href='#n189'>189</a> <a id='n190' href='#n190'>190</a> <a id='n191' href='#n191'>191</a> <a id='n192' href='#n192'>192</a> <a id='n193' href='#n193'>193</a> <a id='n194' href='#n194'>194</a> <a id='n195' href='#n195'>195</a> <a id='n196' href='#n196'>196</a> <a id='n197' href='#n197'>197</a> <a id='n198' href='#n198'>198</a> <a id='n199' href='#n199'>199</a> <a id='n200' href='#n200'>200</a> <a id='n201' href='#n201'>201</a> <a id='n202' href='#n202'>202</a> <a id='n203' href='#n203'>203</a> <a id='n204' href='#n204'>204</a> <a id='n205' href='#n205'>205</a> <a id='n206' href='#n206'>206</a> <a id='n207' href='#n207'>207</a> <a id='n208' href='#n208'>208</a> <a id='n209' href='#n209'>209</a> <a id='n210' href='#n210'>210</a> <a id='n211' href='#n211'>211</a> <a id='n212' href='#n212'>212</a> <a id='n213' href='#n213'>213</a> <a id='n214' href='#n214'>214</a> <a id='n215' href='#n215'>215</a> <a id='n216' href='#n216'>216</a> <a id='n217' href='#n217'>217</a> <a id='n218' href='#n218'>218</a> <a id='n219' href='#n219'>219</a> <a id='n220' href='#n220'>220</a> <a id='n221' href='#n221'>221</a> <a id='n222' href='#n222'>222</a> <a id='n223' href='#n223'>223</a> <a id='n224' href='#n224'>224</a> <a id='n225' href='#n225'>225</a> <a id='n226' href='#n226'>226</a> <a id='n227' href='#n227'>227</a> <a id='n228' href='#n228'>228</a> <a id='n229' href='#n229'>229</a> <a id='n230' href='#n230'>230</a> <a id='n231' href='#n231'>231</a> <a id='n232' href='#n232'>232</a> <a id='n233' href='#n233'>233</a> <a id='n234' href='#n234'>234</a> <a id='n235' href='#n235'>235</a> <a id='n236' href='#n236'>236</a> <a id='n237' href='#n237'>237</a> <a id='n238' href='#n238'>238</a> <a id='n239' href='#n239'>239</a> <a id='n240' href='#n240'>240</a> <a id='n241' href='#n241'>241</a> <a id='n242' href='#n242'>242</a> <a id='n243' href='#n243'>243</a> <a id='n244' href='#n244'>244</a> <a id='n245' href='#n245'>245</a> <a id='n246' href='#n246'>246</a> <a id='n247' href='#n247'>247</a> <a id='n248' href='#n248'>248</a> <a id='n249' href='#n249'>249</a> <a id='n250' href='#n250'>250</a> <a id='n251' href='#n251'>251</a> <a id='n252' href='#n252'>252</a> <a id='n253' href='#n253'>253</a> <a id='n254' href='#n254'>254</a> <a id='n255' href='#n255'>255</a> <a id='n256' href='#n256'>256</a> <a id='n257' href='#n257'>257</a> <a id='n258' href='#n258'>258</a> <a id='n259' href='#n259'>259</a> <a id='n260' href='#n260'>260</a> <a id='n261' href='#n261'>261</a> <a id='n262' href='#n262'>262</a> <a id='n263' href='#n263'>263</a> <a id='n264' href='#n264'>264</a> <a id='n265' href='#n265'>265</a> <a id='n266' href='#n266'>266</a> <a id='n267' href='#n267'>267</a> <a id='n268' href='#n268'>268</a> <a id='n269' href='#n269'>269</a> <a id='n270' href='#n270'>270</a> <a id='n271' href='#n271'>271</a> <a id='n272' href='#n272'>272</a> <a id='n273' href='#n273'>273</a> <a id='n274' href='#n274'>274</a> <a id='n275' href='#n275'>275</a> <a id='n276' href='#n276'>276</a> <a id='n277' href='#n277'>277</a> <a id='n278' href='#n278'>278</a> <a id='n279' href='#n279'>279</a> <a id='n280' href='#n280'>280</a> <a id='n281' href='#n281'>281</a> <a id='n282' href='#n282'>282</a> <a id='n283' href='#n283'>283</a> <a id='n284' href='#n284'>284</a> <a id='n285' href='#n285'>285</a> <a id='n286' href='#n286'>286</a> <a id='n287' href='#n287'>287</a> <a id='n288' href='#n288'>288</a> <a id='n289' href='#n289'>289</a> <a id='n290' href='#n290'>290</a> <a id='n291' href='#n291'>291</a> <a id='n292' href='#n292'>292</a> <a id='n293' href='#n293'>293</a> <a id='n294' href='#n294'>294</a> <a id='n295' href='#n295'>295</a> <a id='n296' href='#n296'>296</a> <a id='n297' href='#n297'>297</a> <a id='n298' href='#n298'>298</a> <a id='n299' href='#n299'>299</a> <a id='n300' href='#n300'>300</a> <a id='n301' href='#n301'>301</a> <a id='n302' href='#n302'>302</a> <a id='n303' href='#n303'>303</a> <a id='n304' href='#n304'>304</a> <a id='n305' href='#n305'>305</a> <a id='n306' href='#n306'>306</a> <a id='n307' href='#n307'>307</a> <a id='n308' href='#n308'>308</a> <a id='n309' href='#n309'>309</a> <a id='n310' href='#n310'>310</a> <a id='n311' href='#n311'>311</a> <a id='n312' href='#n312'>312</a> <a id='n313' href='#n313'>313</a> <a id='n314' href='#n314'>314</a> <a id='n315' href='#n315'>315</a> <a id='n316' href='#n316'>316</a> <a id='n317' href='#n317'>317</a> <a id='n318' href='#n318'>318</a> <a id='n319' href='#n319'>319</a> <a id='n320' href='#n320'>320</a> <a id='n321' href='#n321'>321</a> <a id='n322' href='#n322'>322</a> <a id='n323' href='#n323'>323</a> <a id='n324' href='#n324'>324</a> <a id='n325' href='#n325'>325</a> <a id='n326' href='#n326'>326</a> <a id='n327' href='#n327'>327</a> <a id='n328' href='#n328'>328</a> <a id='n329' href='#n329'>329</a> <a id='n330' href='#n330'>330</a> <a id='n331' href='#n331'>331</a> <a id='n332' href='#n332'>332</a> <a id='n333' href='#n333'>333</a> <a id='n334' href='#n334'>334</a> <a id='n335' href='#n335'>335</a> <a id='n336' href='#n336'>336</a> <a id='n337' href='#n337'>337</a> <a id='n338' href='#n338'>338</a> <a id='n339' href='#n339'>339</a> <a id='n340' href='#n340'>340</a> <a id='n341' href='#n341'>341</a> <a id='n342' href='#n342'>342</a> <a id='n343' href='#n343'>343</a> <a id='n344' href='#n344'>344</a> <a id='n345' href='#n345'>345</a> <a id='n346' href='#n346'>346</a> <a id='n347' href='#n347'>347</a> <a id='n348' href='#n348'>348</a> <a id='n349' href='#n349'>349</a> <a id='n350' href='#n350'>350</a> <a id='n351' href='#n351'>351</a> <a id='n352' href='#n352'>352</a> <a id='n353' href='#n353'>353</a> <a id='n354' href='#n354'>354</a> <a id='n355' href='#n355'>355</a> <a id='n356' href='#n356'>356</a> <a id='n357' href='#n357'>357</a> <a id='n358' href='#n358'>358</a> <a id='n359' href='#n359'>359</a> <a id='n360' href='#n360'>360</a> <a id='n361' href='#n361'>361</a> <a id='n362' href='#n362'>362</a> <a id='n363' href='#n363'>363</a> <a id='n364' href='#n364'>364</a> <a id='n365' href='#n365'>365</a> <a id='n366' href='#n366'>366</a> <a id='n367' href='#n367'>367</a> <a id='n368' href='#n368'>368</a> <a id='n369' href='#n369'>369</a> <a id='n370' href='#n370'>370</a> <a id='n371' href='#n371'>371</a> <a id='n372' href='#n372'>372</a> <a id='n373' href='#n373'>373</a> <a id='n374' href='#n374'>374</a> <a id='n375' href='#n375'>375</a> <a id='n376' href='#n376'>376</a> <a id='n377' href='#n377'>377</a> <a id='n378' href='#n378'>378</a> <a id='n379' href='#n379'>379</a> <a id='n380' href='#n380'>380</a> <a id='n381' href='#n381'>381</a> <a id='n382' href='#n382'>382</a> <a id='n383' href='#n383'>383</a> <a id='n384' href='#n384'>384</a> <a id='n385' href='#n385'>385</a> <a id='n386' href='#n386'>386</a> <a id='n387' href='#n387'>387</a> <a id='n388' href='#n388'>388</a> <a id='n389' href='#n389'>389</a> <a id='n390' href='#n390'>390</a> <a id='n391' href='#n391'>391</a> <a id='n392' href='#n392'>392</a> <a id='n393' href='#n393'>393</a> <a id='n394' href='#n394'>394</a> <a id='n395' href='#n395'>395</a> <a id='n396' href='#n396'>396</a> <a id='n397' href='#n397'>397</a> <a id='n398' href='#n398'>398</a> <a id='n399' href='#n399'>399</a> <a id='n400' href='#n400'>400</a> <a id='n401' href='#n401'>401</a> <a id='n402' href='#n402'>402</a> <a id='n403' href='#n403'>403</a> <a id='n404' href='#n404'>404</a> <a id='n405' href='#n405'>405</a> <a id='n406' href='#n406'>406</a> <a id='n407' href='#n407'>407</a> <a id='n408' href='#n408'>408</a> <a id='n409' href='#n409'>409</a> <a id='n410' href='#n410'>410</a> <a id='n411' href='#n411'>411</a> <a id='n412' href='#n412'>412</a> <a id='n413' href='#n413'>413</a> <a id='n414' href='#n414'>414</a> <a id='n415' href='#n415'>415</a> <a id='n416' href='#n416'>416</a> <a id='n417' href='#n417'>417</a> <a id='n418' href='#n418'>418</a> <a id='n419' href='#n419'>419</a> <a id='n420' href='#n420'>420</a> <a id='n421' href='#n421'>421</a> <a id='n422' href='#n422'>422</a> <a id='n423' href='#n423'>423</a> <a id='n424' href='#n424'>424</a> <a id='n425' href='#n425'>425</a> <a id='n426' href='#n426'>426</a> <a id='n427' href='#n427'>427</a> <a id='n428' href='#n428'>428</a> <a id='n429' href='#n429'>429</a> <a id='n430' href='#n430'>430</a> <a id='n431' href='#n431'>431</a> <a id='n432' href='#n432'>432</a> <a id='n433' href='#n433'>433</a> <a id='n434' href='#n434'>434</a> <a id='n435' href='#n435'>435</a> <a id='n436' href='#n436'>436</a> <a id='n437' href='#n437'>437</a> <a id='n438' href='#n438'>438</a> <a id='n439' href='#n439'>439</a> <a id='n440' href='#n440'>440</a> <a id='n441' href='#n441'>441</a> <a id='n442' href='#n442'>442</a> <a id='n443' href='#n443'>443</a> <a id='n444' href='#n444'>444</a> <a id='n445' href='#n445'>445</a> <a id='n446' href='#n446'>446</a> <a id='n447' href='#n447'>447</a> <a id='n448' href='#n448'>448</a> <a id='n449' href='#n449'>449</a> <a id='n450' href='#n450'>450</a> <a id='n451' href='#n451'>451</a> <a id='n452' href='#n452'>452</a> <a id='n453' href='#n453'>453</a> <a id='n454' href='#n454'>454</a> <a id='n455' href='#n455'>455</a> <a id='n456' href='#n456'>456</a> <a id='n457' href='#n457'>457</a> <a id='n458' href='#n458'>458</a> <a id='n459' href='#n459'>459</a> <a id='n460' href='#n460'>460</a> <a id='n461' href='#n461'>461</a> <a id='n462' href='#n462'>462</a> <a id='n463' href='#n463'>463</a> <a id='n464' href='#n464'>464</a> <a id='n465' href='#n465'>465</a> <a id='n466' href='#n466'>466</a> <a id='n467' href='#n467'>467</a> <a id='n468' href='#n468'>468</a> <a id='n469' href='#n469'>469</a> <a id='n470' href='#n470'>470</a> <a id='n471' href='#n471'>471</a> <a id='n472' href='#n472'>472</a> <a id='n473' href='#n473'>473</a> <a id='n474' href='#n474'>474</a> <a id='n475' href='#n475'>475</a> <a id='n476' href='#n476'>476</a> <a id='n477' href='#n477'>477</a> <a id='n478' href='#n478'>478</a> <a id='n479' href='#n479'>479</a> <a id='n480' href='#n480'>480</a> <a id='n481' href='#n481'>481</a> <a id='n482' href='#n482'>482</a> <a id='n483' href='#n483'>483</a> <a id='n484' href='#n484'>484</a> <a id='n485' href='#n485'>485</a> <a id='n486' href='#n486'>486</a> <a id='n487' href='#n487'>487</a> <a id='n488' href='#n488'>488</a> <a id='n489' href='#n489'>489</a> <a id='n490' href='#n490'>490</a> <a id='n491' href='#n491'>491</a> <a id='n492' href='#n492'>492</a> <a id='n493' href='#n493'>493</a> <a id='n494' href='#n494'>494</a> <a id='n495' href='#n495'>495</a> <a id='n496' href='#n496'>496</a> <a id='n497' href='#n497'>497</a> <a id='n498' href='#n498'>498</a> <a id='n499' href='#n499'>499</a> <a id='n500' href='#n500'>500</a> <a id='n501' href='#n501'>501</a> <a id='n502' href='#n502'>502</a> <a id='n503' href='#n503'>503</a> <a id='n504' href='#n504'>504</a> <a id='n505' href='#n505'>505</a> <a id='n506' href='#n506'>506</a> <a id='n507' href='#n507'>507</a> <a id='n508' href='#n508'>508</a> <a id='n509' href='#n509'>509</a> <a id='n510' href='#n510'>510</a> <a id='n511' href='#n511'>511</a> <a id='n512' href='#n512'>512</a> <a id='n513' href='#n513'>513</a> <a id='n514' href='#n514'>514</a> <a id='n515' href='#n515'>515</a> <a id='n516' href='#n516'>516</a> <a id='n517' href='#n517'>517</a> <a id='n518' href='#n518'>518</a> <a id='n519' href='#n519'>519</a> <a id='n520' href='#n520'>520</a> <a id='n521' href='#n521'>521</a> <a id='n522' href='#n522'>522</a> <a id='n523' href='#n523'>523</a> <a id='n524' href='#n524'>524</a> <a id='n525' href='#n525'>525</a> <a id='n526' href='#n526'>526</a> <a id='n527' href='#n527'>527</a> <a id='n528' href='#n528'>528</a> <a id='n529' href='#n529'>529</a> <a id='n530' href='#n530'>530</a> <a id='n531' href='#n531'>531</a> <a id='n532' href='#n532'>532</a> <a id='n533' href='#n533'>533</a> <a id='n534' href='#n534'>534</a> <a id='n535' href='#n535'>535</a> <a id='n536' href='#n536'>536</a> <a id='n537' href='#n537'>537</a> <a id='n538' href='#n538'>538</a> <a id='n539' href='#n539'>539</a> <a id='n540' href='#n540'>540</a> <a id='n541' href='#n541'>541</a> <a id='n542' href='#n542'>542</a> <a id='n543' href='#n543'>543</a> <a id='n544' href='#n544'>544</a> <a id='n545' href='#n545'>545</a> <a id='n546' href='#n546'>546</a> <a id='n547' href='#n547'>547</a> <a id='n548' href='#n548'>548</a> <a id='n549' href='#n549'>549</a> <a id='n550' href='#n550'>550</a> <a id='n551' href='#n551'>551</a> <a id='n552' href='#n552'>552</a> <a id='n553' href='#n553'>553</a> <a id='n554' href='#n554'>554</a> <a id='n555' href='#n555'>555</a> <a id='n556' href='#n556'>556</a> <a id='n557' href='#n557'>557</a> <a id='n558' href='#n558'>558</a> <a id='n559' href='#n559'>559</a> <a id='n560' href='#n560'>560</a> <a id='n561' href='#n561'>561</a> <a id='n562' href='#n562'>562</a> <a id='n563' href='#n563'>563</a> <a id='n564' href='#n564'>564</a> <a id='n565' href='#n565'>565</a> <a id='n566' href='#n566'>566</a> <a id='n567' href='#n567'>567</a> <a id='n568' href='#n568'>568</a> <a id='n569' href='#n569'>569</a> <a id='n570' href='#n570'>570</a> <a id='n571' href='#n571'>571</a> <a id='n572' href='#n572'>572</a> <a id='n573' href='#n573'>573</a> <a id='n574' href='#n574'>574</a> <a id='n575' href='#n575'>575</a> <a id='n576' href='#n576'>576</a> <a id='n577' href='#n577'>577</a> <a id='n578' href='#n578'>578</a> <a id='n579' href='#n579'>579</a> <a id='n580' href='#n580'>580</a> <a id='n581' href='#n581'>581</a> <a id='n582' href='#n582'>582</a> <a id='n583' href='#n583'>583</a> <a id='n584' href='#n584'>584</a> <a id='n585' href='#n585'>585</a> <a id='n586' href='#n586'>586</a> <a id='n587' href='#n587'>587</a> <a id='n588' href='#n588'>588</a> <a id='n589' href='#n589'>589</a> <a id='n590' href='#n590'>590</a> <a id='n591' href='#n591'>591</a> <a id='n592' href='#n592'>592</a> <a id='n593' href='#n593'>593</a> <a id='n594' href='#n594'>594</a> <a id='n595' href='#n595'>595</a> <a id='n596' href='#n596'>596</a> <a id='n597' href='#n597'>597</a> <a id='n598' href='#n598'>598</a> <a id='n599' href='#n599'>599</a> <a id='n600' href='#n600'>600</a> <a id='n601' href='#n601'>601</a> <a id='n602' href='#n602'>602</a> <a id='n603' href='#n603'>603</a> <a id='n604' href='#n604'>604</a> <a id='n605' href='#n605'>605</a> <a id='n606' href='#n606'>606</a> <a id='n607' href='#n607'>607</a> <a id='n608' href='#n608'>608</a> <a id='n609' href='#n609'>609</a> <a id='n610' href='#n610'>610</a> <a id='n611' href='#n611'>611</a> <a id='n612' href='#n612'>612</a> <a id='n613' href='#n613'>613</a> <a id='n614' href='#n614'>614</a> <a id='n615' href='#n615'>615</a> <a id='n616' href='#n616'>616</a> <a id='n617' href='#n617'>617</a> <a id='n618' href='#n618'>618</a> <a id='n619' href='#n619'>619</a> <a id='n620' href='#n620'>620</a> <a id='n621' href='#n621'>621</a> <a id='n622' href='#n622'>622</a> <a id='n623' href='#n623'>623</a> <a id='n624' href='#n624'>624</a> <a id='n625' href='#n625'>625</a> <a id='n626' href='#n626'>626</a> <a id='n627' href='#n627'>627</a> <a id='n628' href='#n628'>628</a> <a id='n629' href='#n629'>629</a> <a id='n630' href='#n630'>630</a> <a id='n631' href='#n631'>631</a> <a id='n632' href='#n632'>632</a> <a id='n633' href='#n633'>633</a> <a id='n634' href='#n634'>634</a> <a id='n635' href='#n635'>635</a> <a id='n636' href='#n636'>636</a> <a id='n637' href='#n637'>637</a> <a id='n638' href='#n638'>638</a> <a id='n639' href='#n639'>639</a> <a id='n640' href='#n640'>640</a> <a id='n641' href='#n641'>641</a> <a id='n642' href='#n642'>642</a> <a id='n643' href='#n643'>643</a> <a id='n644' href='#n644'>644</a> <a id='n645' href='#n645'>645</a> <a id='n646' href='#n646'>646</a> <a id='n647' href='#n647'>647</a> <a id='n648' href='#n648'>648</a> <a id='n649' href='#n649'>649</a> <a id='n650' href='#n650'>650</a> <a id='n651' href='#n651'>651</a> <a id='n652' href='#n652'>652</a> <a id='n653' href='#n653'>653</a> <a id='n654' href='#n654'>654</a> <a id='n655' href='#n655'>655</a> <a id='n656' href='#n656'>656</a> <a id='n657' href='#n657'>657</a> <a id='n658' href='#n658'>658</a> <a id='n659' href='#n659'>659</a> <a id='n660' href='#n660'>660</a> <a id='n661' href='#n661'>661</a> <a id='n662' href='#n662'>662</a> <a id='n663' href='#n663'>663</a> <a id='n664' href='#n664'>664</a> <a id='n665' href='#n665'>665</a> <a id='n666' href='#n666'>666</a> <a id='n667' href='#n667'>667</a> <a id='n668' href='#n668'>668</a> <a id='n669' href='#n669'>669</a> <a id='n670' href='#n670'>670</a> <a id='n671' href='#n671'>671</a> <a id='n672' href='#n672'>672</a> <a id='n673' href='#n673'>673</a> <a id='n674' href='#n674'>674</a> <a id='n675' href='#n675'>675</a> <a id='n676' href='#n676'>676</a> <a id='n677' href='#n677'>677</a> <a id='n678' href='#n678'>678</a> <a id='n679' href='#n679'>679</a> <a id='n680' href='#n680'>680</a> <a id='n681' href='#n681'>681</a> <a id='n682' href='#n682'>682</a> <a id='n683' href='#n683'>683</a> <a id='n684' href='#n684'>684</a> <a id='n685' href='#n685'>685</a> <a id='n686' href='#n686'>686</a> <a id='n687' href='#n687'>687</a> <a id='n688' href='#n688'>688</a> <a id='n689' href='#n689'>689</a> <a id='n690' href='#n690'>690</a> <a id='n691' href='#n691'>691</a> <a id='n692' href='#n692'>692</a> <a id='n693' href='#n693'>693</a> <a id='n694' href='#n694'>694</a> <a id='n695' href='#n695'>695</a> <a id='n696' href='#n696'>696</a> <a id='n697' href='#n697'>697</a> <a id='n698' href='#n698'>698</a> <a id='n699' href='#n699'>699</a> <a id='n700' href='#n700'>700</a> <a id='n701' href='#n701'>701</a> <a id='n702' href='#n702'>702</a> <a id='n703' href='#n703'>703</a> <a id='n704' href='#n704'>704</a> <a id='n705' href='#n705'>705</a> <a id='n706' href='#n706'>706</a> <a id='n707' href='#n707'>707</a> <a id='n708' href='#n708'>708</a> <a id='n709' href='#n709'>709</a> <a id='n710' href='#n710'>710</a> <a id='n711' href='#n711'>711</a> <a id='n712' href='#n712'>712</a> <a id='n713' href='#n713'>713</a> <a id='n714' href='#n714'>714</a> <a id='n715' href='#n715'>715</a> <a id='n716' href='#n716'>716</a> <a id='n717' href='#n717'>717</a> <a id='n718' href='#n718'>718</a> <a id='n719' href='#n719'>719</a> <a id='n720' href='#n720'>720</a> <a id='n721' href='#n721'>721</a> <a id='n722' href='#n722'>722</a> <a id='n723' href='#n723'>723</a> <a id='n724' href='#n724'>724</a> <a id='n725' href='#n725'>725</a> <a id='n726' href='#n726'>726</a> <a id='n727' href='#n727'>727</a> <a id='n728' href='#n728'>728</a> <a id='n729' href='#n729'>729</a> <a id='n730' href='#n730'>730</a> <a id='n731' href='#n731'>731</a> <a id='n732' href='#n732'>732</a> <a id='n733' href='#n733'>733</a> <a id='n734' href='#n734'>734</a> <a id='n735' href='#n735'>735</a> <a id='n736' href='#n736'>736</a> <a id='n737' href='#n737'>737</a> <a id='n738' href='#n738'>738</a> <a id='n739' href='#n739'>739</a> <a id='n740' href='#n740'>740</a> <a id='n741' href='#n741'>741</a> <a id='n742' href='#n742'>742</a> <a id='n743' href='#n743'>743</a> <a id='n744' href='#n744'>744</a> <a id='n745' href='#n745'>745</a> <a id='n746' href='#n746'>746</a> <a id='n747' href='#n747'>747</a> <a id='n748' href='#n748'>748</a> <a id='n749' href='#n749'>749</a> <a id='n750' href='#n750'>750</a> <a id='n751' href='#n751'>751</a> <a id='n752' href='#n752'>752</a> <a id='n753' href='#n753'>753</a> <a id='n754' href='#n754'>754</a> <a id='n755' href='#n755'>755</a> <a id='n756' href='#n756'>756</a> <a id='n757' href='#n757'>757</a> <a id='n758' href='#n758'>758</a> <a id='n759' href='#n759'>759</a> <a id='n760' href='#n760'>760</a> <a id='n761' href='#n761'>761</a> <a id='n762' href='#n762'>762</a> <a id='n763' href='#n763'>763</a> <a id='n764' href='#n764'>764</a> <a id='n765' href='#n765'>765</a> <a id='n766' href='#n766'>766</a> <a id='n767' href='#n767'>767</a> <a id='n768' href='#n768'>768</a> <a id='n769' href='#n769'>769</a> <a id='n770' href='#n770'>770</a> <a id='n771' href='#n771'>771</a> <a id='n772' href='#n772'>772</a> <a id='n773' href='#n773'>773</a> <a id='n774' href='#n774'>774</a> <a id='n775' href='#n775'>775</a> <a id='n776' href='#n776'>776</a> <a id='n777' href='#n777'>777</a> <a id='n778' href='#n778'>778</a> <a id='n779' href='#n779'>779</a> <a id='n780' href='#n780'>780</a> <a id='n781' href='#n781'>781</a> <a id='n782' href='#n782'>782</a> <a id='n783' href='#n783'>783</a> <a id='n784' href='#n784'>784</a> <a id='n785' href='#n785'>785</a> <a id='n786' href='#n786'>786</a> <a id='n787' href='#n787'>787</a> <a id='n788' href='#n788'>788</a> <a id='n789' href='#n789'>789</a> <a id='n790' href='#n790'>790</a> <a id='n791' href='#n791'>791</a> <a id='n792' href='#n792'>792</a> <a id='n793' href='#n793'>793</a> <a id='n794' href='#n794'>794</a> <a id='n795' href='#n795'>795</a> <a id='n796' href='#n796'>796</a> <a id='n797' href='#n797'>797</a> <a id='n798' href='#n798'>798</a> <a id='n799' href='#n799'>799</a> <a id='n800' href='#n800'>800</a> <a id='n801' href='#n801'>801</a> <a id='n802' href='#n802'>802</a> <a id='n803' href='#n803'>803</a> <a id='n804' href='#n804'>804</a> <a id='n805' href='#n805'>805</a> <a id='n806' href='#n806'>806</a> <a id='n807' href='#n807'>807</a> <a id='n808' href='#n808'>808</a> <a id='n809' href='#n809'>809</a> <a id='n810' href='#n810'>810</a> <a id='n811' href='#n811'>811</a> <a id='n812' href='#n812'>812</a> <a id='n813' href='#n813'>813</a> <a id='n814' href='#n814'>814</a> <a id='n815' href='#n815'>815</a> <a id='n816' href='#n816'>816</a> <a id='n817' href='#n817'>817</a> <a id='n818' href='#n818'>818</a> <a id='n819' href='#n819'>819</a> <a id='n820' href='#n820'>820</a> <a id='n821' href='#n821'>821</a> <a id='n822' href='#n822'>822</a> <a id='n823' href='#n823'>823</a> <a id='n824' href='#n824'>824</a> <a id='n825' href='#n825'>825</a> <a id='n826' href='#n826'>826</a> <a id='n827' href='#n827'>827</a> <a id='n828' href='#n828'>828</a> <a id='n829' href='#n829'>829</a> <a id='n830' href='#n830'>830</a> <a id='n831' href='#n831'>831</a> <a id='n832' href='#n832'>832</a> <a id='n833' href='#n833'>833</a> <a id='n834' href='#n834'>834</a> <a id='n835' href='#n835'>835</a> <a id='n836' href='#n836'>836</a> <a id='n837' href='#n837'>837</a> <a id='n838' href='#n838'>838</a> <a id='n839' href='#n839'>839</a> <a id='n840' href='#n840'>840</a> <a id='n841' href='#n841'>841</a> <a id='n842' href='#n842'>842</a> <a id='n843' href='#n843'>843</a> <a id='n844' href='#n844'>844</a> <a id='n845' href='#n845'>845</a> <a id='n846' href='#n846'>846</a> <a id='n847' href='#n847'>847</a> <a id='n848' href='#n848'>848</a> <a id='n849' href='#n849'>849</a> <a id='n850' href='#n850'>850</a> <a id='n851' href='#n851'>851</a> <a id='n852' href='#n852'>852</a> <a id='n853' href='#n853'>853</a> <a id='n854' href='#n854'>854</a> <a id='n855' href='#n855'>855</a> <a id='n856' href='#n856'>856</a> <a id='n857' href='#n857'>857</a> <a id='n858' href='#n858'>858</a> <a id='n859' href='#n859'>859</a> <a id='n860' href='#n860'>860</a> <a id='n861' href='#n861'>861</a> <a id='n862' href='#n862'>862</a> <a id='n863' href='#n863'>863</a> <a id='n864' href='#n864'>864</a> <a id='n865' href='#n865'>865</a> <a id='n866' href='#n866'>866</a> <a id='n867' href='#n867'>867</a> <a id='n868' href='#n868'>868</a> <a id='n869' href='#n869'>869</a> <a id='n870' href='#n870'>870</a> <a id='n871' href='#n871'>871</a> <a id='n872' href='#n872'>872</a> <a id='n873' href='#n873'>873</a> <a id='n874' href='#n874'>874</a> <a id='n875' href='#n875'>875</a> <a id='n876' href='#n876'>876</a> <a id='n877' href='#n877'>877</a> <a id='n878' href='#n878'>878</a> <a id='n879' href='#n879'>879</a> <a id='n880' href='#n880'>880</a> <a id='n881' href='#n881'>881</a> <a id='n882' href='#n882'>882</a> <a id='n883' href='#n883'>883</a> <a id='n884' href='#n884'>884</a> <a id='n885' href='#n885'>885</a> <a id='n886' href='#n886'>886</a> <a id='n887' href='#n887'>887</a> <a id='n888' href='#n888'>888</a> <a id='n889' href='#n889'>889</a> <a id='n890' href='#n890'>890</a> <a id='n891' href='#n891'>891</a> <a id='n892' href='#n892'>892</a> <a id='n893' href='#n893'>893</a> <a id='n894' href='#n894'>894</a> <a id='n895' href='#n895'>895</a> <a id='n896' href='#n896'>896</a> <a id='n897' href='#n897'>897</a> <a id='n898' href='#n898'>898</a> <a id='n899' href='#n899'>899</a> <a id='n900' href='#n900'>900</a> <a id='n901' href='#n901'>901</a> <a id='n902' href='#n902'>902</a> <a id='n903' href='#n903'>903</a> <a id='n904' href='#n904'>904</a> <a id='n905' href='#n905'>905</a> <a id='n906' href='#n906'>906</a> <a id='n907' href='#n907'>907</a> <a id='n908' href='#n908'>908</a> <a id='n909' href='#n909'>909</a> <a id='n910' href='#n910'>910</a> <a id='n911' href='#n911'>911</a> <a id='n912' href='#n912'>912</a> <a id='n913' href='#n913'>913</a> <a id='n914' href='#n914'>914</a> <a id='n915' href='#n915'>915</a> <a id='n916' href='#n916'>916</a> <a id='n917' href='#n917'>917</a> <a id='n918' href='#n918'>918</a> <a id='n919' href='#n919'>919</a> <a id='n920' href='#n920'>920</a> <a id='n921' href='#n921'>921</a> <a id='n922' href='#n922'>922</a> <a id='n923' href='#n923'>923</a> <a id='n924' href='#n924'>924</a> <a id='n925' href='#n925'>925</a> <a id='n926' href='#n926'>926</a> <a id='n927' href='#n927'>927</a> <a id='n928' href='#n928'>928</a> <a id='n929' href='#n929'>929</a> <a id='n930' href='#n930'>930</a> <a id='n931' href='#n931'>931</a> <a id='n932' href='#n932'>932</a> <a id='n933' href='#n933'>933</a> <a id='n934' href='#n934'>934</a> <a id='n935' href='#n935'>935</a> <a id='n936' href='#n936'>936</a> <a id='n937' href='#n937'>937</a> <a id='n938' href='#n938'>938</a> <a id='n939' href='#n939'>939</a> <a id='n940' href='#n940'>940</a> <a id='n941' href='#n941'>941</a> <a id='n942' href='#n942'>942</a> <a id='n943' href='#n943'>943</a> <a id='n944' href='#n944'>944</a> <a id='n945' href='#n945'>945</a> <a id='n946' href='#n946'>946</a> <a id='n947' href='#n947'>947</a> <a id='n948' href='#n948'>948</a> <a id='n949' href='#n949'>949</a> <a id='n950' href='#n950'>950</a> <a id='n951' href='#n951'>951</a> <a id='n952' href='#n952'>952</a> <a id='n953' href='#n953'>953</a> <a id='n954' href='#n954'>954</a> <a id='n955' href='#n955'>955</a> <a id='n956' href='#n956'>956</a> <a id='n957' href='#n957'>957</a> <a id='n958' href='#n958'>958</a> <a id='n959' href='#n959'>959</a> <a id='n960' href='#n960'>960</a> <a id='n961' href='#n961'>961</a> <a id='n962' href='#n962'>962</a> <a id='n963' href='#n963'>963</a> <a id='n964' href='#n964'>964</a> <a id='n965' href='#n965'>965</a> <a id='n966' href='#n966'>966</a> <a id='n967' href='#n967'>967</a> <a id='n968' href='#n968'>968</a> <a id='n969' href='#n969'>969</a> <a id='n970' href='#n970'>970</a> <a id='n971' href='#n971'>971</a> <a id='n972' href='#n972'>972</a> <a id='n973' href='#n973'>973</a> <a id='n974' href='#n974'>974</a> <a id='n975' href='#n975'>975</a> <a id='n976' href='#n976'>976</a> <a id='n977' href='#n977'>977</a> <a id='n978' href='#n978'>978</a> <a id='n979' href='#n979'>979</a> <a id='n980' href='#n980'>980</a> <a id='n981' href='#n981'>981</a> <a id='n982' href='#n982'>982</a> <a id='n983' href='#n983'>983</a> <a id='n984' href='#n984'>984</a> <a id='n985' href='#n985'>985</a> <a id='n986' href='#n986'>986</a> <a id='n987' href='#n987'>987</a> <a id='n988' href='#n988'>988</a> <a id='n989' href='#n989'>989</a> <a id='n990' href='#n990'>990</a> <a id='n991' href='#n991'>991</a> <a id='n992' href='#n992'>992</a> <a id='n993' href='#n993'>993</a> <a id='n994' href='#n994'>994</a> <a id='n995' href='#n995'>995</a> <a id='n996' href='#n996'>996</a> <a id='n997' href='#n997'>997</a> <a id='n998' href='#n998'>998</a> <a id='n999' href='#n999'>999</a> <a id='n1000' href='#n1000'>1000</a> <a id='n1001' href='#n1001'>1001</a> <a id='n1002' href='#n1002'>1002</a> <a id='n1003' href='#n1003'>1003</a> <a id='n1004' href='#n1004'>1004</a> <a id='n1005' href='#n1005'>1005</a> <a id='n1006' href='#n1006'>1006</a> <a id='n1007' href='#n1007'>1007</a> <a id='n1008' href='#n1008'>1008</a> <a id='n1009' href='#n1009'>1009</a> <a id='n1010' href='#n1010'>1010</a> <a id='n1011' href='#n1011'>1011</a> <a id='n1012' href='#n1012'>1012</a> <a id='n1013' href='#n1013'>1013</a> <a id='n1014' href='#n1014'>1014</a> <a id='n1015' href='#n1015'>1015</a> <a id='n1016' href='#n1016'>1016</a> <a id='n1017' href='#n1017'>1017</a> <a id='n1018' href='#n1018'>1018</a> <a id='n1019' href='#n1019'>1019</a> <a id='n1020' href='#n1020'>1020</a> <a id='n1021' href='#n1021'>1021</a> <a id='n1022' href='#n1022'>1022</a> <a id='n1023' href='#n1023'>1023</a> <a id='n1024' href='#n1024'>1024</a> <a id='n1025' href='#n1025'>1025</a> <a id='n1026' href='#n1026'>1026</a> <a id='n1027' href='#n1027'>1027</a> <a id='n1028' href='#n1028'>1028</a> <a id='n1029' href='#n1029'>1029</a> <a id='n1030' href='#n1030'>1030</a> <a id='n1031' href='#n1031'>1031</a> <a id='n1032' href='#n1032'>1032</a> <a id='n1033' href='#n1033'>1033</a> <a id='n1034' href='#n1034'>1034</a> <a id='n1035' href='#n1035'>1035</a> <a id='n1036' href='#n1036'>1036</a> <a id='n1037' href='#n1037'>1037</a> <a id='n1038' href='#n1038'>1038</a> <a id='n1039' href='#n1039'>1039</a> <a id='n1040' href='#n1040'>1040</a> <a id='n1041' href='#n1041'>1041</a> <a id='n1042' href='#n1042'>1042</a> <a id='n1043' href='#n1043'>1043</a> <a id='n1044' href='#n1044'>1044</a> <a id='n1045' href='#n1045'>1045</a> <a id='n1046' href='#n1046'>1046</a> <a id='n1047' href='#n1047'>1047</a> <a id='n1048' href='#n1048'>1048</a> <a id='n1049' href='#n1049'>1049</a> <a id='n1050' href='#n1050'>1050</a> <a id='n1051' href='#n1051'>1051</a> <a id='n1052' href='#n1052'>1052</a> <a id='n1053' href='#n1053'>1053</a> <a id='n1054' href='#n1054'>1054</a> <a id='n1055' href='#n1055'>1055</a> <a id='n1056' href='#n1056'>1056</a> <a id='n1057' href='#n1057'>1057</a> <a id='n1058' href='#n1058'>1058</a> <a id='n1059' href='#n1059'>1059</a> <a id='n1060' href='#n1060'>1060</a> <a id='n1061' href='#n1061'>1061</a> <a id='n1062' href='#n1062'>1062</a> <a id='n1063' href='#n1063'>1063</a> <a id='n1064' href='#n1064'>1064</a> <a id='n1065' href='#n1065'>1065</a> <a id='n1066' href='#n1066'>1066</a> <a id='n1067' href='#n1067'>1067</a> <a id='n1068' href='#n1068'>1068</a> <a id='n1069' href='#n1069'>1069</a> <a id='n1070' href='#n1070'>1070</a> <a id='n1071' href='#n1071'>1071</a> <a id='n1072' href='#n1072'>1072</a> <a id='n1073' href='#n1073'>1073</a> <a id='n1074' href='#n1074'>1074</a> <a id='n1075' href='#n1075'>1075</a> <a id='n1076' href='#n1076'>1076</a> <a id='n1077' href='#n1077'>1077</a> <a id='n1078' href='#n1078'>1078</a> <a id='n1079' href='#n1079'>1079</a> <a id='n1080' href='#n1080'>1080</a> <a id='n1081' href='#n1081'>1081</a> <a id='n1082' href='#n1082'>1082</a> <a id='n1083' href='#n1083'>1083</a> <a id='n1084' href='#n1084'>1084</a> <a id='n1085' href='#n1085'>1085</a> <a id='n1086' href='#n1086'>1086</a> <a id='n1087' href='#n1087'>1087</a> <a id='n1088' href='#n1088'>1088</a> <a id='n1089' href='#n1089'>1089</a> <a id='n1090' href='#n1090'>1090</a> <a id='n1091' href='#n1091'>1091</a> <a id='n1092' href='#n1092'>1092</a> <a id='n1093' href='#n1093'>1093</a> <a id='n1094' href='#n1094'>1094</a> <a id='n1095' href='#n1095'>1095</a> <a id='n1096' href='#n1096'>1096</a> <a id='n1097' href='#n1097'>1097</a> <a id='n1098' href='#n1098'>1098</a> <a id='n1099' href='#n1099'>1099</a> <a id='n1100' href='#n1100'>1100</a> <a id='n1101' href='#n1101'>1101</a> <a id='n1102' href='#n1102'>1102</a> <a id='n1103' href='#n1103'>1103</a> <a id='n1104' href='#n1104'>1104</a> <a id='n1105' href='#n1105'>1105</a> </pre></td> <td class='lines'><pre><code><span class="hl kwa">package</span> install_steps_interactive<span class="hl opt">;</span> <span class="hl kwa">use</span> diagnostics<span class="hl opt">;</span> <span class="hl kwa">use</span> strict<span class="hl opt">;</span> <span class="hl kwa">use</span> vars <span class="hl str">qw(</span><span class="hl ipl">@ISA</span><span class="hl str">)</span><span class="hl opt">;</span> <span class="hl kwb">@ISA</span> <span class="hl opt">=</span> <span class="hl str">qw(install_steps)</span><span class="hl opt">;</span> <span class="hl slc">#-######################################################################################</span> <span class="hl slc">#- misc imports</span> <span class="hl slc">#-######################################################################################</span> <span class="hl kwa">use</span> common <span class="hl str">qw(:common :file :functional :system)</span><span class="hl opt">;</span> <span class="hl kwa">use</span> partition_table <span class="hl str">qw(:types)</span><span class="hl opt">;</span> <span class="hl kwa">use</span> install_steps<span class="hl opt">;</span> <span class="hl kwa">use</span> install_any<span class="hl opt">;</span> <span class="hl kwa">use</span> detect_devices<span class="hl opt">;</span> <span class="hl kwa">use</span> run_program<span class="hl opt">;</span> <span class="hl kwa">use</span> commands<span class="hl opt">;</span> <span class="hl kwa">use</span> devices<span class="hl opt">;</span> <span class="hl kwa">use</span> fsedit<span class="hl opt">;</span> <span class="hl kwa">use</span> network<span class="hl opt">;</span> <span class="hl kwa">use</span> raid<span class="hl opt">;</span> <span class="hl kwa">use</span> mouse<span class="hl opt">;</span> <span class="hl kwa">use</span> modules<span class="hl opt">;</span> <span class="hl kwa">use</span> lang<span class="hl opt">;</span> <span class="hl kwa">use</span> keyboard<span class="hl opt">;</span> <span class="hl kwa">use</span> fs<span class="hl opt">;</span> <span class="hl kwa">use</span> <span class="hl kwc">log</span><span class="hl opt">;</span> <span class="hl slc">#-######################################################################################</span> <span class="hl slc">#- In/Out Steps Functions</span> <span class="hl slc">#-######################################################################################</span> <span class="hl kwa">sub</span> errorInStep<span class="hl opt">(</span><span class="hl kwb">$$</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $err</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$err</span> <span class="hl opt">=~</span> <span class="hl kwd">s/ at .*?$/\./</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>testing<span class="hl opt">;</span> <span class="hl slc">#- avoid error message.</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Error"</span><span class="hl opt">), [</span> _<span class="hl opt">(</span><span class="hl str">"An error occurred"</span><span class="hl opt">),</span> <span class="hl kwb">$err</span> <span class="hl opt">]);</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> kill_action <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwc">kill</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl slc">#-######################################################################################</span> <span class="hl slc">#- Steps Functions</span> <span class="hl slc">#-######################################################################################</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> selectLanguage<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>lang<span class="hl opt">} =</span> lang<span class="hl opt">::</span>text2lang<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">"Language"</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Which language do you want?"</span><span class="hl opt">),</span> <span class="hl slc"># the translation may be used for the help</span> <span class="hl opt">[</span> lang<span class="hl opt">::</span>list<span class="hl opt">() ],</span> lang<span class="hl opt">::</span>lang2text<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>lang<span class="hl opt">})));</span> install_steps<span class="hl opt">::</span>selectLanguage<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl slc">#- $o->{useless_thing_accepted} = $o->ask_from_list_('', </span> <span class="hl slc">#-"Warning no warranty", </span> <span class="hl slc">#- [ __("Accept"), __("Refuse") ], "Accept") eq "Accept" or _exit(1) unless $o->{useless_thing_accepted};</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> selectKeyboard<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>keyboard<span class="hl opt">} =</span> keyboard<span class="hl opt">::</span>text2keyboard<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Keyboard"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"What is your keyboard layout?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> keyboard<span class="hl opt">::</span>list<span class="hl opt">() ],</span> keyboard<span class="hl opt">::</span>keyboard2text<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>keyboard<span class="hl opt">})));</span> <span class="hl kwc">delete</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>keyboard_unsafe<span class="hl opt">};</span> install_steps<span class="hl opt">::</span>selectKeyboard<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> selectPath<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>isUpgrade<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Install/Upgrade"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Is this an install or an upgrade?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> __<span class="hl opt">(</span><span class="hl str">"Install"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Upgrade"</span><span class="hl opt">) ],</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>isUpgrade<span class="hl opt">}</span> ? <span class="hl str">"Upgrade"</span> <span class="hl opt">:</span> <span class="hl str">"Install"</span><span class="hl opt">)</span> <span class="hl kwc">eq</span> <span class="hl str">"Upgrade"</span><span class="hl opt">;</span> install_steps<span class="hl opt">::</span>selectPath<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> selectRootPartition<span class="hl opt">(</span><span class="hl kwb">$@</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, @parts</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>upgradeRootPartition<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Root Partition"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"What is the root partition (/) of your system?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwb">@parts</span> <span class="hl opt">],</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>upgradeRootPartition<span class="hl opt">});</span> <span class="hl slc">#- TODO check choice, then mount partition in $o->{prefix} and autodetect.</span> <span class="hl slc">#- install_steps::selectRootPartition($o);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> selectInstallClass<span class="hl opt">(</span><span class="hl kwb">$@</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, @classes</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@c</span> <span class="hl opt">=</span> <span class="hl str">qw(beginner specific expert)</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">%c</span> <span class="hl opt">= (</span> beginner <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Recommended"</span><span class="hl opt">),</span> specific <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Customized"</span><span class="hl opt">),</span> expert <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Expert"</span><span class="hl opt">),</span> <span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$installClass</span> <span class="hl opt">= ${{</span><span class="hl kwc">reverse</span> <span class="hl kwb">%c</span><span class="hl opt">}}{</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Install Class"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"What installation class do you want?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$c</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">@c</span> <span class="hl opt">],</span> <span class="hl kwb">$c</span><span class="hl opt">{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>installClass<span class="hl opt">}} ||</span> <span class="hl kwb">$c</span><span class="hl opt">{</span>beginner<span class="hl opt">})};</span> <span class="hl opt">$::</span>expert <span class="hl opt">=</span> <span class="hl kwb">$installClass</span> <span class="hl kwc">eq</span> <span class="hl str">"expert"</span><span class="hl opt">;</span> <span class="hl opt">$::</span>beginner <span class="hl opt">=</span> <span class="hl kwb">$installClass</span> <span class="hl kwc">eq</span> <span class="hl str">"beginner"</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">($::</span>beginner<span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>installClass<span class="hl opt">} =</span> <span class="hl str">"normal"</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">%c</span> <span class="hl opt">= (</span> normal <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Normal"</span><span class="hl opt">),</span> developer <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Development"</span><span class="hl opt">),</span> server <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Server"</span><span class="hl opt">),</span> <span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>installClass<span class="hl opt">} = ${{</span><span class="hl kwc">reverse</span> <span class="hl kwb">%c</span><span class="hl opt">}}{</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Install Class"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"What usage do you want?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwc">values</span> <span class="hl kwb">%c</span> <span class="hl opt">],</span> <span class="hl kwb">$c</span><span class="hl opt">{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>installClass<span class="hl opt">}})};</span> <span class="hl opt">}</span> install_steps<span class="hl opt">::</span>selectInstallClass<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> selectMouse <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $force</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$name</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mouse<span class="hl opt">}{</span>FULLNAME<span class="hl opt">};</span> <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$name</span> <span class="hl opt">|| $::</span>expert <span class="hl opt">||</span> <span class="hl kwb">$force</span><span class="hl opt">) {</span> <span class="hl kwb">$name</span> <span class="hl opt">||=</span> <span class="hl str">"Generic Mouse (serial)"</span><span class="hl opt">;</span> <span class="hl kwb">$name</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"What is the type of your mouse?"</span><span class="hl opt">), [</span> mouse<span class="hl opt">::</span>names<span class="hl opt">() ],</span> <span class="hl kwb">$name</span><span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mouse<span class="hl opt">} =</span> mouse<span class="hl opt">::</span>name2mouse<span class="hl opt">(</span><span class="hl kwb">$name</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mouse<span class="hl opt">}{</span>XEMU3<span class="hl opt">} =</span> <span class="hl str">'yes'</span> <span class="hl kwa">if</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mouse<span class="hl opt">}{</span>nbuttons<span class="hl opt">} <</span> <span class="hl num">3</span><span class="hl opt">;</span> <span class="hl slc">#- if $o->{mouse}{nbuttons} < 3 && $o->ask_yesorno('', _("Emulate third button?"), 1);</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>mouse<span class="hl opt">}{</span>device<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">"ttyS"</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">'selectSerialPort'</span><span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mouse<span class="hl opt">}{</span>device<span class="hl opt">} =</span> mouse<span class="hl opt">::</span>serial_ports_names2dev<span class="hl opt">(</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Mouse Port"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Which serial port is your mouse connected to?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> mouse<span class="hl opt">::</span>serial_ports_names<span class="hl opt">() ]));</span> <span class="hl opt">}</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">setup_thiskind</span><span class="hl opt">(</span><span class="hl str">'serial_usb'</span><span class="hl opt">, !$::</span>expert<span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mouse<span class="hl opt">}{</span>device<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">"usbmouse"</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>selectMouse<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> setupSCSI <span class="hl opt">{</span> setup_thiskind<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">],</span> <span class="hl str">'scsi'</span><span class="hl opt">,</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">1</span><span class="hl opt">],</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">2</span><span class="hl opt">]) }</span> <span class="hl kwa">sub</span> ask_mntpoint_s <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $fstab</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@fstab</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> isExt2<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">) }</span> <span class="hl kwb">@$fstab</span><span class="hl opt">;</span> <span class="hl kwb">@fstab</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> isSwap<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">) }</span> <span class="hl kwb">@$fstab</span> <span class="hl kwa">if</span> <span class="hl kwb">@fstab</span> <span class="hl opt">==</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl slc"># @fstab = @$fstab if @fstab == 0;</span> <span class="hl kwc">die</span> _<span class="hl opt">(</span><span class="hl str">"no available partitions"</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">@fstab</span> <span class="hl opt">==</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$msg</span> <span class="hl opt">=</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl str">"</span><span class="hl ipl">$_</span><span class="hl str">->{device} "</span> <span class="hl opt">.</span> _<span class="hl opt">(</span><span class="hl str">"(</span><span class="hl ipl">%dMb</span><span class="hl str">)"</span><span class="hl opt">,</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>size<span class="hl opt">}</span> <span class="hl kwd">/ 1024 /</span> <span class="hl num">2</span><span class="hl opt">) };</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">@fstab</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span> <span class="hl kwb">$fstab</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]->{</span>mntpoint<span class="hl opt">} =</span> <span class="hl str">'/'</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">($::</span>beginner<span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">%l</span><span class="hl opt">;</span> <span class="hl kwb">$l</span><span class="hl opt">{&</span><span class="hl kwb">$msg</span><span class="hl opt">} =</span> <span class="hl kwb">$_</span> <span class="hl kwa">foreach</span> <span class="hl kwb">@fstab</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$e</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Which partition do you want to use as your root partition"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwc">sort keys</span> <span class="hl kwb">%l</span> <span class="hl opt">]);</span> <span class="hl opt">(</span>fsedit<span class="hl opt">::</span>get_root<span class="hl opt">(</span><span class="hl kwb">$fstab</span><span class="hl opt">) || {})->{</span>mntpoint<span class="hl opt">} =</span> <span class="hl str">''</span><span class="hl opt">;</span> <span class="hl kwb">$l</span><span class="hl opt">{</span><span class="hl kwb">$e</span><span class="hl opt">}{</span>mntpoint<span class="hl opt">} =</span> <span class="hl str">'/'</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_ref</span> <span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Choose the mount points"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{ &</span><span class="hl kwb">$msg</span> <span class="hl opt">}</span> <span class="hl kwb">@fstab</span> <span class="hl opt">],</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{ +{</span> val <span class="hl opt">=></span> \<span class="hl kwb">$_</span><span class="hl opt">->{</span>mntpoint<span class="hl opt">},</span> list <span class="hl opt">=> [</span> <span class="hl str">''</span><span class="hl opt">,</span> fsedit<span class="hl opt">::</span>suggestions_mntpoint<span class="hl opt">([]) ]</span> <span class="hl opt">} }</span> <span class="hl kwb">@fstab</span> <span class="hl opt">]);</span> <span class="hl opt">}</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>ask_mntpoint_s<span class="hl opt">(</span><span class="hl kwb">$fstab</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> rebootNeeded<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"You need to reboot for the partition table modifications to take place"</span><span class="hl opt">));</span> install_steps<span class="hl opt">::</span>rebootNeeded<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> choosePartitionsToFormat<span class="hl opt">(</span><span class="hl kwb">$$</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $fstab</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>choosePartitionsToFormat<span class="hl opt">(</span><span class="hl kwb">$fstab</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{ !</span><span class="hl kwb">$_</span><span class="hl opt">->{</span>isFormatted<span class="hl opt">} &&</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>mntpoint<span class="hl opt">} && !($::</span>beginner <span class="hl opt">&&</span> isSwap<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">)) }</span> <span class="hl kwb">@$fstab</span><span class="hl opt">;</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormat<span class="hl opt">} =</span> <span class="hl num">1</span> <span class="hl kwa">foreach</span> <span class="hl kwc">grep</span> <span class="hl opt">{ $::</span>beginner <span class="hl opt">&&</span> isSwap<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">) }</span> <span class="hl kwb">@$fstab</span><span class="hl opt">;</span> <span class="hl kwa">return if</span> <span class="hl opt">$::</span>beginner <span class="hl opt">&&</span> <span class="hl num">0</span> <span class="hl opt">==</span> <span class="hl kwc">grep</span> <span class="hl opt">{ !</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormat<span class="hl opt">} }</span> <span class="hl kwb">@l</span><span class="hl opt">;</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormat<span class="hl opt">} ||=</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormatUnsure<span class="hl opt">}</span> <span class="hl kwa">foreach</span> <span class="hl kwb">@l</span><span class="hl opt">;</span> <span class="hl kwc">log</span><span class="hl opt">::</span>l<span class="hl opt">(</span><span class="hl str">"preparing to format</span> <span class="hl ipl">$_</span><span class="hl str">->{mntpoint}"</span><span class="hl opt">)</span> <span class="hl kwa">foreach</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormat<span class="hl opt">} }</span> <span class="hl kwb">@l</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">%label</span><span class="hl opt">;</span> <span class="hl kwb">$label</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} = (</span>isSwap<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">)</span> ? type2name<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">->{</span>type<span class="hl opt">}) :</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>mntpoint<span class="hl opt">}) .</span> <span class="hl str">" (</span><span class="hl ipl">$_</span><span class="hl str">->{device})"</span> <span class="hl kwa">foreach</span> <span class="hl kwb">@l</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_many_from_list_ref</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Choose the partitions you want to format"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$label</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">@l</span> <span class="hl opt">],</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormat<span class="hl opt">} }</span> <span class="hl kwb">@l</span> <span class="hl opt">])</span> <span class="hl kwc">or die</span> <span class="hl str">"cancel"</span><span class="hl opt">;</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormat<span class="hl opt">} }</span> <span class="hl kwb">@l</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_many_from_list_ref</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Check bad blocks?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$label</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">@l</span> <span class="hl opt">],</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormatCheck<span class="hl opt">} }</span> <span class="hl kwb">@l</span> <span class="hl opt">])</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> <span class="hl opt">&</span>choosePartitionsToFormat <span class="hl kwa">if</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> formatPartitions <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">$o</span> <span class="hl opt">=</span> <span class="hl kwc">shift</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> <span class="hl str">''</span><span class="hl opt">);</span> <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">@_</span><span class="hl opt">) {</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">->{</span>toFormat<span class="hl opt">}) {</span> <span class="hl kwb">$w</span><span class="hl opt">-></span><span class="hl kwd">set</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Formatting partition</span> <span class="hl ipl">%s</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>device<span class="hl opt">}));</span> raid<span class="hl opt">::</span>format_part<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>raid<span class="hl opt">},</span> <span class="hl kwb">$_</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> setPackages <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Looking for available packages"</span><span class="hl opt">));</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>setPackages<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> selectPackagesToUpgrade <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Finding packages to upgrade"</span><span class="hl opt">));</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>selectPackagesToUpgrade<span class="hl opt">();</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> choosePackages <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $packages, $compss, $compssUsers, $compssUsersSorted, $first_time</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwa">require</span> pkgs<span class="hl opt">;</span> <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>isUpgrade<span class="hl opt">}) {</span> <span class="hl kwc">my</span> <span class="hl kwb">$available</span> <span class="hl opt">=</span> pkgs<span class="hl opt">::</span>invCorrectSize<span class="hl opt">(</span>install_any<span class="hl opt">::</span>getAvailableSpace<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) /</span> sqr<span class="hl opt">(</span><span class="hl num">1024</span><span class="hl opt">)) *</span> sqr<span class="hl opt">(</span><span class="hl num">1024</span><span class="hl opt">);</span> <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwc">values</span> <span class="hl kwb">%$packages</span><span class="hl opt">) {</span> <span class="hl kwc">delete</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>skip<span class="hl opt">};</span> <span class="hl kwc">delete</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>unskip<span class="hl opt">};</span> <span class="hl opt">}</span> pkgs<span class="hl opt">::</span>unselect_all<span class="hl opt">(</span><span class="hl kwb">$packages</span><span class="hl opt">);</span> pkgs<span class="hl opt">::</span><span class="hl kwc">select</span><span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>packages<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>packages<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">} ||</span> <span class="hl kwa">next</span><span class="hl opt">)</span> <span class="hl kwa">foreach</span> <span class="hl opt">@{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>default_packages<span class="hl opt">}};</span> pkgs<span class="hl opt">::</span>setSelectedFromCompssList<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>compssListLevels<span class="hl opt">},</span> <span class="hl kwb">$packages,</span> <span class="hl opt">$::</span>expert ? <span class="hl num">90</span> <span class="hl opt">:</span> <span class="hl num">80</span><span class="hl opt">,</span> <span class="hl kwb">$available, $o</span><span class="hl opt">->{</span>installClass<span class="hl opt">});</span> <span class="hl kwc">my</span> <span class="hl kwb">$min_size</span> <span class="hl opt">=</span> pkgs<span class="hl opt">::</span>size_selected<span class="hl opt">(</span><span class="hl kwb">$packages</span><span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">chooseGroups</span><span class="hl opt">(</span><span class="hl kwb">$packages, $compssUsers, $compssUsersSorted</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">%save_selected</span><span class="hl opt">;</span> <span class="hl kwb">$save_selected</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">->{</span>name<span class="hl opt">}} =</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>selected<span class="hl opt">}</span> <span class="hl kwa">foreach</span> <span class="hl kwc">values</span> <span class="hl kwb">%$packages</span><span class="hl opt">;</span> pkgs<span class="hl opt">::</span>setSelectedFromCompssList<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>compssListLevels<span class="hl opt">},</span> <span class="hl kwb">$packages,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">,</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>installClass<span class="hl opt">});</span> <span class="hl kwc">my</span> <span class="hl kwb">$max_size</span> <span class="hl opt">=</span> pkgs<span class="hl opt">::</span>size_selected<span class="hl opt">(</span><span class="hl kwb">$packages</span><span class="hl opt">);</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>selected<span class="hl opt">} =</span> <span class="hl kwb">$save_selected</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">->{</span>name<span class="hl opt">}}</span> <span class="hl kwa">foreach</span> <span class="hl kwc">values</span> <span class="hl kwb">%$packages</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>beginner <span class="hl opt">&&</span> <span class="hl kwb">$max_size</span> <span class="hl opt">></span> <span class="hl kwb">$available</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_okcancel</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"You need</span> <span class="hl ipl">%dMB</span> <span class="hl str">for a full install of the groups you selected.</span> <span class="hl str">You can go on anyway, but be warned that you won't get all packages"</span><span class="hl opt">,</span> <span class="hl kwb">$max_size</span> <span class="hl opt">/</span> sqr<span class="hl opt">(</span><span class="hl num">1024</span><span class="hl opt">)),</span> <span class="hl num">1</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> <span class="hl opt">&</span>choosePackages <span class="hl opt">}</span> <span class="hl kwc">my</span> <span class="hl kwb">$size2install</span> <span class="hl opt">= $::</span>beginner ? <span class="hl kwb">$available</span> <span class="hl opt">*</span> <span class="hl num">0.7</span> <span class="hl opt">:</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">chooseSizeToInstall</span><span class="hl opt">(</span><span class="hl kwb">$packages, $min_size,</span> min<span class="hl opt">(</span><span class="hl kwb">$max_size, $available</span><span class="hl opt">))</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> <span class="hl opt">&</span>choosePackages<span class="hl opt">;</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>packages_<span class="hl opt">}{</span>ind<span class="hl opt">}) =</span> pkgs<span class="hl opt">::</span>setSelectedFromCompssList<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>compssListLevels<span class="hl opt">},</span> <span class="hl kwb">$packages,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl kwb">$size2install, $o</span><span class="hl opt">->{</span>installClass<span class="hl opt">});</span> <span class="hl slc"># $_->{selected} and print "$_->{name}\n" foreach values %$packages;</span> <span class="hl opt">}</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">choosePackagesTree</span><span class="hl opt">(</span><span class="hl kwb">$packages, $compss</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> chooseSizeToInstall <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $packages, $min, $max</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> install_any<span class="hl opt">::</span>getAvailableSpace<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) *</span> <span class="hl num">0.7</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> choosePackagesTree <span class="hl opt">{}</span> <span class="hl kwa">sub</span> chooseGroups <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $packages, $compssUsers, $compssUsersSorted</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_many_from_list_ref</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Package Group Selection"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwb">@$compssUsersSorted,</span> <span class="hl str">"Miscellaneous"</span> <span class="hl opt">],</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$o</span><span class="hl opt">->{</span>compssUsersChoice<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">@$compssUsersSorted,</span> <span class="hl str">"Miscellaneous"</span> <span class="hl opt">]</span> <span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> <span class="hl opt">&</span>chooseGroups <span class="hl kwa">unless</span> <span class="hl opt">$::</span>beginner<span class="hl opt">;</span> <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>compssUsersChoice<span class="hl opt">}{</span>Miscellaneous<span class="hl opt">}) {</span> <span class="hl kwc">my</span> <span class="hl kwb">%l</span><span class="hl opt">;</span> <span class="hl kwb">$l</span><span class="hl opt">{@{</span><span class="hl kwb">$compssUsers</span><span class="hl opt">->{</span><span class="hl kwb">$_</span><span class="hl opt">}}} = ()</span> <span class="hl kwa">foreach</span> <span class="hl kwb">@$compssUsersSorted</span><span class="hl opt">;</span> <span class="hl kwc">exists</span> <span class="hl kwb">$l</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$packages</span><span class="hl opt">->{</span><span class="hl kwb">$_</span><span class="hl opt">}{</span>skip<span class="hl opt">} =</span> <span class="hl num">1</span> <span class="hl kwa">foreach</span> <span class="hl kwc">keys</span> <span class="hl kwb">%$packages</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">@$compssUsersSorted</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>compssUsersChoice<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">}</span> <span class="hl kwc">or</span> pkgs<span class="hl opt">::</span>skip_set<span class="hl opt">(</span><span class="hl kwb">$packages,</span> <span class="hl opt">@{</span><span class="hl kwb">$compssUsers</span><span class="hl opt">->{</span><span class="hl kwb">$_</span><span class="hl opt">}});</span> <span class="hl opt">}</span> <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">@$compssUsersSorted</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>compssUsersChoice<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwa">next</span><span class="hl opt">;</span> <span class="hl kwa">foreach</span> <span class="hl opt">(@{</span><span class="hl kwb">$compssUsers</span><span class="hl opt">->{</span><span class="hl kwb">$_</span><span class="hl opt">}}) {</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>unskip<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl kwc">delete</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>skip<span class="hl opt">};</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> installPackages <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $packages</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$current, $total</span><span class="hl opt">) =</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Installing"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Preparing installation"</span><span class="hl opt">));</span> <span class="hl kwc">my</span> <span class="hl kwb">$old</span> <span class="hl opt">=</span> \<span class="hl opt">&</span>pkgs<span class="hl opt">::</span>installCallback<span class="hl opt">;</span> <span class="hl kwc">local</span> <span class="hl opt">*</span>pkgs<span class="hl opt">::</span>installCallback <span class="hl opt">=</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">$m</span> <span class="hl opt">=</span> <span class="hl kwc">shift</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$m</span> <span class="hl opt">=~</span> <span class="hl kwd">/^Starting installation/</span><span class="hl opt">) {</span> <span class="hl kwb">$total</span> <span class="hl opt">=</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">1</span><span class="hl opt">];</span> <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$m</span> <span class="hl opt">=~</span> <span class="hl kwd">/^Starting installing package/</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">$name</span> <span class="hl opt">=</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">];</span> <span class="hl kwb">$w</span><span class="hl opt">-></span><span class="hl kwd">set</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Installing package</span> <span class="hl ipl">%s\n%d%%</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl kwb">$name, $total</span> <span class="hl opt">&&</span> <span class="hl num">100</span> <span class="hl opt">*</span> <span class="hl kwb">$current</span> <span class="hl opt">/</span> <span class="hl kwb">$total</span><span class="hl opt">));</span> <span class="hl kwb">$current</span> <span class="hl opt">+=</span> c<span class="hl opt">::</span>headerGetEntry<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>packages<span class="hl opt">}{</span><span class="hl kwb">$name</span><span class="hl opt">}{</span>header<span class="hl opt">},</span> <span class="hl str">'size'</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwc">unshift</span> <span class="hl kwb">@_, $m</span><span class="hl opt">;</span> <span class="hl kwa">goto</span> <span class="hl kwb">$old</span> <span class="hl opt">}</span> <span class="hl opt">};</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>installPackages<span class="hl opt">(</span><span class="hl kwb">$packages</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> afterInstallPackages<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Post install configuration"</span><span class="hl opt">));</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>afterInstallPackages<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> configureNetwork<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $first_time</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">local</span> <span class="hl kwb">$_</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>intf<span class="hl opt">}) {</span> <span class="hl kwa">if</span> <span class="hl opt">(!$::</span>beginner <span class="hl opt">&&</span> <span class="hl kwb">$first_time</span> <span class="hl opt">|| $::</span>expert<span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span> <span class="hl opt">= (</span> __<span class="hl opt">(</span><span class="hl str">"Keep the current IP configuration"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Reconfigure network now"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Do not set up networking"</span><span class="hl opt">),</span> <span class="hl opt">);</span> <span class="hl kwb">$_</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">([</span> _<span class="hl opt">(</span><span class="hl str">"Network Configuration"</span><span class="hl opt">) ],</span> _<span class="hl opt">(</span><span class="hl str">"Local networking has already been configured. Do you want to:"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwb">@l</span> <span class="hl opt">]) ||</span> <span class="hl str">"Do not"</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span> <span class="hl opt">=</span> <span class="hl str">"Keep"</span><span class="hl opt">; }</span> <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>modem<span class="hl opt">}) {</span> <span class="hl kwb">$_</span> <span class="hl opt">=</span> <span class="hl str">"Dialup"</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span> <span class="hl opt">= $::</span>beginner ? <span class="hl str">"Do not"</span> <span class="hl opt">:</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">([</span> _<span class="hl opt">(</span><span class="hl str">"Network Configuration"</span><span class="hl opt">) ],</span> _<span class="hl opt">(</span><span class="hl str">"Do you want to configure networking for your system?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> __<span class="hl opt">(</span><span class="hl str">"Local LAN"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Dialup with modem"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Do not set up networking"</span><span class="hl opt">) ]);</span> <span class="hl opt">}</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">/^Dialup/</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">pppConfig</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwd">/^Do not/</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>netc<span class="hl opt">}{</span>NETWORKING<span class="hl opt">} =</span> <span class="hl str">"false"</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(!</span><span class="hl kwd">/^Keep/</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">setup_thiskind</span><span class="hl opt">(</span><span class="hl str">'net'</span><span class="hl opt">, !$::</span>expert<span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> detect_devices<span class="hl opt">::</span>getNet<span class="hl opt">()</span> <span class="hl kwc">or die</span> _<span class="hl opt">(</span><span class="hl str">"no network card found"</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$last</span><span class="hl opt">;</span> <span class="hl kwa">foreach</span> <span class="hl opt">($::</span>beginner ? <span class="hl kwb">$l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">] :</span> <span class="hl kwb">@l</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">$intf</span> <span class="hl opt">=</span> network<span class="hl opt">::</span>findIntf<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>intf<span class="hl opt">} ||= [],</span> <span class="hl kwb">$_</span><span class="hl opt">);</span> add2hash<span class="hl opt">(</span><span class="hl kwb">$intf, $last</span><span class="hl opt">);</span> add2hash<span class="hl opt">(</span><span class="hl kwb">$intf,</span> <span class="hl opt">{</span> NETMASK <span class="hl opt">=></span> <span class="hl str">'255.255.255.0'</span> <span class="hl opt">});</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">configureNetworkIntf</span><span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>netc<span class="hl opt">} ||= {};</span> <span class="hl kwc">delete</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>netc<span class="hl opt">}{</span>dnsServer<span class="hl opt">};</span> <span class="hl kwc">delete</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>netc<span class="hl opt">}{</span>GATEWAY<span class="hl opt">};</span> <span class="hl kwb">$last</span> <span class="hl opt">=</span> <span class="hl kwb">$intf</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl slc">#- {</span> <span class="hl slc">#- my $wait = $o->wait_message(_("Hostname"), _("Determining host name and domain..."));</span> <span class="hl slc">#- network::guessHostname($o->{prefix}, $o->{netc}, $o->{intf});</span> <span class="hl slc">#- }</span> <span class="hl kwb">$last</span><span class="hl opt">->{</span>BOOTPROTO<span class="hl opt">} =~</span> <span class="hl kwd">/^(dhcp|bootp)$/</span> <span class="hl opt">||</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">configureNetworkNet</span><span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>netc<span class="hl opt">},</span> <span class="hl kwb">$last</span> <span class="hl opt">||= {},</span> <span class="hl kwb">@l</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl opt">}</span> install_steps<span class="hl opt">::</span>configureNetwork<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> configureNetworkIntf <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $intf</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$pump</span> <span class="hl opt">=</span> <span class="hl kwb">$intf</span><span class="hl opt">->{</span>BOOTPROTO<span class="hl opt">} =~</span> <span class="hl kwd">/^(dhcp|bootp)$/</span><span class="hl opt">;</span> <span class="hl kwc">delete</span> <span class="hl kwb">$intf</span><span class="hl opt">->{</span>NETWORK<span class="hl opt">};</span> <span class="hl kwc">delete</span> <span class="hl kwb">$intf</span><span class="hl opt">->{</span>BROADCAST<span class="hl opt">};</span> <span class="hl kwc">my</span> <span class="hl kwb">@fields</span> <span class="hl opt">=</span> <span class="hl str">qw(IPADDR NETMASK)</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">'configureNetworkIP'</span><span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_ref</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Configuring network device</span> <span class="hl ipl">%s</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl kwb">$intf</span><span class="hl opt">->{</span>DEVICE<span class="hl opt">}),</span> <span class="hl opt">($::</span>isStandalone ? <span class="hl str">''</span> <span class="hl opt">:</span> _<span class="hl opt">(</span><span class="hl str">"Configuring network device</span> <span class="hl ipl">%s</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl kwb">$intf</span><span class="hl opt">->{</span>DEVICE<span class="hl opt">}) .</span> <span class="hl str">"</span><span class="hl esc">\n\n</span><span class="hl str">"</span><span class="hl opt">) .</span> _<span class="hl opt">(</span><span class="hl str">"Please enter the IP configuration for this machine.</span> <span class="hl str">Each item should be entered as an IP address in dotted-decimal</span> <span class="hl str">notation (for example, 1.2.3.4)."</span><span class="hl opt">),</span> <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">"IP address:"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Netmask:"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Automatic IP"</span><span class="hl opt">) ],</span> <span class="hl opt">[</span> \<span class="hl kwb">$intf</span><span class="hl opt">->{</span>IPADDR<span class="hl opt">},</span> \<span class="hl kwb">$intf</span><span class="hl opt">->{</span>NETMASK<span class="hl opt">}, {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$pump,</span> type <span class="hl opt">=></span> <span class="hl str">"bool"</span><span class="hl opt">,</span> text <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"(bootp/dhcp)"</span><span class="hl opt">) } ],</span> complete <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$intf</span><span class="hl opt">->{</span>BOOTPROTO<span class="hl opt">} =</span> <span class="hl kwb">$pump</span> ? <span class="hl str">"dhcp"</span> <span class="hl opt">:</span> <span class="hl str">"static"</span><span class="hl opt">;</span> <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl kwb">$pump</span><span class="hl opt">;</span> <span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwc">my</span> <span class="hl kwb">$i</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwb">$i</span> <span class="hl opt"><</span> <span class="hl kwb">@fields</span><span class="hl opt">;</span> <span class="hl kwb">$i++</span><span class="hl opt">) {</span> <span class="hl kwa">unless</span> <span class="hl opt">(</span>network<span class="hl opt">::</span>is_ip<span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">->{</span><span class="hl kwb">$fields</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]})) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"IP address should be in format 1.2.3.4"</span><span class="hl opt">));</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl kwb">$i</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl opt">},</span> focus_out <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$intf</span><span class="hl opt">->{</span>NETMASK<span class="hl opt">} =</span> network<span class="hl opt">::</span>netmask<span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">->{</span>IPADDR<span class="hl opt">})</span> <span class="hl kwa">unless</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> <span class="hl opt">}</span> <span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> configureNetworkNet <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $netc, $intf, @devices</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$netc</span><span class="hl opt">->{</span>dnsServer<span class="hl opt">} ||=</span> network<span class="hl opt">::</span>dns<span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">->{</span>IPADDR<span class="hl opt">});</span> <span class="hl kwb">$netc</span><span class="hl opt">->{</span>GATEWAY<span class="hl opt">} ||=</span> network<span class="hl opt">::</span>gateway<span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">->{</span>IPADDR<span class="hl opt">});</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_ref</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Configuring network"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Please enter your host name.</span> <span class="hl str">Your host name should be a fully-qualified host name,</span> <span class="hl str">such as ``mybox.mylab.myco.com''.</span> <span class="hl str">You may also enter the IP address of the gateway if you have one"</span><span class="hl opt">),</span> <span class="hl opt">[</span>_<span class="hl opt">(</span><span class="hl str">"Host name:"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"DNS server:"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Gateway:"</span><span class="hl opt">), $::</span>expert ? _<span class="hl opt">(</span><span class="hl str">"Gateway device:"</span><span class="hl opt">) : ()],</span> <span class="hl opt">[(</span><span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$netc</span><span class="hl opt">->{</span><span class="hl kwb">$_</span><span class="hl opt">}}</span> <span class="hl str">qw(HOSTNAME dnsServer GATEWAY)</span><span class="hl opt">),</span> <span class="hl opt">{</span>val <span class="hl opt">=></span> \<span class="hl kwb">$netc</span><span class="hl opt">->{</span>GATEWAYDEV<span class="hl opt">},</span> list <span class="hl opt">=></span> \<span class="hl kwb">@devices</span><span class="hl opt">}]</span> <span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">miscellaneousNetwork</span><span class="hl opt">();</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> pppConfig <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$m</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>modem<span class="hl opt">} ||= {};</span> <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$m</span><span class="hl opt">->{</span>device<span class="hl opt">} || $::</span>expert <span class="hl opt">&& !</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Try to find a modem?"</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">)) {</span> <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">.</span><span class="hl num">.3</span><span class="hl opt">) {</span> <span class="hl kwa">next if</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mouse<span class="hl opt">}{</span>device<span class="hl opt">} =~</span> <span class="hl kwd">/ttyS$_/</span><span class="hl opt">;</span> detect_devices<span class="hl opt">::</span>hasModem<span class="hl opt">(</span><span class="hl str">"</span><span class="hl ipl">$o</span><span class="hl str">->{prefix}/dev/ttyS</span><span class="hl ipl">$_</span><span class="hl str">"</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwb">$m</span><span class="hl opt">->{</span>device<span class="hl opt">} =</span> <span class="hl str">"ttyS</span><span class="hl ipl">$_</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl kwa">last</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl kwb">$m</span><span class="hl opt">->{</span>device<span class="hl opt">} ||=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">'selectSerialPort'</span><span class="hl opt">) &&</span> mouse<span class="hl opt">::</span>serial_ports_names2dev<span class="hl opt">(</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Which serial port is your modem connected to?"</span><span class="hl opt">),</span> <span class="hl opt">[</span> mouse<span class="hl opt">::</span>serial_ports_names <span class="hl opt">]));</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">'configureNetworkISP'</span><span class="hl opt">);</span> install_steps<span class="hl opt">::</span>pppConfig<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Dialup options"</span><span class="hl opt">), [</span> _<span class="hl opt">(</span><span class="hl str">"Connection name"</span><span class="hl opt">) =></span> \<span class="hl kwb">$m</span><span class="hl opt">->{</span>connection<span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Phone number"</span><span class="hl opt">) =></span> \<span class="hl kwb">$m</span><span class="hl opt">->{</span>phone<span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Login ID"</span><span class="hl opt">) =></span> \<span class="hl kwb">$m</span><span class="hl opt">->{</span>login<span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Password"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$m</span><span class="hl opt">->{</span>passwd<span class="hl opt">},</span> hidden <span class="hl opt">=></span> <span class="hl num">1</span> <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Authentication"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$m</span><span class="hl opt">->{</span>auth<span class="hl opt">},</span> list <span class="hl opt">=> [</span> __<span class="hl opt">(</span><span class="hl str">"PAP"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"CHAP"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Terminal-based"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Script-based"</span><span class="hl opt">) ] },</span> _<span class="hl opt">(</span><span class="hl str">"Domain name"</span><span class="hl opt">) =></span> \<span class="hl kwb">$m</span><span class="hl opt">->{</span>domain<span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"First DNS Server"</span><span class="hl opt">) =></span> \<span class="hl kwb">$m</span><span class="hl opt">->{</span>dns1<span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Second DNS Server"</span><span class="hl opt">) =></span> \<span class="hl kwb">$m</span><span class="hl opt">->{</span>dns2<span class="hl opt">},</span> <span class="hl opt">]);</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">miscellaneousNetwork</span><span class="hl opt">();</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> installCrypto <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$u</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>crypto<span class="hl opt">} ||= {};</span> <span class="hl opt">$::</span>expert <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>intf<span class="hl opt">} &&</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>netc<span class="hl opt">}{</span>NETWORKING<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">'false'</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Bringing up the network"</span><span class="hl opt">));</span> network<span class="hl opt">::</span>up_it<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>prefix<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>intf<span class="hl opt">});</span> <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>modem<span class="hl opt">}) {</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>prefix<span class="hl opt">},</span> <span class="hl str">"ifup"</span><span class="hl opt">,</span> <span class="hl str">"ppp0"</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl opt">}</span> is_empty_hash_ref<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"You have now the possibility to download software aimed for encryption.</span> <span class="hl str"></span> <span class="hl str">WARNING:</span> <span class="hl str"></span> <span class="hl str">Due to different general requirements applicable to these software and imposed</span> <span class="hl str">by various jurisdictions, customer and/or end user of theses software should</span> <span class="hl str">ensure that the laws of his/their jurisdiction allow him/them to download, stock</span> <span class="hl str">and/or use these software.</span> <span class="hl str"></span> <span class="hl str">In addition customer and/or end user shall particularly be aware to not infringe</span> <span class="hl str">the laws of his/their jurisdiction. Should customer and/or end user do not</span> <span class="hl str">respect the provision of these applicable laws, he/they will incur serious</span> <span class="hl str">sanctions.</span> <span class="hl str"></span> <span class="hl str">In no event shall Mandrakesoft nor its manufacturers and/or suppliers be liable</span> <span class="hl str">for special, indirect or incidental damages whatsoever (including, but not</span> <span class="hl str">limited to loss of profits, business interruption, loss of commercial data and</span> <span class="hl str">other pecuniary losses, and eventual liabilities and indemnification to be paid</span> <span class="hl str">pursuant to a court decision) arising out of use, possession, or the sole</span> <span class="hl str">downloading of these software, to which customer and/or end user could</span> <span class="hl str">eventually have access after having sign up the present agreement.</span> <span class="hl str"></span> <span class="hl str"></span> <span class="hl str">For any queries relating to these agreement, please contact </span> <span class="hl str">Mandrakesoft, Inc.</span> <span class="hl str">2400 N. Lincoln Avenue Suite 243</span> <span class="hl str">Altadena California 91001</span> <span class="hl str">USA"</span><span class="hl opt">)) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwa">require</span> crypto<span class="hl opt">;</span> <span class="hl kwc">eval</span> <span class="hl opt">{</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>mirror<span class="hl opt">} =</span> crypto<span class="hl opt">::</span>text2mirror<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Choose a mirror from which to get the packages"</span><span class="hl opt">), [</span> crypto<span class="hl opt">::</span>mirrorstext<span class="hl opt">() ],</span> crypto<span class="hl opt">::</span>mirror2text<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">->{</span>mirror<span class="hl opt">})));</span> <span class="hl opt">};</span> <span class="hl kwa">return if</span> <span class="hl kwb">$@</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@packages</span> <span class="hl opt">=</span> <span class="hl kwa">do</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Contacting the mirror to get the list of available packages"</span><span class="hl opt">));</span> crypto<span class="hl opt">::</span>packages<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">->{</span>mirror<span class="hl opt">});</span> <span class="hl opt">};</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_many_from_list_ref</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Which packages do you want to install"</span><span class="hl opt">),</span> \<span class="hl kwb">@packages,</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>packages<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">@packages</span> <span class="hl opt">])</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Downloading cryptographic packages"</span><span class="hl opt">));</span> install_steps<span class="hl opt">::</span>installCrypto<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> timeConfig <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $f, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwa">require</span> timezone<span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>timezone<span class="hl opt">}{</span>timezone<span class="hl opt">} ||=</span> timezone<span class="hl opt">::</span>bestTimezone<span class="hl opt">(</span>lang<span class="hl opt">::</span>lang2text<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>lang<span class="hl opt">}));</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>timezone<span class="hl opt">}{</span>timezone<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Which is your timezone?"</span><span class="hl opt">), [</span> timezone<span class="hl opt">::</span>getTimeZones<span class="hl opt">($::</span>g_auto_install ? <span class="hl str">''</span> <span class="hl opt">:</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>prefix<span class="hl opt">}) ],</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>timezone<span class="hl opt">}{</span>timezone<span class="hl opt">});</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>timezone<span class="hl opt">}{</span>UTC<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Is your hardware clock set to GMT?"</span><span class="hl opt">),</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>timezone<span class="hl opt">}{</span>UTC<span class="hl opt">})</span> <span class="hl kwa">if</span> <span class="hl opt">$::</span>expert <span class="hl opt">||</span> <span class="hl kwb">$clicked</span><span class="hl opt">;</span> install_steps<span class="hl opt">::</span>timeConfig<span class="hl opt">(</span><span class="hl kwb">$o,$f</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl slc">#-sub servicesConfig {}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> printerConfig<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>printer<span class="hl opt">}{</span>want<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"Printer"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Would you like to configure a printer?"</span><span class="hl opt">),</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>printer<span class="hl opt">}{</span>want<span class="hl opt">});</span> <span class="hl kwa">return if</span> <span class="hl opt">!</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>printer<span class="hl opt">}{</span>want<span class="hl opt">};</span> <span class="hl kwa">require</span> printerdrake<span class="hl opt">;</span> printerdrake<span class="hl opt">::</span>main<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>prefix<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>printer<span class="hl opt">},</span> <span class="hl kwb">$o,</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> install_any<span class="hl opt">::</span>pkg_install<span class="hl opt">(</span><span class="hl kwb">$o, $_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]) });</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> setRootPassword<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$sup</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>superuser<span class="hl opt">} ||= {};</span> <span class="hl kwb">$sup</span><span class="hl opt">->{</span>password2<span class="hl opt">} ||=</span> <span class="hl kwb">$sup</span><span class="hl opt">->{</span>password<span class="hl opt">} ||=</span> <span class="hl str">""</span><span class="hl opt">;</span> <span class="hl kwa">return if</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} <</span> <span class="hl num">1</span> <span class="hl opt">&& !</span><span class="hl kwb">$clicked</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">"setRootPassword"</span><span class="hl opt">,</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>installClass<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">"server"</span> <span class="hl opt">|| $::</span>expert ? <span class="hl str">"setRootPasswordMd5"</span> <span class="hl opt">: (),</span> <span class="hl opt">$::</span>beginner ? <span class="hl opt">() :</span> <span class="hl str">"setRootPasswordNIS"</span><span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">([</span>_<span class="hl opt">(</span><span class="hl str">"Set root password"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Ok"</span><span class="hl opt">),</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} ></span> <span class="hl num">2</span> ? <span class="hl opt">() :</span> _<span class="hl opt">(</span><span class="hl str">"No password"</span><span class="hl opt">)],</span> _<span class="hl opt">(</span><span class="hl str">"Set root password"</span><span class="hl opt">), [</span> _<span class="hl opt">(</span><span class="hl str">"Password"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$sup</span><span class="hl opt">->{</span>password<span class="hl opt">},</span> hidden <span class="hl opt">=></span> <span class="hl num">1</span> <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Password (again)"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$sup</span><span class="hl opt">->{</span>password2<span class="hl opt">},</span> hidden <span class="hl opt">=></span> <span class="hl num">1</span> <span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>installClass<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">"server"</span> <span class="hl opt">|| $::</span>expert ? <span class="hl opt">(</span> _<span class="hl opt">(</span><span class="hl str">"Use shadow file"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$o</span><span class="hl opt">->{</span>authentication<span class="hl opt">}{</span>shadow<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span><span class="hl opt">,</span> text <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"shadow"</span><span class="hl opt">) },</span> _<span class="hl opt">(</span><span class="hl str">"Use MD5 passwords"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$o</span><span class="hl opt">->{</span>authentication<span class="hl opt">}{</span>md5<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span><span class="hl opt">,</span> text <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"MD5"</span><span class="hl opt">) },</span> <span class="hl opt">) : (), $::</span>beginner ? <span class="hl opt">() : (</span> _<span class="hl opt">(</span><span class="hl str">"Use NIS"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$o</span><span class="hl opt">->{</span>authentication<span class="hl opt">}{</span>NIS<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span><span class="hl opt">,</span> text <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"yellow pages"</span><span class="hl opt">) },</span> <span class="hl opt">)</span> <span class="hl opt">],</span> complete <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$sup</span><span class="hl opt">->{</span>password<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$sup</span><span class="hl opt">->{</span>password2<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">, [</span> _<span class="hl opt">(</span><span class="hl str">"The passwords do not match"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Please try again"</span><span class="hl opt">) ]),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">1</span><span class="hl opt">);</span> <span class="hl kwc">length</span> <span class="hl kwb">$sup</span><span class="hl opt">->{</span>password<span class="hl opt">} <</span> <span class="hl num">2</span> <span class="hl opt">*</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">}</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"This password is too simple (must be at least</span> <span class="hl ipl">%d</span> <span class="hl str">characters long)"</span><span class="hl opt">,</span> <span class="hl num">2</span> <span class="hl opt">*</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">})),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">);</span> <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl opt">}</span> <span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>authentication<span class="hl opt">}{</span>NIS<span class="hl opt">}) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_ref</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Authentification NIS"</span><span class="hl opt">),</span> <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">"NIS Domain"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"NIS Server"</span><span class="hl opt">) ],</span> <span class="hl opt">[</span> \ <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>netc<span class="hl opt">}{</span>NISDOMAIN<span class="hl opt">} ||=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>netc<span class="hl opt">}{</span>DOMAINNAME<span class="hl opt">}),</span> <span class="hl opt">{</span> val <span class="hl opt">=></span> \<span class="hl kwb">$o</span><span class="hl opt">->{</span>authentication<span class="hl opt">}{</span>NIS_server<span class="hl opt">},</span> list <span class="hl opt">=> [</span><span class="hl str">"broadcast"</span><span class="hl opt">] },</span> <span class="hl opt">]);</span> <span class="hl opt">}</span> install_steps<span class="hl opt">::</span>setRootPassword<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl slc">#-addUser</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> addUser<span class="hl opt">($) {</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$u</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>user<span class="hl opt">} ||=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} <</span> <span class="hl num">1</span> ? <span class="hl opt">{</span> name <span class="hl opt">=></span> <span class="hl str">"mandrake"</span><span class="hl opt">,</span> realname <span class="hl opt">=></span> <span class="hl str">"default"</span> <span class="hl opt">} : {};</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>password2<span class="hl opt">} ||=</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>password<span class="hl opt">} ||=</span> <span class="hl str">""</span><span class="hl opt">;</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>shell<span class="hl opt">} ||=</span> <span class="hl str">"/bin/bash"</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@fields</span> <span class="hl opt">=</span> <span class="hl str">qw(realname name password password2)</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@shells</span> <span class="hl opt">=</span> install_any<span class="hl opt">::</span>shells<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} <</span> <span class="hl num">2</span> <span class="hl opt">&& !</span><span class="hl kwb">$clicked</span> <span class="hl opt">||</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span> <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">"Add user"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Accept user"</span><span class="hl opt">),</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} ></span> <span class="hl num">4</span> <span class="hl opt">&& !@{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>users<span class="hl opt">}}</span> ? <span class="hl opt">() :</span> _<span class="hl opt">(</span><span class="hl str">"Done"</span><span class="hl opt">) ],</span> _<span class="hl opt">(</span><span class="hl str">"Enter a user</span><span class="hl esc">\n</span><span class="hl str"></span><span class="hl ipl">%s</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>users<span class="hl opt">}</span> ? _<span class="hl opt">(</span><span class="hl str">"(already added</span> <span class="hl ipl">%s</span><span class="hl str">)"</span><span class="hl opt">,</span> <span class="hl kwc">join</span><span class="hl opt">(</span><span class="hl str">", "</span><span class="hl opt">,</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>realname<span class="hl opt">} ||</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>name<span class="hl opt">} } @{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>users<span class="hl opt">}})) :</span> <span class="hl str">''</span><span class="hl opt">),</span> <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">"Real name"</span><span class="hl opt">) =></span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>realname<span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"User name"</span><span class="hl opt">) =></span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>name<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} <</span> <span class="hl num">2</span> ? <span class="hl opt">() : (</span> _<span class="hl opt">(</span><span class="hl str">"Password"</span><span class="hl opt">) => {</span>val <span class="hl opt">=></span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>password<span class="hl opt">},</span> hidden <span class="hl opt">=></span> <span class="hl num">1</span><span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Password (again)"</span><span class="hl opt">) => {</span>val <span class="hl opt">=></span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>password2<span class="hl opt">},</span> hidden <span class="hl opt">=></span> <span class="hl num">1</span><span class="hl opt">},</span> <span class="hl opt">), $::</span>beginner ? <span class="hl opt">() : (</span> _<span class="hl opt">(</span><span class="hl str">"Shell"</span><span class="hl opt">) => {</span>val <span class="hl opt">=></span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>shell<span class="hl opt">},</span> list <span class="hl opt">=></span> \<span class="hl kwb">@shells,</span> not_edit <span class="hl opt">=> !$::</span>expert<span class="hl opt">}</span> <span class="hl opt">),</span> <span class="hl opt">],</span> focus_out <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> <span class="hl kwc">eq</span> <span class="hl num">0</span><span class="hl opt">) {</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>name<span class="hl opt">} ||=</span> <span class="hl kwc">lc</span> first<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">->{</span>realname<span class="hl opt">} =~</span> <span class="hl kwd">/((\w|-)+)/</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl opt">},</span> complete <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>password<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>password2<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">, [</span> _<span class="hl opt">(</span><span class="hl str">"The passwords do not match"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Please try again"</span><span class="hl opt">) ]),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">3</span><span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} ></span> <span class="hl num">3</span> <span class="hl opt">&&</span> <span class="hl kwc">length</span><span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">->{</span>password<span class="hl opt">}) <</span> <span class="hl num">6</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"This password is too simple"</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">2</span><span class="hl opt">);</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>name<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Please give a user name"</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">);</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>name<span class="hl opt">} =~</span> <span class="hl kwd">/^[a-z0-9_-]+$/</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"The user name must contain only lower cased letters, numbers, `-' and `_'"</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">);</span> member<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">->{</span>name<span class="hl opt">},</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>name<span class="hl opt">} } @{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>users<span class="hl opt">}})</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"This user name is already added"</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">);</span> <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl opt">},</span> <span class="hl opt">)) {</span> <span class="hl kwc">push</span> <span class="hl opt">@{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>users<span class="hl opt">}},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>user<span class="hl opt">};</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>user<span class="hl opt">} = {};</span> <span class="hl kwa">goto</span> <span class="hl opt">&</span>addUser <span class="hl kwa">unless</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} <</span> <span class="hl num">2</span> <span class="hl opt">&& !</span><span class="hl kwb">$clicked</span><span class="hl opt">;</span> <span class="hl slc">#- INFO_TO_DEL: bad security level may cause deadlocks...</span> <span class="hl opt">}</span> install_steps<span class="hl opt">::</span>addUser<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> createBootdisk <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $first_time</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> detect_devices<span class="hl opt">::</span>floppies<span class="hl opt">();</span> <span class="hl kwc">my</span> <span class="hl kwb">%l</span> <span class="hl opt">= (</span> <span class="hl str">'fd0'</span> <span class="hl opt">=></span> __<span class="hl opt">(</span><span class="hl str">"First drive"</span><span class="hl opt">),</span> <span class="hl str">'fd1'</span> <span class="hl opt">=></span> __<span class="hl opt">(</span><span class="hl str">"Second drive"</span><span class="hl opt">),</span> <span class="hl str">'Skip'</span> <span class="hl opt">=></span> __<span class="hl opt">(</span><span class="hl str">"Skip"</span><span class="hl opt">),</span> <span class="hl opt">);</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$first_time</span> <span class="hl opt">||</span> <span class="hl kwb">@l</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"A custom bootdisk provides a way of booting into your Linux system without</span> <span class="hl str">depending on the normal bootloader. This is useful if you don't want to install</span> <span class="hl str">LILO on your system, or another operating system removes LILO, or LILO doesn't</span> <span class="hl str">work with your hardware configuration. A custom bootdisk can also be used with</span> <span class="hl str">the Mandrake rescue image, making it much easier to recover from severe system</span> <span class="hl str">failures. Would you like to create a bootdisk for your system?"</span><span class="hl opt">),</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">})</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">} =</span> <span class="hl str">''</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">} =</span> <span class="hl kwb">$l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">} ||</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">"1"</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">@l</span> <span class="hl kwc">or die</span> _<span class="hl opt">(</span><span class="hl str">"Sorry, no floppy drive available"</span><span class="hl opt">);</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">} = ${{</span><span class="hl kwc">reverse</span> <span class="hl kwb">%l</span><span class="hl opt">}}{</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Choose the floppy drive you want to use to make the bootdisk"</span><span class="hl opt">),</span> <span class="hl opt">[</span> <span class="hl kwb">@l</span><span class="hl opt">{</span><span class="hl kwb">@l,</span> <span class="hl str">"Skip"</span><span class="hl opt">} ],</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">})};</span> <span class="hl kwa">return</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">} =</span> <span class="hl str">''</span> <span class="hl kwa">if</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">'Skip'</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Insert a floppy in drive</span> <span class="hl ipl">%s</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>mkbootdisk<span class="hl opt">}));</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Creating bootdisk"</span><span class="hl opt">));</span> install_steps<span class="hl opt">::</span>createBootdisk<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> setupBootloaderBefore <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Preparing bootloader"</span><span class="hl opt">));</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>setupBootloaderBefore<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> setupBootloader <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $more</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$b</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>bootloader<span class="hl opt">};</span> <span class="hl kwb">$more++</span> <span class="hl kwa">if</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>bootUnsafe<span class="hl opt">};</span> <span class="hl kwa">if</span> <span class="hl opt">($::</span>beginner <span class="hl opt">&&</span> <span class="hl kwb">$more</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span> <span class="hl opt">= (</span>__<span class="hl opt">(</span><span class="hl str">"First sector of drive (MBR)"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"First sector of boot partition"</span><span class="hl opt">));</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">'setupBootloaderBeginner'</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$boot</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>hds<span class="hl opt">}[</span><span class="hl num">0</span><span class="hl opt">]{</span>device<span class="hl opt">};</span> <span class="hl kwc">my</span> <span class="hl kwb">$onmbr</span> <span class="hl opt">=</span> <span class="hl str">"/dev/</span><span class="hl ipl">$boot</span><span class="hl str">"</span> <span class="hl kwc">eq</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>boot<span class="hl opt">};</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>boot<span class="hl opt">} =</span> <span class="hl str">"/dev/"</span> <span class="hl opt">. (</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">"LILO Installation"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Where do you want to install the bootloader?"</span><span class="hl opt">),</span> \<span class="hl kwb">@l, $l</span><span class="hl opt">[!</span><span class="hl kwb">$onmbr</span><span class="hl opt">])</span> <span class="hl kwc">eq</span> <span class="hl kwb">$l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> ? <span class="hl kwb">$boot</span> <span class="hl opt">:</span> fsedit<span class="hl opt">::</span>get_root<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>fstab<span class="hl opt">},</span> <span class="hl str">'boot'</span><span class="hl opt">)->{</span>device<span class="hl opt">});</span> <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$more</span> <span class="hl opt">|| !$::</span>beginner<span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">"setupBootloaderGeneral"</span><span class="hl opt">);</span> <span class="hl opt">$::</span>expert <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Do you want to use LILO?"</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span> <span class="hl opt">= (</span> _<span class="hl opt">(</span><span class="hl str">"Boot device"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$b</span><span class="hl opt">->{</span>boot<span class="hl opt">},</span> list <span class="hl opt">=> [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl str">"/dev/</span><span class="hl ipl">$_</span><span class="hl str">"</span> <span class="hl opt">} (</span><span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>device<span class="hl opt">} } @{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>hds<span class="hl opt">}}, @{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>fstab<span class="hl opt">}}),</span> detect_devices<span class="hl opt">::</span>floppies <span class="hl opt">],</span> not_edit <span class="hl opt">=> !$::</span>expert <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Linear (needed for some SCSI drives)"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$b</span><span class="hl opt">->{</span>linear<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">"bool"</span><span class="hl opt">,</span> text <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"linear"</span><span class="hl opt">) },</span> _<span class="hl opt">(</span><span class="hl str">"Compact"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$b</span><span class="hl opt">->{</span>compact<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">"bool"</span><span class="hl opt">,</span> text <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"compact"</span><span class="hl opt">) },</span> _<span class="hl opt">(</span><span class="hl str">"Delay before booting default image"</span><span class="hl opt">) =></span> \<span class="hl kwb">$b</span><span class="hl opt">->{</span>timeout<span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Video mode"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$b</span><span class="hl opt">->{</span>vga<span class="hl opt">},</span> list <span class="hl opt">=> [</span> <span class="hl kwc">keys</span> <span class="hl kwb">%lilo</span><span class="hl opt">::</span>vga_modes <span class="hl opt">],</span> not_edit <span class="hl opt">=> $::</span>beginner <span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} <</span> <span class="hl num">4</span> ? <span class="hl opt">() : (</span> _<span class="hl opt">(</span><span class="hl str">"Password"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$b</span><span class="hl opt">->{</span>password<span class="hl opt">},</span> hidden <span class="hl opt">=></span> <span class="hl num">1</span> <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Password (again)"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$b</span><span class="hl opt">->{</span>password2<span class="hl opt">},</span> hidden <span class="hl opt">=></span> <span class="hl num">1</span> <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Restrict command line options"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$b</span><span class="hl opt">->{</span>restricted<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">"bool"</span><span class="hl opt">,</span> text <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"restrict"</span><span class="hl opt">) },</span> <span class="hl opt">)</span> <span class="hl opt">);</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> <span class="hl kwb">@l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">.</span><span class="hl num">.3</span><span class="hl opt">]</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>vga<span class="hl opt">} ||=</span> <span class="hl str">'Normal'</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"LILO main options"</span><span class="hl opt">),</span> \<span class="hl kwb">@l,</span> complete <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl slc">#- $o->{security} > 4 && length($b->{password}) < 6 and $o->ask_warn('', _("At this level of security, a password (and a good one) in lilo is requested")), return 1;</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>restricted<span class="hl opt">} && !</span><span class="hl kwb">$b</span><span class="hl opt">->{</span>password<span class="hl opt">}</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Option ``Restrict command line options'' is of no use without a password"</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>password<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>password2<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl opt">!</span><span class="hl kwb">$b</span><span class="hl opt">->{</span>restricted<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">, [</span> _<span class="hl opt">(</span><span class="hl str">"The passwords do not match"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Please try again"</span><span class="hl opt">) ]),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>vga<span class="hl opt">} =</span> <span class="hl kwb">$lilo</span><span class="hl opt">::</span>vga_modes<span class="hl opt">{</span><span class="hl kwb">$b</span><span class="hl opt">->{</span>vga<span class="hl opt">}} ||</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>vga<span class="hl opt">};</span> <span class="hl opt">}</span> <span class="hl kwa">until</span> <span class="hl opt">($::</span>beginner <span class="hl opt">&&</span> <span class="hl kwb">$more</span> <span class="hl opt"><=</span> <span class="hl num">1</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">'setupBootloaderAddEntry'</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$c</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">([</span><span class="hl str">''</span><span class="hl opt">],</span> _<span class="hl opt">(</span><span class="hl str">"Here are the following entries in LILO.</span> <span class="hl str">You can add some more or change the existing ones."</span><span class="hl opt">),</span> <span class="hl opt">[ (</span><span class="hl kwc">sort</span> <span class="hl opt">@{[</span>map_each <span class="hl opt">{</span> <span class="hl str">"$::b->{label} ($::a)"</span> <span class="hl opt">. (</span><span class="hl kwb">$b</span><span class="hl opt">->{</span><span class="hl kwa">default</span><span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl opt">$::</span>b-<span class="hl opt">>{</span>label<span class="hl opt">} &&</span> <span class="hl str">" *"</span><span class="hl opt">) } %{</span><span class="hl kwb">$b</span><span class="hl opt">->{</span>entries<span class="hl opt">}}]}),</span> __<span class="hl opt">(</span><span class="hl str">"Add"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Done"</span><span class="hl opt">) ],</span> <span class="hl opt">);</span> <span class="hl kwb">$c</span> <span class="hl kwc">eq</span> <span class="hl str">"Done"</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$e, $name</span><span class="hl opt">);</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$c</span> <span class="hl kwc">eq</span> <span class="hl str">"Add"</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">@labels</span> <span class="hl opt">=</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>label<span class="hl opt">} }</span> <span class="hl kwc">values</span> <span class="hl opt">%{</span><span class="hl kwb">$b</span><span class="hl opt">->{</span>entries<span class="hl opt">}};</span> <span class="hl kwc">my</span> <span class="hl kwb">$prefix</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Which type of entry do you want to add"</span><span class="hl opt">), [</span> __<span class="hl opt">(</span><span class="hl str">"Linux"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Other OS (windows...)"</span><span class="hl opt">) ])</span> <span class="hl kwc">eq</span> <span class="hl str">"Linux"</span><span class="hl opt">) {</span> <span class="hl kwb">$e</span> <span class="hl opt">= {</span> type <span class="hl opt">=></span> <span class="hl str">'image'</span> <span class="hl opt">};</span> <span class="hl kwb">$prefix</span> <span class="hl opt">=</span> <span class="hl str">"linux"</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">$e</span> <span class="hl opt">= {</span> type <span class="hl opt">=></span> <span class="hl str">'other'</span> <span class="hl opt">};</span> <span class="hl kwb">$prefix</span> <span class="hl opt">=</span> <span class="hl str">"windows"</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwb">$e</span><span class="hl opt">->{</span>label<span class="hl opt">} =</span> <span class="hl kwb">$prefix</span><span class="hl opt">;</span> <span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwc">my</span> <span class="hl kwb">$nb</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> member<span class="hl opt">(</span><span class="hl kwb">$e</span><span class="hl opt">->{</span>label<span class="hl opt">},</span> <span class="hl kwb">@labels</span><span class="hl opt">);</span> <span class="hl kwb">$nb++</span><span class="hl opt">) {</span> <span class="hl kwb">$e</span><span class="hl opt">->{</span>label<span class="hl opt">} =</span> <span class="hl str">"</span><span class="hl ipl">$prefix</span><span class="hl str">-</span><span class="hl ipl">$nb</span><span class="hl str">"</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl opt">(</span><span class="hl kwb">$name</span><span class="hl opt">) =</span> <span class="hl kwb">$c</span> <span class="hl opt">=~</span> <span class="hl kwd">/\((.*?)\)/</span><span class="hl opt">;</span> <span class="hl kwb">$e</span> <span class="hl opt">=</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$name</span><span class="hl opt">};</span> <span class="hl opt">}</span> <span class="hl kwc">my</span> <span class="hl kwb">$old_name</span> <span class="hl opt">=</span> <span class="hl kwb">$name</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">%old_e</span> <span class="hl opt">=</span> <span class="hl kwb">%$e</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$default</span> <span class="hl opt">=</span> <span class="hl kwc">my</span> <span class="hl kwb">$old_default</span> <span class="hl opt">=</span> <span class="hl kwb">$e</span><span class="hl opt">->{</span>label<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span><span class="hl kwa">default</span><span class="hl opt">};</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span><span class="hl opt">;</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$e</span><span class="hl opt">->{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">"image"</span><span class="hl opt">) {</span> <span class="hl kwb">@l</span> <span class="hl opt">= (</span> _<span class="hl opt">(</span><span class="hl str">"Image"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$name,</span> list <span class="hl opt">=> [</span> <span class="hl kwc">eval</span> <span class="hl opt">{</span> glob_<span class="hl opt">(</span><span class="hl str">"/boot/vmlinuz*"</span><span class="hl opt">) } ] },</span> _<span class="hl opt">(</span><span class="hl str">"Root"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$e</span><span class="hl opt">->{</span>root<span class="hl opt">},</span> list <span class="hl opt">=> [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl str">"/dev/</span><span class="hl ipl">$_</span><span class="hl str">->{device}"</span> <span class="hl opt">} @{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>fstab<span class="hl opt">}} ],</span> not_edit <span class="hl opt">=> !$::</span>expert <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Append"</span><span class="hl opt">) =></span> \<span class="hl kwb">$e</span><span class="hl opt">->{</span>append<span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Initrd"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$e</span><span class="hl opt">->{</span>initrd<span class="hl opt">},</span> list <span class="hl opt">=> [</span> <span class="hl kwc">eval</span> <span class="hl opt">{</span> glob_<span class="hl opt">(</span><span class="hl str">"/boot/initrd*"</span><span class="hl opt">) } ] },</span> _<span class="hl opt">(</span><span class="hl str">"Read-write"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$e</span><span class="hl opt">->{</span><span class="hl str">'read-write'</span><span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span> <span class="hl opt">}</span> <span class="hl opt">);</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> <span class="hl kwb">@l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">.</span><span class="hl num">.5</span><span class="hl opt">]</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">@l</span> <span class="hl opt">= (</span> _<span class="hl opt">(</span><span class="hl str">"Root"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$name,</span> list <span class="hl opt">=> [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl str">"/dev/</span><span class="hl ipl">$_</span><span class="hl str">->{device}"</span> <span class="hl opt">} @{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>fstab<span class="hl opt">}} ],</span> not_edit <span class="hl opt">=> !$::</span>expert <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Table"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$e</span><span class="hl opt">->{</span>table<span class="hl opt">},</span> list <span class="hl opt">=> [</span> <span class="hl str">''</span><span class="hl opt">,</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl str">"/dev/</span><span class="hl ipl">$_</span><span class="hl str">->{device}"</span> <span class="hl opt">} @{</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>hds<span class="hl opt">}} ],</span> not_edit <span class="hl opt">=> !$::</span>expert <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Unsafe"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$e</span><span class="hl opt">->{</span>unsafe<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span> <span class="hl opt">}</span> <span class="hl opt">);</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> <span class="hl kwb">@l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">.</span><span class="hl num">.1</span><span class="hl opt">]</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwb">@l</span> <span class="hl opt">= (</span> _<span class="hl opt">(</span><span class="hl str">"Label"</span><span class="hl opt">) =></span> \<span class="hl kwb">$e</span><span class="hl opt">->{</span>label<span class="hl opt">},</span> <span class="hl kwb">@l,</span> _<span class="hl opt">(</span><span class="hl str">"Default"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$default,</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span> <span class="hl opt">},</span> <span class="hl opt">);</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span><span class="hl kwb">$c</span> <span class="hl kwc">eq</span> <span class="hl str">"Add"</span> ? <span class="hl str">''</span> <span class="hl opt">: [</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Ok"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Remove entry"</span><span class="hl opt">)],</span> <span class="hl str">''</span><span class="hl opt">,</span> \<span class="hl kwb">@l,</span> complete <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$e</span><span class="hl opt">->{</span>label<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Empty label not allowed"</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span> member<span class="hl opt">(</span><span class="hl kwb">$e</span><span class="hl opt">->{</span>label<span class="hl opt">},</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">->{</span>label<span class="hl opt">} }</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span> <span class="hl opt">!=</span> <span class="hl kwb">$e</span> <span class="hl opt">}</span> <span class="hl kwc">values</span> <span class="hl opt">%{</span><span class="hl kwb">$b</span><span class="hl opt">->{</span>entries<span class="hl opt">}})</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"This label is already in use"</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl kwb">$name</span> <span class="hl kwc">ne</span> <span class="hl kwb">$old_name</span> <span class="hl opt">&&</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$name</span><span class="hl opt">}</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"A entry</span> <span class="hl ipl">%s</span> <span class="hl str">already exists"</span><span class="hl opt">,</span> <span class="hl kwb">$name</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl opt">)) {</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span><span class="hl kwa">default</span><span class="hl opt">} =</span> <span class="hl kwb">$old_default</span> <span class="hl opt">||</span> <span class="hl kwb">$default</span> ? <span class="hl kwb">$default</span> <span class="hl opt">&&</span> <span class="hl kwb">$e</span><span class="hl opt">->{</span>label<span class="hl opt">} :</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span><span class="hl kwa">default</span><span class="hl opt">};</span> <span class="hl kwc">delete</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$old_name</span><span class="hl opt">};</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$name</span><span class="hl opt">} =</span> <span class="hl kwb">$e</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwc">delete</span> <span class="hl kwb">$b</span><span class="hl opt">->{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$old_name</span><span class="hl opt">};</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl kwc">eval</span> <span class="hl opt">{</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>setupBootloader <span class="hl opt">};</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$@</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">"Installation of LILO failed. The following error occured:"</span><span class="hl opt">),</span> <span class="hl kwc">grep</span> <span class="hl opt">{ !</span><span class="hl kwd">/^Warning:/</span> <span class="hl opt">}</span> cat_<span class="hl opt">(</span><span class="hl str">"</span><span class="hl ipl">$o</span><span class="hl str">->{prefix}/tmp/.error"</span><span class="hl opt">) ]);</span> <span class="hl kwc">unlink</span> <span class="hl str">"</span><span class="hl ipl">$o</span><span class="hl str">->{prefix}/tmp/.error"</span><span class="hl opt">;</span> <span class="hl kwc">die</span> <span class="hl str">"already displayed"</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> miscellaneousNetwork <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$u</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>miscellaneous<span class="hl opt">} ||= {};</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">'configureNetworkProxy'</span><span class="hl opt">);</span> <span class="hl opt">!$::</span>beginner <span class="hl opt">||</span> <span class="hl kwb">$clicked</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_ref</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Proxies configuration"</span><span class="hl opt">),</span> <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">"HTTP proxy"</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"FTP proxy"</span><span class="hl opt">),</span> <span class="hl opt">],</span> <span class="hl opt">[</span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>http_proxy<span class="hl opt">},</span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>ftp_proxy<span class="hl opt">},</span> <span class="hl opt">],</span> complete <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>http_proxy<span class="hl opt">} =~</span> m<span class="hl opt">,^($|</span>http<span class="hl opt">:</span><span class="hl kwd">//</span><span class="hl opt">),</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Proxy should be http://..."</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">3</span><span class="hl opt">;</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>ftp_proxy<span class="hl opt">} =~</span> m<span class="hl opt">,^($|</span>ftp<span class="hl opt">:</span><span class="hl kwd">//</span><span class="hl opt">),</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Proxy should be ftp://..."</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">4</span><span class="hl opt">;</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl opt">) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> miscellaneous <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">%l</span> <span class="hl opt">= (</span> <span class="hl num">0</span> <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Welcome To Crackers"</span><span class="hl opt">),</span> <span class="hl num">1</span> <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Poor"</span><span class="hl opt">),</span> <span class="hl num">2</span> <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Low"</span><span class="hl opt">),</span> <span class="hl num">3</span> <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Medium"</span><span class="hl opt">),</span> <span class="hl num">4</span> <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"High"</span><span class="hl opt">),</span> <span class="hl num">5</span> <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"Paranoid"</span><span class="hl opt">),</span> <span class="hl opt">);</span> <span class="hl kwc">delete</span> <span class="hl kwb">@l</span><span class="hl opt">{</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">5</span><span class="hl opt">}</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span> install_steps<span class="hl opt">::</span>miscellaneous<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span> <span class="hl kwc">my</span> <span class="hl kwb">$u</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>miscellaneous<span class="hl opt">} ||= {};</span> <span class="hl kwc">exists</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>LAPTOP<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>LAPTOP<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$s</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">};</span> add2hash_ <span class="hl kwb">$o,</span> <span class="hl opt">{</span> useSupermount <span class="hl opt">=></span> <span class="hl kwb">$s</span> <span class="hl opt"><</span> <span class="hl num">4</span> <span class="hl opt">};</span> <span class="hl kwb">$s</span> <span class="hl opt">=</span> <span class="hl kwb">$l</span><span class="hl opt">{</span><span class="hl kwb">$s</span><span class="hl opt">} ||</span> <span class="hl kwb">$s</span><span class="hl opt">;</span> <span class="hl opt">!$::</span>beginner <span class="hl opt">||</span> <span class="hl kwb">$clicked</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Miscellaneous questions"</span><span class="hl opt">), [</span> _<span class="hl opt">(</span><span class="hl str">"Use hard drive optimisations?"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>HDPARM<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span><span class="hl opt">,</span> text <span class="hl opt">=></span> _<span class="hl opt">(</span><span class="hl str">"(may cause data corruption)"</span><span class="hl opt">) },</span> _<span class="hl opt">(</span><span class="hl str">"Choose security level"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$s,</span> list <span class="hl opt">=> [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$l</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> ikeys <span class="hl kwb">%l</span> <span class="hl opt">],</span> not_edit <span class="hl opt">=></span> <span class="hl num">1</span> <span class="hl opt">},</span> _<span class="hl opt">(</span><span class="hl str">"Precise RAM size if needed (found</span> <span class="hl ipl">%d</span> <span class="hl str">MB)"</span><span class="hl opt">,</span> availableRam <span class="hl opt">/</span> <span class="hl num">1024</span> <span class="hl opt">+</span> <span class="hl num">3</span><span class="hl opt">) =></span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>memsize<span class="hl opt">},</span> <span class="hl slc">#- add three for correction.</span> _<span class="hl opt">(</span><span class="hl str">"Removable media automounting"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$o</span><span class="hl opt">->{</span>useSupermount<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span><span class="hl opt">,</span> text <span class="hl opt">=></span> <span class="hl str">'supermount'</span> <span class="hl opt">},</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>numlock<span class="hl opt">}</span> ? <span class="hl opt">(</span> _<span class="hl opt">(</span><span class="hl str">"Enable num lock at startup"</span><span class="hl opt">) => {</span> val <span class="hl opt">=></span> \<span class="hl kwb">$u</span><span class="hl opt">->{</span>numlock<span class="hl opt">},</span> type <span class="hl opt">=></span> <span class="hl str">'bool'</span> <span class="hl opt">},</span> <span class="hl opt">) : (),</span> <span class="hl opt">],</span> complete <span class="hl opt">=></span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl opt">!</span><span class="hl kwb">$u</span><span class="hl opt">->{</span>memsize<span class="hl opt">} ||</span> <span class="hl kwb">$u</span><span class="hl opt">->{</span>memsize<span class="hl opt">} =~</span> <span class="hl kwd">s/^(\d+)M?$/$1M/i</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Give the ram size in Mb"</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl opt">) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">%m</span> <span class="hl opt">=</span> <span class="hl kwc">reverse</span> <span class="hl kwb">%l</span><span class="hl opt">;</span> <span class="hl kwb">$ENV</span><span class="hl opt">{</span>SECURE_LEVEL<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>security<span class="hl opt">} =</span> <span class="hl kwb">$m</span><span class="hl opt">{</span><span class="hl kwb">$s</span><span class="hl opt">};</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> setupXfree <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">setupXfreeBefore</span><span class="hl opt">;</span> <span class="hl kwa">require</span> Xconfig<span class="hl opt">;</span> <span class="hl kwa">require</span> Xconfigurator<span class="hl opt">;</span> <span class="hl slc">#- by default do not use existing configuration, so new card will be detected.</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>isUpgrade<span class="hl opt">} && -</span>r <span class="hl str">"</span><span class="hl ipl">$o</span><span class="hl str">->{prefix}/etc/X11/XF86Config"</span><span class="hl opt">) {</span> <span class="hl kwa">if</span> <span class="hl opt">($::</span>beginner <span class="hl opt">||</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Use existing configuration for X11?"</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">)) {</span> Xconfig<span class="hl opt">::</span>getinfoFromXF86Config<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>X<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>prefix<span class="hl opt">});</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl slc">#- strange, xfs must not be started twice...</span> <span class="hl slc">#- trying to stop and restart it does nothing good too...</span> <span class="hl kwc">my</span> <span class="hl kwb">$xfs_started</span> <span class="hl kwa">if</span> <span class="hl num">0</span><span class="hl opt">;</span> run_program<span class="hl opt">::</span>rooted<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>prefix<span class="hl opt">},</span> <span class="hl str">"/etc/rc.d/init.d/xfs"</span><span class="hl opt">,</span> <span class="hl str">"start"</span><span class="hl opt">)</span> <span class="hl kwa">unless</span> <span class="hl kwb">$xfs_started</span><span class="hl opt">;</span> <span class="hl kwb">$xfs_started</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span> <span class="hl opt">{</span> <span class="hl kwc">local</span> <span class="hl opt">$::</span>testing <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl slc">#- unset testing</span> <span class="hl kwc">local</span> <span class="hl opt">$::</span>auto <span class="hl opt">= $::</span>beginner<span class="hl opt">;</span> <span class="hl kwc">local</span> <span class="hl opt">$::</span>noauto <span class="hl opt">= $::</span>expert <span class="hl opt">&& !</span><span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Try to find PCI devices?"</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">);</span> <span class="hl opt">$::</span>noauto <span class="hl opt">= $::</span>noauto<span class="hl opt">;</span> <span class="hl slc">#- no warning</span> Xconfigurator<span class="hl opt">::</span>main<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>prefix<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>X<span class="hl opt">},</span> <span class="hl kwb">$o, $o</span><span class="hl opt">->{</span>allowFB<span class="hl opt">},</span> bool<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">->{</span>pcmcia<span class="hl opt">}),</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> install_any<span class="hl opt">::</span>pkg_install<span class="hl opt">(</span><span class="hl kwb">$o,</span> <span class="hl str">"XFree86-</span><span class="hl ipl">$_</span><span class="hl str">[0]"</span><span class="hl opt">);</span> <span class="hl opt">});</span> <span class="hl opt">}</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">setupXfreeAfter</span><span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl slc">#------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> exitInstall <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $alldone</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwa">return</span> <span class="hl kwb">$o</span><span class="hl opt">->{</span>step<span class="hl opt">} =</span> <span class="hl str">''</span> <span class="hl kwa">unless</span> <span class="hl kwb">$alldone</span> <span class="hl opt">||</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Some steps are not completed.</span> <span class="hl str"></span> <span class="hl str">Do you really want to quit now?"</span><span class="hl opt">),</span> <span class="hl num">0</span><span class="hl opt">);</span> install_any<span class="hl opt">::</span>unlockCdrom<span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Congratulations, installation is complete.</span> <span class="hl str">Remove the boot media and press return to reboot.</span> <span class="hl str"></span> <span class="hl str">For information on fixes which are available for this release of Linux-Mandrake,</span> <span class="hl str">consult the Errata available from http://www.linux-mandrake.com/.</span> <span class="hl str"></span> <span class="hl str">Information on configuring your system is available in the post</span> <span class="hl str">install chapter of the Official Linux-Mandrake User's Guide."</span><span class="hl opt">))</span> <span class="hl kwa">if</span> <span class="hl kwb">$alldone</span> <span class="hl opt">&& !$::</span>g_auto_install<span class="hl opt">;</span> <span class="hl opt">$::</span>global_wait <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Shutting down"</span><span class="hl opt">));</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>exitInstall<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl slc">#-######################################################################################</span> <span class="hl slc">#- Misc Steps Functions</span> <span class="hl slc">#-######################################################################################</span> <span class="hl slc">#--------------------------------------------------------------------------------</span> <span class="hl kwa">sub</span> wait_load_module <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $type, $text, $module</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">"Installing driver for</span> <span class="hl ipl">%s</span> <span class="hl str">card</span> <span class="hl ipl">%s</span><span class="hl str">"</span><span class="hl opt">,</span> <span class="hl kwb">$type, $text</span><span class="hl opt">),</span> <span class="hl opt">$::</span>beginner ? <span class="hl opt">() :</span> _<span class="hl opt">(</span><span class="hl str">"(module</span> <span class="hl ipl">%s</span><span class="hl str">)"</span><span class="hl opt">,</span> <span class="hl kwb">$module</span><span class="hl opt">)</span> <span class="hl opt">]);</span> <span class="hl opt">}</span> <span class="hl kwa">sub</span> load_module <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $type</span><span class="hl opt">) =</span> <span class="hl kwb">@_</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@options</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$l</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Which</span> <span class="hl ipl">%s</span> <span class="hl str">driver should I try?"</span><span class="hl opt">,</span> <span class="hl kwb">$type</span><span class="hl opt">),</span> <span class="hl opt">[</span> modules<span class="hl opt">::</span>text_of_type<span class="hl opt">(</span><span class="hl kwb">$type</span><span class="hl opt">) ])</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">$m</span> <span class="hl opt">=</span> modules<span class="hl opt">::</span>text2driver<span class="hl opt">(</span><span class="hl kwb">$l</span><span class="hl opt">);</span> <span class="hl kwa">require</span> modparm<span class="hl opt">;</span> <span class="hl kwc">my</span> <span class="hl kwb">@names</span> <span class="hl opt">=</span> modparm<span class="hl opt">::</span>get_options_name<span class="hl opt">(</span><span class="hl kwb">$m</span><span class="hl opt">);</span> <span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">@names</span> <span class="hl opt">!=</span> <span class="hl num">0</span><span class="hl opt">) &&</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"In some cases, the</span> <span class="hl ipl">%s</span> <span class="hl str">driver needs to have extra information to work</span> <span class="hl str">properly, although it normally works fine without. Would you like to specify</span> <span class="hl str">extra options for it or allow the driver to probe your machine for the</span> <span class="hl str">information it needs? Occasionally, probing will hang a computer, but it should</span> <span class="hl str">not cause any damage."</span><span class="hl opt">,</span> <span class="hl kwb">$l</span><span class="hl opt">),</span> <span class="hl opt">[</span> __<span class="hl opt">(</span><span class="hl str">"Autoprobe"</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">"Specify options"</span><span class="hl opt">) ],</span> <span class="hl str">"Autoprobe"</span><span class="hl opt">)</span> <span class="hl kwc">ne</span> <span class="hl str">"Autoprobe"</span><span class="hl opt">) {</span> ASK<span class="hl opt">:</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">@names</span> <span class="hl opt">>=</span> <span class="hl num">0</span><span class="hl opt">) {</span> <span class="hl kwc">my</span> <span class="hl kwb">@l</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entries</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"You may now provide its options to module</span> <span class="hl ipl">%s</span><span class="hl str">."</span><span class="hl opt">,</span> <span class="hl kwb">$l</span><span class="hl opt">),</span> \<span class="hl kwb">@names</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwb">@options</span> <span class="hl opt">=</span> modparm<span class="hl opt">::</span>get_options_result<span class="hl opt">(</span><span class="hl kwb">$m, @l</span><span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">@options</span> <span class="hl opt">=</span> <span class="hl kwc">split</span> <span class="hl str">' '</span><span class="hl opt">,</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_from_entry</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"You may now provide its options to module</span> <span class="hl ipl">%s</span><span class="hl str">.</span> <span class="hl str">Options are in format ``name=value name2=value2 ...''.</span> <span class="hl str">For instance, ``io=0x300 irq=7''"</span><span class="hl opt">,</span> <span class="hl kwb">$l</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">"Module options:"</span><span class="hl opt">),</span> <span class="hl opt">);</span> <span class="hl opt">}</span> <span class="hl opt">}</span> <span class="hl kwc">eval</span> <span class="hl opt">{</span> <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> wait_load_module<span class="hl opt">(</span><span class="hl kwb">$o, $type, $l, $m</span><span class="hl opt">);</span> modules<span class="hl opt">::</span>load<span class="hl opt">(</span><span class="hl kwb">$m, $type, @options</span><span class="hl opt">);</span> <span class="hl opt">};</span> <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$@</span><span class="hl opt">) {</span> <span class="hl kwb">$o</span><span class="hl opt">-></span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">''</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">"Loading module</span> <span class="hl ipl">%s</span> <span class="hl str">failed.</span> <span class="hl str">Do you want to try again with other parameters?"</span><span class="hl opt">,</span> <span class="hl kwb">$l</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span> <span class="hl kwa">goto</span> ASK<span class="hl opt">;</span> <span class="hl opt">}</span> <span class="hl kwb">$l, $m</span><span class="hl opt">;</span> <span class="hl opt">}</span>