我参考论坛的资料,结合本单位实际情况写了一个IP管理的软件,可以将本程序运行过的电脑的IP等相关资料采集到本程序的配置文件IP0中,并从IP0中调出当前运行电脑的资料将运行副本安装到当前计算机中,功能是只允许使用者在配置好的两种IP地址中选用,而不能擅自改为其它IP地址。
完成后我发现一个奇怪的BUG,就是在没有输入管理员密码的情况下被禁用的两个按钮Button19(读取外网IP)和Button20(读取内网IP),只要鼠标一经过,即自动恢复为可用状态了。其它按钮又是正常被禁用的,我检查多次,应该我的代码没有问题。请高手参详参详,是否是一个BUG?
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <process.au3>
Dim $yzmm, $yanzhengmm, $srxmm, $qrxmm, $dqmm, $dqjxjmc, $dqmac, $jsjms, $dqjsjms, $IPAddress, $12345, $ip0, $pzjs, $pzm, $jcwj
Dim $xrip, $xrym, $xrwg, $xrdns1, $xrdns2
Dim $jcwjj
$yzmm = "ipymwgdns"
#Region ### START Koda GUI section ### Form=d:\我的文档\form1.kxf
$Form1_1 = GUICreate("IP地址管理器", 295, 295, -1, -1)
$Button3 = GUICtrlCreateButton("访问外网", 8, 45, 75, 25, 0)
$Button55 = GUICtrlCreateButton("访问内网", 8, 70, 75, 25, 0)
$Button19 = GUICtrlCreateButton("读取外网IP", 8, 95, 75, 25, 0)
$Button20 = GUICtrlCreateButton("读取内网IP", 8, 120, 75, 25, 0)
$Button7 = GUICtrlCreateButton("重置外网IP", 8, 145, 75, 25, 0)
$Button8 = GUICtrlCreateButton("重置内网IP", 8, 170, 75, 25, 0)
$Button9 = GUICtrlCreateButton("输入密码", 8, 195, 75, 25, 0)
$Button10 = GUICtrlCreateButton("安装副本", 8, 220, 75, 25, 0)
$Button11 = GUICtrlCreateButton("退 出", 8, 245, 75, 25, 0)
$Label1 = GUICtrlCreateLabel("成都市★★★★★★★★★★局", 115, 278, 160, 17)
GUICtrlSetFont(-1, 9, 400, 4, "宋体")
GUICtrlSetColor(-1, 0xa355dd)
$jsjmc = GUICtrlCreateLabel("计算机名称:", 10, 5, 160, 20)
$IPAddress1 = _GUICtrlIpAddress_Create($Form1_1, 152, 39, 130, 21)
_GUICtrlIpAddress_Set($IPAddress1, "0.0.0.0")
$IPAddress2 = _GUICtrlIpAddress_Create($Form1_1, 152, 63, 130, 21)
_GUICtrlIpAddress_Set($IPAddress2, "0.0.0.0")
$IPAddress3 = _GUICtrlIpAddress_Create($Form1_1, 152, 87, 130, 21)
_GUICtrlIpAddress_Set($IPAddress3, "0.0.0.0")
$IPAddress4 = _GUICtrlIpAddress_Create($Form1_1, 152, 111, 130, 21)
_GUICtrlIpAddress_Set($IPAddress4, "0.0.0.0")
$IPAddress5 = _GUICtrlIpAddress_Create($Form1_1, 152, 135, 130, 21)
_GUICtrlIpAddress_Set($IPAddress5, "0.0.0.0")
$Label3 = GUICtrlCreateLabel("I P 地址", 96, 45, 52, 17)
$Label4 = GUICtrlCreateLabel("子网掩码", 96, 70, 52, 17)
$Label5 = GUICtrlCreateLabel("默认网关", 96, 94, 52, 17)
$Label6 = GUICtrlCreateLabel("常用 DNS", 96, 118, 51, 17)
$Label7 = GUICtrlCreateLabel("备用 DNS", 96, 141, 51, 17)
$Button4 = GUICtrlCreateButton("读取外网IP", 8, 95, 75, 25, 0)
$Button5 = GUICtrlCreateButton("读取内网IP", 8, 120, 75, 25, 0)
GUICtrlCreateInput("", 88, 177, 194, 17, 0x0020, 0x00000220)
GUICtrlCreateLabel("MAC 地址", 96, 162, 51, 17)
GUICtrlCreateLabel("计算机描述:", 10, 23, 80, 17)
GUICtrlCreateInput($dqjsjms, 88, 19, 194, 17)
$Button25 = GUICtrlCreateButton("备用1", 88, 195, 62, 25, 0)
$Button26 = GUICtrlCreateButton("备用2", 154, 195, 62, 25, 0)
$Button27 = GUICtrlCreateButton("备用3", 220, 195, 62, 25, 0)
$Button28 = GUICtrlCreateButton("备用4", 88, 220, 62, 25, 0)
$Button29 = GUICtrlCreateButton("备用5", 154, 220, 62, 25, 0)
$Button30 = GUICtrlCreateButton("备用6", 220, 220, 62, 25, 0)
$Button31 = GUICtrlCreateButton("备用7", 88, 245, 62, 25, 0)
$Button32 = GUICtrlCreateButton("备用8", 154, 245, 62, 25, 0)
$Button33 = GUICtrlCreateButton("备用9", 220, 245, 62, 25, 0)
GUISetState(@SW_SHOW)
Call("jy")
FileCopy("c:\windows\ip.ini", "c:\program files\ahphs\", 1)
FileSetAttrib("c:\program files\ahphs\ip.ini", "+RH")
$dqjsjmc = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ComputerName\ActiveComputerName", "ComputerName")
Call("dqip")
GUICtrlCreateLabel($dqjsjmc, 88, 1, 160, 16)
GUICtrlSetFont(-1, 14, 400, 0, "华文中宋")
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlCreateLabel($dqmac, 165, 161, 130, 17)
GUICtrlSetColor(-1, 0xff0000)
Call("yxini")
#EndRegion ### END Koda GUI section ###
Func yxini();甄别本机是否已在配置文件中注册,若否则预配置本机。
$n = 01
$ip0 = IniReadSectionNames("ip0.ini")
For $i = 1 To $ip0[0]
If $ip0[$i] = $dqmac Then
$n = 100
Else
$n = 1
EndIf
Next
If $n = 1 Then
MsgBox(0, "", "发现新网卡,MAC地址为:" & $dqmac & ",已自动注册,请预置IP地址。")
For $n = 01 To 15
IniWrite("ip0.ini", $dqmac, $n, "")
Next
IniWrite("ip0.ini", $dqmac, 1, "★★★★★★★★★★★★")
IniWrite("ip0.ini", $dqmac, 2, $dqjsjmc)
IniWrite("ip0.ini", $dqmac, 4, $dqmac)
Else
MsgBox(0, "", "您的网卡已注册!", 1)
EndIf
EndFunc ;==>yxini
Func jy();禁用控件
GUICtrlSetState(7, $GUI_DISABLE)
GUICtrlSetState(8, $GUI_DISABLE)
GUICtrlSetState(10, $GUI_DISABLE)
GUICtrlSetState(19, $GUI_DISABLE)
GUICtrlSetState(20, $GUI_DISABLE)
GUICtrlSetState(21, $GUI_DISABLE)
GUICtrlSetState(25, $GUI_DISABLE)
GUICtrlSetState(26, $GUI_DISABLE)
GUICtrlSetState(27, $GUI_DISABLE)
GUICtrlSetState(28, $GUI_DISABLE)
GUICtrlSetState(29, $GUI_DISABLE)
GUICtrlSetState(30, $GUI_DISABLE)
GUICtrlSetState(31, $GUI_DISABLE)
GUICtrlSetState(32, $GUI_DISABLE)
GUICtrlSetState(33, $GUI_DISABLE)
EndFunc ;==>jy
Func qy();启用控件
GUICtrlSetState(7, $GUI_ENABLE)
GUICtrlSetState(8, $GUI_ENABLE)
GUICtrlSetState(10, $GUI_ENABLE)
GUICtrlSetState(19, $GUI_ENABLE)
GUICtrlSetState(20, $GUI_ENABLE)
;GUICtrlSetState(25, $GUI_ENABLE)
;GUICtrlSetState(26, $GUI_ENABLE)
;GUICtrlSetState(27, $GUI_ENABLE)
;GUICtrlSetState(28, $GUI_ENABLE)
;GUICtrlSetState(29, $GUI_ENABLE)
;GUICtrlSetState(30, $GUI_ENABLE)
;GUICtrlSetState(31, $GUI_ENABLE)
;GUICtrlSetState(32, $GUI_ENABLE)
;GUICtrlSetState(33, $GUI_ENABLE)
EndFunc ;==>qy
Func unclock()
_RunDOS("regsvr32/s netcfgx.dll")
_RunDOS("regsvr32/s netshell.dll")
_RunDOS("regsvr32/s netman.dll")
EndFunc ;==>unclock
Func clock()
_RunDOS("regsvr32/u /s netcfgx.dll")
_RunDOS("regsvr32/u /s netshell.dll")
_RunDOS("regsvr32/u /s netman.dll")
Call("jy")
EndFunc ;==>clock
Func dqip();读取IP
$objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE", "WQL", 0x10 + 0x20)
$colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
For $objItem In $colItems
$LocalIP = $objItem.IPAddress(0);IP
_GUICtrlIpAddress_Set($IPAddress1, $LocalIP)
$LocalSubnetmask = $objItem.IPSubnet(0);掩码
_GUICtrlIpAddress_Set($IPAddress2, $LocalSubnetmask)
$LocalGateway = $objItem.DefaultIPGateway(0);网关
_GUICtrlIpAddress_Set($IPAddress3, $LocalGateway)
$LocalDns1 = $objItem.DNSServerSearchOrder(0);DNS1
_GUICtrlIpAddress_Set($IPAddress4, $LocalDns1)
$LocalDns2 = $objItem.DNSServerSearchOrder(1);DNS2
_GUICtrlIpAddress_Set($IPAddress5, $LocalDns2)
$dqmac = $objItem.MACAddress(0)
$dqmac = StringReplace($dqmac, ":", "-")
$jcwj = FileExists("C:\WINDOWS\ip.ini")
If $jcwj = 0 Then
$dqjsjms = IniRead("ip0.ini", $dqmac, 3, "")
Else
$dqjsjms = IniRead("C:\WINDOWS\ip.ini", $dqmac, 3, "")
EndIf
GUICtrlSetData(24, $dqjsjms)
Next
EndFunc ;==>dqip
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
;;Case $GUI_EVENT_CLOSE
;Exit
Case $Button3
$jcwj = FileExists("C:\WINDOWS\ip.ini")
If $jcwj = 0 Then
MsgBox(0, "", "Sorry,本机尚未配置!")
Else
ToolTip("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★" & @LF & @LF & "正在自动切换您的IP地址,请稍候,切换完毕后本程序将自动退出!" & @LF & @LF & "★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★", 512, 360, "提示:", 1, 2)
MouseMove(660, 525)
Call("unclock")
$xrip = IniRead("C:\WINDOWS\ip.ini", $dqmac, "6", "")
$xrym = IniRead("C:\WINDOWS\ip.ini", $dqmac, "7", "")
$xrwg = IniRead("C:\WINDOWS\ip.ini", $dqmac, "8", "")
$xrdns1 = IniRead("C:\WINDOWS\ip.ini", $dqmac, "9", "")
$xrdns2 = IniRead("C:\WINDOWS\ip.ini", $dqmac, "10", "")
_GUICtrlIpAddress_Set($IPAddress1, $xrip)
_GUICtrlIpAddress_Set($IPAddress2, $xrym)
_GUICtrlIpAddress_Set($IPAddress3, $xrwg)
_GUICtrlIpAddress_Set($IPAddress4, $xrdns1)
_GUICtrlIpAddress_Set($IPAddress5, $xrdns2)
Dim $SetDns[2], $SetIPAddress[1], $SetSubnetmask[1], $SetGateway[1]
$HostName = $dqjsjmc
$SetDns[0] = $xrdns1
$SetDns[1] = $xrdns2
$SetIPAddress[0] = $xrip
$SetSubnetmask[0] = $xrym
$SetGateway[0] = $xrwg
$objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE", "WQL", 0x10 + 0x20)
$colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
$objNetworkSettings = $objWMIService.Get("Win32_NetworkAdapterConfiguration")
For $objNetAdapter In $colComputers
$objNetAdapter.Rename($HostName)
Next
If IsObj($colItems) Then
For $objNetAdapter In $colItems
$objNetAdapter.EnableStatic($SetIPAddress, $SetSubnetmask)
$objNetAdapter.SetGateways($SetGateway)
$objNetAdapter.SetDNSServerSearchOrder($SetDns)
Next
EndIf
;msgbox(1,"",$xrip&@lf&$xrym&@lf&$xrwg&@lf&$xrdns1&@lf&$xrdns2)
;_rundos('set eth="本地连接"')
;_rundos('set ip= '&$xrip)
;RunWait(@ComSpec & ' /C netsh -c interface ip set address "本地连接" static ' & $xrip & " " & $xrym & " " & $xrwg,"",@SW_HIDE)
;RunWait(@ComSpec & " /c " & 'netsh interface ip set dns name="本地连接" source=static addr=' & $xrdns1 & 'register=PRIMARY', "", @SW_HIDE)
;RunWait(@ComSpec & " /c " & 'netsh interface ip add dns name="本地连接" addr=' & $xrdns2 & '', "", @SW_HIDE)
Call("clock")
Exit
EndIf
Case $Button55
$jcwj = FileExists("C:\WINDOWS\ip.ini")
If $jcwj = 0 Then
MsgBox(0, "", "Sorry,本机尚未配置!")
Else
ToolTip("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★" & @LF & @LF & "正在自动切换您的IP地址,请稍候,切换完毕后本程序将自动退出!" & @LF & @LF & "★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★", 512, 360, "提示:", 1, 2)
MouseMove(660, 525)
Call("unclock")
$xrip = IniRead("C:\WINDOWS\ip.ini", $dqmac, "11", "")
$xrym = IniRead("C:\WINDOWS\ip.ini", $dqmac, "12", "")
$xrwg = IniRead("C:\WINDOWS\ip.ini", $dqmac, "13", "")
$xrdns1 = IniRead("C:\WINDOWS\ip.ini", $dqmac, "14", "")
$xrdns2 = IniRead("C:\WINDOWS\ip.ini", $dqmac, "15", "")
_GUICtrlIpAddress_Set($IPAddress1, $xrip)
_GUICtrlIpAddress_Set($IPAddress2, $xrym)
_GUICtrlIpAddress_Set($IPAddress3, $xrwg)
_GUICtrlIpAddress_Set($IPAddress4, $xrdns1)
_GUICtrlIpAddress_Set($IPAddress5, $xrdns2)
Dim $SetDns[2], $SetIPAddress[1], $SetSubnetmask[1], $SetGateway[1]
$HostName = $dqjsjmc
$SetDns[0] = $xrdns1
$SetDns[1] = $xrdns2
$SetIPAddress[0] = $xrip
$SetSubnetmask[0] = $xrym
$SetGateway[0] = $xrwg
$objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE", "WQL", 0x10 + 0x20)
$colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
$objNetworkSettings = $objWMIService.Get("Win32_NetworkAdapterConfiguration")
For $objNetAdapter In $colComputers
$objNetAdapter.Rename($HostName)
Next
If IsObj($colItems) Then
For $objNetAdapter In $colItems
$objNetAdapter.EnableStatic($SetIPAddress, $SetSubnetmask)
$objNetAdapter.SetGateways($SetGateway)
$objNetAdapter.SetDNSServerSearchOrder($SetDns)
Next
EndIf
;RunWait(@ComSpec & ' /c netsh -c interface ip set address "本地连接" static ' & $xrip & $xrym & $xrwg & '1', "", @SW_HIDE)
;RunWait(@ComSpec & " /c " & 'netsh interface ip set dns name="本地连接" source=static addr=' & $xrdns1 & 'register=PRIMARY', "", @SW_HIDE)
;RunWait(@ComSpec & " /c " & 'netsh interface ip add dns name="本地连接" addr=' & $xrdns2 & '', "", @SW_HIDE)
Call("clock")
Exit
EndIf
Case $Button7
IniWrite("ip0.ini", $dqmac, 1, "★★★★★★★★★★★★★★★")
IniWrite("ip0.ini", $dqmac, 2, $dqjsjmc)
$dqjsjms = GUICtrlRead(24)
IniWrite("ip0.ini", $dqmac, 3, $dqjsjms)
IniWrite("ip0.ini", $dqmac, 4, $dqmac)
;IniWrite("ip0.ini", $dqmac, 5, $12345)
$n = 06
$n0 = 1
$n00 = 0
For $n = 06 To 10
Select
Case $n0 = 1
$n00 = $IPAddress1
Case $n0 = 2
$n00 = $IPAddress2
Case $n0 = 3
$n00 = $IPAddress3
Case $n0 = 4
$n00 = $IPAddress4
Case $n0 = 5
$n00 = $IPAddress5
EndSelect
$12345 = _GUICtrlIpAddress_Get($n00)
IniWrite("ip0.ini", $dqmac, $n, $12345)
$n0 = $n0 + 1
Next
MsgBox(0, "", "重置外网IP成功!")
Case $Button8
$n = 11
$n0 = 1
$n00 = 0
For $n = 11 To 15
Select
Case $n0 = 1
$n00 = $IPAddress1
Case $n0 = 2
$n00 = $IPAddress2
Case $n0 = 3
$n00 = $IPAddress3
Case $n0 = 4
$n00 = $IPAddress4
Case $n0 = 5
$n00 = $IPAddress5
EndSelect
$12345 = _GUICtrlIpAddress_Get($n00)
IniWrite("ip0.ini", $dqmac, $n, $12345)
$n0 = $n0 + 1
Next
MsgBox(0, "", "重置内网IP成功!")
#cs
Case $button20
$dqmm = IniRead("ip0.ini", "配置信息", "MD5", $yzmm)
#ce
Case $Button19
$dqip = IniRead("ip0.ini", $dqmac, "6", "")
$dqym = IniRead("ip0.ini", $dqmac, "7", "")
$dqwg = IniRead("ip0.ini", $dqmac, "8", "")
$dqdns1 = IniRead("ip0.ini", $dqmac, "9", "")
$dqdns2 = IniRead("ip0.ini", $dqmac, "10", "")
$dqjsjms = IniRead("ip0.ini", $dqmac, 3, "")
_GUICtrlIpAddress_Set($IPAddress1, $dqip)
_GUICtrlIpAddress_Set($IPAddress2, $dqym)
_GUICtrlIpAddress_Set($IPAddress3, $dqwg)
_GUICtrlIpAddress_Set($IPAddress4, $dqdns1)
_GUICtrlIpAddress_Set($IPAddress5, $dqdns2)
IniWrite("ip.ini", $dqmac, 1, "★★★★★★★★★★★★★★★")
IniWrite("ip.ini", $dqmac, 2, $dqjsjmc)
IniWrite("ip.ini", $dqmac, 3, $dqjsjms)
IniWrite("ip.ini", $dqmac, 4, $dqmac)
IniWrite("ip.ini", $dqmac, 5, "")
IniWrite("ip.ini", $dqmac, 6, $dqip)
IniWrite("ip.ini", $dqmac, 7, $dqym)
IniWrite("ip.ini", $dqmac, 8, $dqwg)
IniWrite("ip.ini", $dqmac, 9, $dqdns1)
IniWrite("ip.ini", $dqmac, 10, $dqdns2)
MsgBox(0, "", "读取外网IP成功,已写入本地连接!")
Case $Button20
$dqip = IniRead("ip0.ini", $dqmac, "11", "")
$dqym = IniRead("ip0.ini", $dqmac, "12", "")
$dqwg = IniRead("ip0.ini", $dqmac, "13", "")
$dqdns1 = IniRead("ip0.ini", $dqmac, "14", "")
$dqdns2 = IniRead("ip0.ini", $dqmac, "15", "")
$dqjsjms = IniRead("ip0.ini", $dqmac, 3, "")
_GUICtrlIpAddress_Set($IPAddress1, $dqip)
_GUICtrlIpAddress_Set($IPAddress2, $dqym)
_GUICtrlIpAddress_Set($IPAddress3, $dqwg)
_GUICtrlIpAddress_Set($IPAddress4, $dqdns1)
_GUICtrlIpAddress_Set($IPAddress5, $dqdns2)
IniWrite("ip.ini", $dqmac, 11, $dqip)
IniWrite("ip.ini", $dqmac, 12, $dqym)
IniWrite("ip.ini", $dqmac, 13, $dqwg)
IniWrite("ip.ini", $dqmac, 14, $dqdns1)
IniWrite("ip.ini", $dqmac, 15, $dqdns2)
MsgBox(0, "", "读取内网IP成功,已写入本地连接!")
Case $Button10
MsgBox(0, "", "正在安装副本到您的计算机,请稍候......", 3)
$jcwjj = FileExists("C:\program files\ahphs\");检查目录是否存在
If $jcwjj = 0 Then
DirCreate("C:\program files\ahphs\");创建目录
Else
EndIf
FileCopy("ip.exe", "C:\program files\ahphs\", 1)
Sleep(100)
FileMove("ip.ini", "C:\windows\", 1)
Sleep(100)
FileCreateShortcut("C:\program files\ahphs\ip.exe", "C:\Documents and Settings\Administrator\Application Data\Microsoft\Internet Explorer\Quick Launch\IP地址管理器.ink")
FileCreateShortcut("C:\program files\ahphs\ip.exe", "C:\Documents and Settings\Administrator\桌面\IP地址管理器.ink")
FileCreateShortcut("C:\program files\ahphs\ip.exe", "C:\Documents and Settings\Administrator\「开始」菜单\IP地址管理器.ink")
MsgBox(0, "", "安装成功!")
Case $Button11
;FileSetAttrib("c:\program files\ahphs\ip.ini", "-RH")
;FileDelete("c:\program files\ahphs\ip.ini")
Exit
Case $Button9;============================
$bu9txt = ControlGetText("", "", 9);读取按钮文本
Select
Case $bu9txt = "输入密码"
GUICtrlSetState(21, $GUI_ENABLE);解锁控件
GUICtrlSetData(9, "确认密码");更改按钮文本
GUICtrlSetData(21, "");更改控件数据
ControlFocus("", "", 21);焦点集中到控件
Case $bu9txt = "确认密码"
$yanzhengmm = GUICtrlRead(21);读取控件内容
If $yanzhengmm = $yzmm Then
GUICtrlSetData(21, "");更改控件数据
GUICtrlSetState(21, $GUI_DISABLE);加锁控件
GUICtrlSetData(9, "封 闭");更改按钮文本
MsgBox(0, "", "密码验证成功!")
Call("qy")
Call("unclock")
Else
GUICtrlSetData(9, "输入密码");更改按钮文本
GUICtrlSetData(21, "");更改控件数据
GUICtrlSetState(21, $GUI_DISABLE);加锁控件
MsgBox(0, "", "非法操作,请确认您的权限!")
EndIf
Case $bu9txt = "封 闭"
Call("jy")
Call("clock")
GUICtrlSetData(9, "输入密码");更改按钮文本
EndSelect
EndSwitch
WEnd;### Tidy Error -> func is never closed in your script.
[ 本帖最后由 ahphsautoit 于 2009-4-8 18:43 编辑 ] |