<!doctypehtml><html lang=zh-cht dir=ltr xmlns=http://www.w3.org/1999/xhtml><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta content="text/html; charset=utf-8"http-equiv=Content-Type><meta name=viewport content="user-scalable=1,initial-scale=1,minimum-scale=1,maximum-scale=1"><meta name=format-detection content="telephone=no"><meta name=robots content=noindex,nofollow><link rel=manifest href={{{domainurl}}}manifest.json><link rel="shortcut icon"href={{{domainurl}}}favicon.ico><link rel=icon type=image/png sizes=16x16 href={{{domainurl}}}favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href={{{domainurl}}}favicon-32x32.png><link rel=apple-touch-icon href=/favicon-303x303.png><link type=text/css href=styles/xterm.css media=screen rel=stylesheet title=CSS><body id=body onload='"undefined"!=typeof startup&&startup()'style="overflow-y:hidden;margin:0;padding:0;border:0;font-size:13px;font-family:\'Trebuchet MS\',Arial,Helvetica,sans-serif">{{{customCSSTags}}}<meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=#ffffff><meta name=apple-mobile-web-app-title content={{{title}}}><script src=scripts/common-0.0.1{{{min}}}.js></script><script src=scripts/meshcentral{{{min}}}.js></script><script src=scripts/agent-redir-ws-0.1.1{{{min}}}.js></script><script src=scripts/agent-desktop-0.0.2{{{min}}}.js></script><script src=scripts/amt-0.2.0{{{min}}}.js></script><script src=scripts/amt-redir-ws-0.1.0{{{min}}}.js></script><script src=scripts/amt-desktop-0.0.2{{{min}}}.js></script><script src=scripts/xterm{{{min}}}.js></script><script src=scripts/xterm-addon-fit{{{min}}}.js></script><script src=scripts/xterm-addon-image{{{min}}}.js></script><script src=scripts/zlib{{{min}}}.js></script><script src=scripts/zlib-inflate{{{min}}}.js></script><script src=scripts/zlib-adler32{{{min}}}.js></script><script src=scripts/zlib-crc32{{{min}}}.js></script><script keeplink=1 src=scripts/filesaver.min.js></script>{{{customJSTags}}}<meta name=msapplication-TileColor content=#00aba9><meta name=theme-color content=#ffffff><title>{{{title}}}</title><style>body{background-color:#fff}.night body{background-color:#000}#MxMESH{color:#000}.night #MxMESH{color:#d3d3d3}.textOverGray{color:#000}#dialog{z-index:1000;background-color:#eee;box-shadow:0 0 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:90px;width:300px}.night #dialog{color:#000;background-color:#aaa}:focus{outline:0}a{color:#036;text-decoration:underline}.night a{color:#99f}#footer a{color:#fff;text-decoration:underline}#footer a:hover{text-decoration:none}.night #footer{color:gray}.i1{background:url(../images/icons50.png) 0 0;background-image:image-set(url(../images/icons50.png) 1x,url(../images/icons100.png) 2x);height:50px;width:50px;border:none}.i2{background:url(../images/icons50.png) -50px 0;background-image:image-set(url(../images/icons50.png) 1x,url(../images/icons100.png) 2x);height:50px;width:50px;border:none}.i3{background:url(../images/icons50.png) -100px 0;background-image:image-set(url(../images/icons50.png) 1x,url(../images/icons100.png) 2x);height:50px;width:50px;border:none}.i4{background:url(../images/icons50.png) -150px 0;background-image:image-set(url(../images/icons50.png) 1x,url(../images/icons100.png) 2x);height:50px;width:50px;border:none}.i5{background:url(../images/icons50.png) -200px 0;background-image:image-set(url(../images/icons50.png) 1x,url(../images/icons100.png) 2x);height:50px;width:50px;border:none}.i6{background:url(../images/icons50.png) -250px 0;background-image:image-set(url(../images/icons50.png) 1x,url(../images/icons100.png) 2x);height:50px;width:50px;border:none}.i7{background:url(../images/icons50.png) -300px 0;background-image:image-set(url(../images/icons50.png) 1x,url(../images/icons100.png) 2x);height:50px;width:50px;border:none}.i8{background:url(../images/icons50.png) -350px 0;background-image:image-set(url(../images/icons50.png) 1x,url(../images/icons100.png) 2x);height:50px;width:50px;border:none}.m0{background:url(../images/images16.png) -32px 0;height:16px;width:16px;border:none;float:left}.m1{background:url(../images/images16.png) -16px 0;height:16px;width:16px;border:none;float:left}.m2{background:url(../images/images16.png) -96px 0;height:16px;width:16px;border:none;float:left}.m3{background:url(../images/images16.png) -112px 0;height:16px;width:16px;border:none;float:left}.m4{background:url(../images/images16.png) -128px 0;height:16px;width:16px;border:none;float:left}.NotifyIconSmall1{width:24px;height:24px;background:url(../images/notify24.png) 0 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.NotifyIconSmall2{width:24px;height:24px;background:url(../images/notify24.png) -24px 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.NotifyIconSmall3{width:24px;height:24px;background:url(../images/notify24.png) -48px 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.NotifyIconSmall4{width:24px;height:24px;background:url(../images/notify24.png) -72px 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.NotifyIconSmall5{width:24px;height:24px;background:url(../images/notify24.png) -96px 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.NotifyIconSmall6{width:24px;height:24px;background:url(../images/notify24.png) -120px 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.NotifyIconSmall7{width:24px;height:24px;background:url(../images/notify24.png) -144px 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.NotifyIconSmall8{width:24px;height:24px;background:url(../images/notify24.png) -168px 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.NotifyIconSmall9{width:24px;height:24px;background:url(../images/notify24.png) -192px 0;background-image:image-set(url(../images/notify24.png) 1x,url(../images/notify48.png) 2x)}.gray{filter:gray;-webkit-filter:grayscale(100%) opacity(60%)}.DevSt{padding-left:5px;border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#ddd}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fileIcon1{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb49Y2Sj9LT2f///yH5BAEAAAMALAAAAAAQABAAAAImnI+py+1vhJwyUYAzHTL4D3qdlJWaIFJqmKod607sDKIiDUP63hQAOw==);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px}.fileIcon2{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAM2xV/Xur+XPgP///yH5BAEAAAMALAAAAAAQABAAAAJD3ISZIGHWUGihznesYDYATFVM+D2hJ4lgN1olxALAtAlmPCJvuMmJd6PJckDYwicrHhTD5o7plJmg0Uc0asNMkphHAQA7);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px}.fileIcon3{background:url(data:image/gif;base64,R0lGODlhEAAQAJEDAPb19IGBgbq6uv///yH5BAEAAAMALAAAAAAQABAAAAIy3ISpxgcPH2ouQgFEw1YmxnUXKEaaEZZnVWZk66JwzKpvuwZzwOgwb/C1gIOA8Yg8DgoAOw==);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px}.fileIcon4{background:url(../images/meshicon16.png);height:16px;width:16px;cursor:pointer;border:none;float:left;margin-top:1px}.filelist{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;cursor:default;-khtml-user-drag:element;clear:both}.deviceNotifyDot{position:absolute;right:10px;top:0;height:16px}.deviceNotifyDotSub{text-align:center;color:#fff;width:16px;background-color:#00f;padding:2px;border-radius:10px;box-shadow:2px 2px 10px #000;cursor:pointer;margin-left:3px;float:left}.deviceNotifyDotSub:hover{background-color:#44f}.deviceNotifySmallDot{position:absolute;right:10px;top:0;height:10px}.deviceNotifySmallDotSub{text-align:center;color:#fff;width:10px;padding:2px;background-color:#00f;border-radius:10px;box-shadow:2px 2px 10px #000;cursor:pointer;margin-left:2px;float:left}.deviceNotifySmallDotSub:hover{background-color:#44f}.deviceNotifyLargeDot{position:absolute;right:10px;top:10px;height:40px}.deviceNotifyLargeDotSub{text-align:center;width:35px;height:35px;color:#fff;padding:2px;background-color:#00f;border-radius:20px;box-shadow:2px 2px 10px #000;cursor:pointer;margin-left:4px;font-size:30px;float:left}.deviceNotifyLargeDotSub:hover{background-color:#44f}.style10{background-color:#c9c9c9;color:#000}.night .style10{background-color:#888}.deviceBatteryLarge{position:absolute;right:10px;top:0;width:28px;height:48px;border:none;box-shadow:none}.deviceBatteryLarge1{background:url(../images/batteries48.png) 0 0}.deviceBatteryLarge2{background:url(../images/batteries48.png) -28px 0}.deviceBatteryLarge3{background:url(../images/batteries48.png) -56px 0}.deviceBatteryLarge4{background:url(../images/batteries48.png) -84px 0}.deviceBatteryLarge5{background:url(../images/batteries48.png) -112px 0}.deviceBatteryLarge6{background:url(../images/batteries48.png) -140px 0}.deviceBatteryLarge7{background:url(../images/batteries48.png) -168px 0}.deviceBatteryLarge8{background:url(../images/batteries48.png) -196px 0}.deviceBatteryLarge9{background:url(../images/batteries48.png) -224px 0}.deviceBatteryLarge10{background:url(../images/batteries48.png) -252px 0}.deviceBatteryLarge11{background:url(../images/batteries48.png) -280px 0}.deviceBatterySmall{position:absolute;left:6px;top:22px;width:14px;height:24px;border:none;box-shadow:none}.deviceBatterySmall1{background:url(../images/batteries24.png) 0 0}.deviceBatterySmall2{background:url(../images/batteries24.png) -14px 0}.deviceBatterySmall3{background:url(../images/batteries24.png) -28px 0}.deviceBatterySmall4{background:url(../images/batteries24.png) -42px 0}.deviceBatterySmall5{background:url(../images/batteries24.png) -56px 0}.deviceBatterySmall6{background:url(../images/batteries24.png) -70px 0}.deviceBatterySmall7{background:url(../images/batteries24.png) -84px 0}.deviceBatterySmall8{background:url(../images/batteries24.png) -98px 0}.deviceBatterySmall9{background:url(../images/batteries24.png) -112px 0}.deviceBatterySmall10{background:url(../images/batteries24.png) -126px 0}.deviceBatterySmall11{background:url(../images/batteries24.png) -140px 0}.meshList{width:auto;height:40px;background-color:#d3d3d3;margin-top:5px;margin-bottom:5px;margin-left:60px;padding-top:5px;padding-bottom:5px;border-radius:8px 0 0 8px}.night .meshList{background-color:gray}.devList1{height:50px;cursor:pointer;position:relative;margin-top:5px;margin-bottom:5px}.devList2{float:left;margin-left:4px}.devList3{width:auto;height:40px;background-color:#d3d3d3;margin-left:60px;padding-top:5px;padding-bottom:5px;border-radius:8px 0 0 8px}.night .devList3{background-color:gray}.devList4{padding-left:12px;padding-top:2px;color:#000}.devList5{padding-left:12px;padding-top:3px;color:#444}.night .devList5{color:#000}.deskButton{box-shadow:0 0 10px #000;border-radius:20px;position:absolute;right:10px;top:10px;cursor:pointer;background-color:#aaa;z-index:1000}.menuButton{box-shadow:0 0 10px #000;border-radius:10px;display:inline-block;width:120px;background-color:#aaa;text-align:center;padding:8px;cursor:pointer;margin:10px;z-index:1000}#notificationCount{min-width:28px;font-size:20px;background-color:orange;text-align:center;cursor:pointer;color:#000}.notifiyBox{font-size:16px;position:absolute;z-index:1000;top:60px;right:76px;width:300px;text-align:left;background-color:#f0eccd;border:4px solid #666;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;-webkit-box-shadow:2px 2px 4px #888;-moz-box-shadow:2px 2px 4px #888;box-shadow:2px 2px 4px #888;max-height:200px}.night .notifiyBox{color:#000}.notifiyBox:before{content:' ';position:absolute;width:0;height:0;right:5px;top:-30px;border:15px solid;border-color:transparent #666 #666 transparent}.notifiyBox:after{content:' ';position:absolute;width:0;height:0;right:7px;top:-24px;border:12px solid;border-color:transparent #f0eccd #f0eccd transparent}#p15statetext{padding:4px;height:15px}#p15agentConsole{background:#000;margin:0;padding:0;color:#d3d3d3;width:100%;position:relative}#p15coreName{padding:4px;display:inline-block}#p15agentConsoleText{position:absolute;margin:0;padding:0;top:0;bottom:0;left:0;right:0;overflow-y:scroll;overflow-x:auto}.areaHead{padding-top:2px;padding-bottom:2px;background:silver}.night .areaHead{color:#ccc;background:#333}.areaFoot{padding-top:2px;padding-bottom:2px;background:silver}.night .areaFoot{color:#ccc;background:#333}.toright2{float:right;text-align:right}#consoleTable{width:100%;height:100%;padding:0;margin-top:0}.night #consoleTable{color:#000}.menucurve{background-color:#fff;width:10px;height:10px;border-radius:10px 0 0 0;border-right:1px solid #fff;border-bottom:1px solid #fff}.night .menucurve{background-color:#000;border-right:1px solid #000;border-bottom:1px solid #000}#termTable{width:100%;padding:0;margin-top:0}.fulldesk #termTable{position:absolute;top:0;bottom:0;left:0;right:0}#termarea3x{background:#000;text-align:center;height:400px;position:relative}.viewSelector10{margin-left:2px;margin-top:2px;background:url(../images/views.png) -476px 0;height:28px;width:28px}.viewSelector11{margin-left:2px;margin-top:2px;background:url(../images/views.png) -504px 0;height:28px;width:28px}.tagSpan{background-color:#d3d3d3;padding:3px;border-radius:5px}.night .tagSpan{color:#000}#d2serveraction,#d3serveraction{width:100%;background-color:#d3d9d6;text-align:left;padding:3px}#d2serverfiles,#d3serverfiles{width:100%;height:150px;background-color:#fff;padding:2px;border:1px solid gray;overflow-y:scroll}</style><div id=container><div id=notifiyBox class=notifiyBox style=display:none></div><div id=mastheadx></div><div id=masthead style="background:url(logo.png) 0 0;background-size:341px 50px;background-color:#036;background-repeat:no-repeat;height:50px;width:100%;overflow:hidden"><div style="width:calc(100% - 50px);overflow:hidden"><div style=float:left;height:66px;color:#c8c8c8;padding-left:10px;padding-top:6px onclick=go(2)><strong><font style="font-size:36px;font-family:Arial,Helvetica,sans-serif;text-shadow:1px 1px 2px #000">{{{title1}}}</font></strong></div><div style=float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:10px><strong><font style="font-size:12px;font-family:Arial,Helvetica,sans-serif;text-shadow:1px 1px 2px #000">{{{title2}}}</font></strong></div></div><div id=devViewPageState class=noselect style=position:absolute;right:160px;top:10px;height:30px;line-height:30px;color:#c8c8c8;font-size:16px;display:none></div><img id=devViewPageButton2 class=noselect style=position:absolute;right:130px;top:10px;cursor:pointer;display:none onclick=onDeviceViewPageChange(2) src=/images/left-30.png width=20 height=30> <img id=devViewPageButton3 class=noselect style=position:absolute;right:100px;top:10px;cursor:pointer;display:none onclick=onDeviceViewPageChange(3) src=/images/right-30.png width=20 height=30><div id=notificationCount onclick=clickNotificationIcon() class=unselectable style=position:absolute;right:50px;top:0;font-size:28px;width:50px;height:50px;cursor:pointer;display:none title=點擊查看當前通知><div id=notificationCount2 style=padding-top:8px>0</div></div><img id=topMenuIcon class=noselect style=position:absolute;right:0;top:10px;color:#c8c8c8;font-size:44px;margin-right:8px;cursor:pointer;display:none onclick=topMenu() src=/images/3bars-30.png width=30 height=30></div><div id=page_content style=position:absolute;bottom:32px;top:50px;width:100%><div id=column_l style=width:100%;padding:0;position:absolute;bottom:0;top:0><div id=p0 style=display:none;width:100%;height:100%><div style=display:flex;align-items:center;width:100%;height:100%><div id=p0message style=text-align:center;width:100%><span id=p0span>伺服器已斷開連接</span>,<href onclick=reload() style=cursor:pointer><u>點擊重新連接</u></href>.</div></div></div><div id=p1 style=display:none;width:100%;height:100%><div style=display:flex;align-items:center;width:100%;height:100%><div id=p1message style=text-align:center;width:100%></div></div></div><div id=p2 style=display:none;position:absolute;top:0;left:0;right:0;bottom:0><div id=xdevices style=position:absolute;overflow-y:auto;top:0;left:0;right:0;bottom:34px onscroll=onDevicesScroll() ontouchstart=onDeviceTouch(!0) ontouchend=onDeviceTouch(!1)></div><div id=xdevicesBar style=position:absolute;overflow-y:auto;height:34px;left:0;right:0;bottom:0;background-color:#aaa;color:#000><div style=margin:4px><span style=width:20px;display:inline-block;text-align:center;cursor:pointer;font-size:16px onclick=clearSearchInput()><b>X</b></span> <input id=SearchInput autocomplete=off type=search placeholder=過濾 onchange=onDeviceSearchChanged(event) onclick=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) style=padding:2px;margin:0;height:20px;background-color:#fff>&nbsp; <label class=noselect><input type=checkbox id=RealNameCheckBox onclick=onRealNameCheckBox()>操作系統名稱</label> <label class=noselect><input type=checkbox id=OnlineCheckBox onclick=onOnlineCheckBox(event)>線上</label></div></div></div><div id=p3 style=display:none;position:absolute;bottom:0;top:0;width:100%><table cellspacing=0 style=margin:0;padding:0;border-spacing:0;border:0><tr style=padding:0><td style=padding:0;color:#c8c8c8;text-align:center;cursor:pointer width=60px valign=top onclick=goBack()><div style=padding:0;background-color:#036;width:10px;height:10px;float:right;border:0><div class=menucurve></div></div><div style="padding:0;font-size:25px;background-color:#036;width:50px;border-radius:0 0 10px 0;height:36px">◀</div><td><div style=margin-left:5px><strong style=font-size:large><span id=p3userName></span></strong><br></div></table><div id=p3info style=overflow-y:auto;position:absolute;top:55px;bottom:0;width:100%><img id=p2AccountImage alt=""width=128 height=128 onclick=account_manageImage(0) src=images/user-256.png style="position:absolute;right:8px;top:7px;border-radius:8px;box-shadow:0 0 7px #000"><div style=margin-left:8px><div id=p3AccountActions><div id=p2AccountSecurity style=display:none><p><strong>帳號安全</strong><div style=margin-left:9px;margin-bottom:8px><div id=managePhoneNumber1 style=margin-top:5px;display:none><a onclick=account_managePhone() style=cursor:pointer>管理電話號碼</a> <span id=authPhoneNumberCheck><strong>✓</strong></span></div><div id=manageEmail2FA style=margin-top:5px;display:none><a onclick=account_manageAuthEmail() style=cursor:pointer>管理電郵身份驗證</a> <span id=authEmailSetupCheck><strong>✓</strong></span></div><div style=margin-top:5px><a href=# onclick=account_showLocalizationSettings()>本地化設置</a></div><div id=manageAuthApp style=margin-top:5px;display:none><a onclick=account_manageAuthApp() style=cursor:pointer>管理身份驗證器軟體</a> <span id=authAppSetupCheck><strong>✓</strong></span></div><div id=manageOtp style=margin-top:5px;display:none><a onclick=account_manageOtp(0) style=cursor:pointer>管理備用碼</a> <span id=authCodesSetupCheck><strong>✓</strong></span></div></div></div><div id=p2AccountActions style=display:none><p><strong>帳戶動作</strong><div style=margin-left:9px;margin-bottom:8px><div style=margin-top:5px><span id=viewPreviousLogins><a onclick="return account_viewPreviousLogins()"style=cursor:pointer>查看以前的登錄</a></span></div><div style=margin-top:5px><span id=managePhoneNumber2 style=display:none><a onclick=account_managePhone() style=cursor:pointer>管理電話號碼</a></span></div><div style=margin-top:5px><span id=verifyEmailId style=display:none><a onclick=account_showVerifyEmail() style=cursor:pointer>驗證電郵</a></span></div><span id=p2AccountPassActions><div style=margin-top:5px><span id=changeEmailId style=display:none><a onclick=account_showChangeEmail() style=cursor:pointer>更改電郵地址</a></span></div><div style=margin-top:5px><a onclick=account_showChangePassword() style=cursor:pointer>更改密碼</a><span id=p2nextPasswordUpdateTime></span></div><div style=margin-top:5px><a onclick=account_showDeleteAccount() style=cursor:pointer>刪除帳戶</a></div></span><div style=margin-top:5px id=setDarkModeLink><a onclick=toggleNightMode() style=cursor:pointer>設置暗模式</a></div><div style=margin-top:5px><a onclick=showNotes(!1) style=cursor:pointer>個人筆記</a></div></div><br style=clear:both></div></div><strong>裝置群</strong> <span id=p3createMeshLink1>( <a onclick=account_createMesh() style=cursor:pointer><img src=images/icon-addnew.png width=12 height=12 border=0> 新</a> )</span><br><br><div id=p3meshes></div><div id=p3noMeshFound style=margin-left:9px;display:none>沒有裝置群。<span id=p3createMeshLink2> <a onclick=account_createMesh() style=cursor:pointer><strong>從這裡開始！</strong></a></span></div><br style=clear:both></div></div></div><div id=p5 style=display:none><table cellspacing=0 style=margin:0;padding:0;border-spacing:0;border:0><tr style=padding:0><td style=padding:0;color:#c8c8c8;text-align:center;cursor:pointer width=60px valign=top onclick=goBack()><div style=padding:0;background-color:#036;width:10px;height:10px;float:right;border:0><div class=menucurve></div></div><div style="padding:0;font-size:25px;background-color:#036;width:50px;border-radius:0 0 10px 0;height:36px">◀</div><td><img src=/images/user-50.png width=50 height=50><td><div style=margin-left:5px><strong style=font-size:large>我的檔案</strong><br></div></table><div id=p5myfiles style=position:absolute;top:55px;bottom:0;width:100%><table id=p5toolbar style=width:100%;height:78px cellpadding=0 cellspacing=0><tr><td style=width:100%;background-color:#d3d9d6;text-align:left;padding:4px valign=bottom><div style=width:100%;text-align:center><input type=button style="width:calc(100%/5 - 5px)"id=p5FolderUp disabled onclick=p5folderup() value=上> <input type=button style="width:calc(100%/5 - 5px)"id=p5SelectAllButton disabled onclick=p5selectallfile() value=全選 onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p5RenameFileButton disabled value=改名 onclick=p5renamefile() onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p5DeleteFileButton disabled value=刪除 onclick=p5deletefile() onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p5NewFolderButton disabled value=檔案夾 onclick=p5createfolder() onkeypress=return!1 onkeydown=return!1></div><div style=width:100%;text-align:center><input type=button style="width:calc(100%/5 - 5px)"id=p5UploadButton disabled value=上載 onclick=p5uploadFile() onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p5CutButton disabled value=切 onclick=p5copyFile(1) onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p5CopyButton disabled value=複製 onclick=p5copyFile(0) onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p5PasteButton disabled value=糊 onclick=p5pasteFile() onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p5RefreshButton value=刷新 onclick=p5refreshFiles() onkeypress=return!1 onkeydown=return!1></div><tr><td style=background-color:#e4e9e7;height:28px><table style=width:100%><tr><td id=p5currentpath style=overflow:hidden;padding-left:4px;padding-top:2px;color:#000><td style=text-align:right;padding-right:4px><select id=p5sortdropdown onchange=updateFiles()><option value=1 selected>按名稱排序<option value=2>按大小排序<option value=3>按日期排序<option value=4>按名稱降序<option value=5>按大小降序<option value=6>按日期降序</select></table></table><div id=p5filetable style="width:100%;height:calc(100% - 102px);overflow:auto;-webkit-user-select:none"><span id=p5files></span></div><table id=p5toolbarBottom style=width:100%;height:22px;position:absolute;bottom:0;background-color:#d3d9d6 cellpadding=0 cellspacing=0><tr><td style=text-align:left;padding:3px>&nbsp;<span id=p5bottomstatus></span><td id=p5rightOfButtons style=text-align:right;padding:3px></table></div></div><div id=p10 style=display:none;position:absolute;bottom:0;top:0;width:100%;overflow:hidden><table id=p10deskTopTable cellspacing=0 style=margin:0;padding:0;border-spacing:0;border:0;position:absolute;top:0><tr style=padding:0><td style=padding:0;color:#c8c8c8;text-align:center;cursor:pointer width=60px valign=top onclick=goBack()><div style=padding:0;background-color:#036;width:10px;height:10px;float:right;border:0><div class=menucurve></div></div><div style="padding:0;font-size:25px;background-color:#036;width:50px;border-radius:0 0 10px 0;height:36px">◀</div><td><a id=MainComputerImage style=cursor:pointer onclick=p10showiconselector()></a><td><div style=margin-left:5px><strong><span id=p10deviceName></span></strong><br><span id=MainComputerState></span></div></table><div id=p10dialog style="z-index:1000;background-color:#eee;box-shadow:0 0 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:30px;width:300px;left:30px;display:none"><div style="width:100%;background-color:#036;color:#fff;border-radius:5px 5px 0 0"><div style=padding:5px>鍵盤快捷鍵自定義</div><div style=width:100%;margin:6px></div></div><div style=margin-right:16px;margin-left:8px><div id=p10dialog2 style=margin:auto;margin:3px></div></div><div style=width:100%;padding:2px;text-align:center><input type=button value="Restore Default Keyboard Shortcuts"onclick=restoreDeskCustomizeKey()></div><div style=padding:10px;margin-bottom:20px><input type=button value=OK style=float:right;width:80px onclick=deskCustomizeKeysEx()></div></div><div id=p10general style=overflow-y:scroll;position:absolute;top:55px;bottom:0;width:100%><div class=deviceNotifyLargeDot><img id=p10deviceStar class=deviceNotifyLargeDotSub src=images/icon-star-notify-40.png width=35 height=35><div id=p10deviceMsg onclick=showDeviceMessages(null,null,event) class=deviceNotifyLargeDotSub></div><img id=p10deviceNotify onclick=showDeviceSessions() class=deviceNotifyLargeDotSub src=images/icon-relay-notify-40.png width=35 height=35> <img id=p10deviceHelp onclick=showDeviceHelpRequests(null,null,event) class=deviceNotifyLargeDotSub src=images/icon-help-notify-40.png width=35 height=35></div><div id=p10deviceBattery class="deviceBatteryLarge deviceBatteryLarge1"></div><div id=p10html style=margin-left:8px;margin-right:8px></div><div id=p10html2></div><div id=p10html3 style=margin-left:8px></div></div><img id=deskkeybutton1 src=images/mobile-desk-exit.png class=deskButton style=top:10px;display:none onclick=exitButton()> <img id=deskkeybutton3a src=images/mobile-desk-menu-open.png class=deskButton style=top:60px;display:none onclick=toggleMenu(!1)> <img id=deskkeybutton3b src=images/mobile-desk-menu-close.png class=deskButton style=top:60px;display:none onclick=toggleMenu(!0)> <img id=deskkeybutton4a src=images/mobile-desk-mouse-left.png class=deskButton style=top:110px;display:none onclick=deskChangeMouseButton(0)> <img id=deskkeybutton4b src=images/mobile-desk-mouse-right.png class=deskButton style=top:110px;display:none onclick=deskChangeMouseButton(1)> <img id=deskkeybutton5a src=images/mobile-desk-scale-out.png class=deskButton style=top:160px;display:none onclick=deskChangeFullscreenZoom()> <img id=deskkeybutton5b src=images/mobile-desk-scale-in.png class=deskButton style=top:160px;display:none onclick=deskChangeFullscreenZoom()> <img id=deskkeybutton2a src=images/mobile-desk-keyboard-open.png class=deskButton style=top:210px;display:none onclick=toggleKeyboard()> <img id=deskkeybutton2b src=images/mobile-desk-keyboard-close.png class=deskButton style=top:210px;display:none onclick=toggleKeyboard()><div style=position:absolute;top:0;left:0;z-index:200;opacity:0;width:1px;height:1px><input id=softKeyboard autocapitalize=off autocomplete=off inputmode=text spellcheck=false style=z-index:200;opacity:0;width:1px;height:1px onfocus=keyboardFocusChange() onblur=keyboardFocusChange()></div><div id=deskButtonMenu style=display:none;position:absolute;top:10px;left:10px;right:55px;bottom:10px;z-index:1000></div><div id=p10desktop style=overflow:hidden;position:absolute;top:55px;bottom:0;width:100%;display:none><div id=deskarea1 style=position:absolute;top:0;width:100%;height:32px><div style=padding-top:2px;padding-bottom:2px;background:silver;height:32px><div style=float:right;text-align:right><span id=p14power></span>&nbsp; <input type=button id=deskFullScreen value=全屏 onclick=deskToggleFull(event) onkeypress=return!1 onkeydown=return!1 disabled style=height:28px;margin-right:3px></div><div style=margin-left:3px><input type=button id=connectbutton1 value=連接 onclick=connectDesktop(event,3) onkeypress=return!1 onkeydown=return!1 disabled style=height:28px> <input type=button id=connectbutton1h value=硬件連接 onclick=connectDesktop(event,2) onkeypress=return!1 onkeydown=return!1 disabled style=height:28px> <input type=button id=disconnectbutton1 value=斷線 onclick=connectDesktop(event,0) onkeypress=return!1 onkeydown=return!1 style=height:28px> <span id=deskstatus style=color:#000>已斷線</span></div></div></div><div id=deskarea3 style="position:absolute;top:32px;width:100%;height:calc(100% - 64px);background-color:#000;text-align:center"><div id=DeskParent style=height:100%><canvas id=Desk width=640 height=200 style=width:100%;-ms-touch-action:none;margin-left:0 oncontextmenu=return!1 onmousedown=dmousedown(event) onmouseup=dmouseup(event) onmousemove=dmousemove(event) onmousewheel=dmousewheel(event)></canvas></div><div id=p11DeskConsoleMsg style=display:none;cursor:pointer;position:absolute;left:30px;top:17px;color:#ff0;background-color:rgba(0,0,0,.6);padding:10px;border-radius:5px;text-align:left onclick=p11clearConsoleMsg()></div><div id=p11DeskSessionSelector style=display:none;position:absolute;left:30px;top:17px;right:30px;bottom:17px;overflow-y:auto></div></div><div id=deskarea4 style=position:absolute;bottom:0;width:100%;height:32px><div style=padding-top:2px;padding-bottom:2px;background:silver><div style=float:right;text-align:right;padding-right:2px><span id=DeskLockButton><img src=images/icon-lock.png onclick=deviceLockFunction() height=16 width=16 style=padding-top:5px;cursor:pointer></span><span id=DeskChatButton><img src=images/icon-chat.png onclick=deviceChat(event) height=16 width=16 style=padding-top:5px;cursor:pointer></span>&nbsp; <span id=DeskToastButton><img src=images/icon-notify.png onclick=deviceToastFunction() height=16 width=16 style=padding-top:5px;cursor:pointer></span>&nbsp; <span id=DeskOpenWebButton><img src=images/icon-url2.png onclick=deviceUrlFunction() height=16 width=16 style=padding-top:5px;cursor:pointer></span>&nbsp; <span id=DeskRunButton><img src=images/icon-play.png onclick=runDeviceCmd() height=16 width=16 style=padding-top:5px;cursor:pointer></span></div><div><input id=deskActionsBtn type=button style=margin-left:3px;height:28px onkeypress=return!1 onkeydown=return!1 value=動作 onclick=deviceActionFunction()> <input type=button value=設定 onkeypress=return!1 onkeydown=return!1 onclick=showDesktopSettings() style=height:28px> <input type=button onkeypress=return!1 onkeydown=return!1 value=電源指令... onclick=showPowerActionDlg() style=display:none;height:28px> <input type=button id=DeskScreens value=屏幕 onkeypress=return!1 onkeydown=return!1 onclick=deskSelectScreens() style=display:none;height:28px> <label><span id=DeskControlSpan style=display:none><input id=DeskControl type=checkbox onkeypress=return!1 onkeydown=return!1>輸入</span></label></div></div></div></div><div id=termButtonMenu style=display:none;position:absolute;top:10px;left:10px;right:55px;bottom:10px;z-index:1000></div><div id=p10terminal style=overflow:hidden;position:absolute;top:55px;bottom:0;width:100%;display:none;background-color:#333><div id=termTable style=position:absolute;top:0;bottom:0;left:0;right:0><div id=termarea1><div class=areaHead style=line-height:24px><div class=toright2><input type=button id=termFullScreen value=全屏 onclick=deskToggleFull(event) onkeypress=return!1 onkeydown=return!1 disabled style=height:28px;margin-right:3px><div id=terminalCustomUpperRight style=float:left;margin-right:6px></div></div><div><span id=connectbutton2span style=margin-left:3px><input type=button id=connectbutton2 value=連接 style=height:28px onclick=connectTerminal(event,1) onkeypress=return!1 onkeydown=return!1 disabled></span><span id=connectbutton2sspan style=margin-right:4px><input type=button id=connectbutton2s value="SSH 連接"style=height:28px onclick=connectTerminal(event,3) onkeypress=return!1 onkeydown=return!1 disabled></span><span id=disconnectbutton2span style=margin-left:3px><input type=button id=disconnectbutton2 value=斷線 style=height:28px onclick=connectTerminal(event,0) onkeypress=return!1 onkeydown=return!1></span><span id=termstatus style=line-height:22px>已斷線</span><span id=termtitle></span></div></div></div><div id=termarea3 style="width:100%;height:calc(100% - 60px)"cellpadding=0 cellspacing=0><div id=termarea3x style=width:100%;height:100%><div style=width:100%;height:100%;text-align:left id=termarea3xdiv></div></div></div><div id=termarea4 style=position:relative;height:32px><div class=areaFoot><div class=toright2></div><div style=height:28px><input id=termActionsBtn style=margin-left:3px;height:28px type=button title=在裝置上執行電源操作 onkeypress=return!1 onkeydown=return!1 value=動作 onclick=deviceActionFunction()> <input id=ctrlcbutton style=margin-left:3px;height:28px type=button onkeypress=return!1 onkeydown=return!1 value=Ctl-C onclick='termSendKey(3,"ctrlcbutton")'> <input id=ctrlxbutton style=margin-left:3px;height:28px type=button onkeypress=return!1 onkeydown=return!1 value=Ctl-X onclick='termSendKey(24,"ctrlxbutton")'> <input id=escbutton style=margin-left:3px;height:28px type=button onkeypress=return!1 onkeydown=return!1 value=ESC onclick='termSendKey(27,"escbutton")'></div></div></div><div id=p12TermConsoleMsg style=display:none;cursor:pointer;position:absolute;left:30px;top:45px;color:#ff0;background-color:rgba(0,0,0,.6);padding:10px;border-radius:5px onclick=p12clearConsoleMsg()></div></div></div><div id=p10files style=position:absolute;top:55px;bottom:0;width:100%;display:none><table id=p13toolbar style=width:100%;height:111px cellpadding=0 cellspacing=0><tr><td style="background-color:silver;border-bottom:2px solid #000;padding:2px;line-height:24px"><div style=float:right;text-align:right><input id=filesActionsBtn type=button onkeypress=return!1 onkeydown=return!1 value=動作 onclick=deviceActionFunction() style=margin-right:2px><div id=filesCustomUpperRight style=float:left;margin-right:6px></div></div><div style=margin-left:2px><input id=p13AutoConnect value=自動連接 onclick=autoConnectFiles(event) onkeypress=return!1 onkeydown=return!1 type=button style=display:none> <input id=p13Connect value=連接 onclick=connectFiles(event,1) onkeypress=return!1 onkeydown=return!1 type=button> <input id=p13Connects value="SFTP 連接"onclick=connectFiles(event,2) onkeypress=return!1 onkeydown=return!1 type=button> <input id=p13Disconnect value=斷線 onclick=connectFiles(event) onkeypress=return!1 onkeydown=return!1 type=button> <span class=textOverGray id=p13Status>已斷線</span></div><tr><td style=width:100%;background-color:#d3d9d6;text-align:left;padding:4px valign=bottom><div style=width:100%;text-align:center><input type=button style="width:calc(100%/5 - 5px)"id=p13FolderUp disabled onclick=p13folderup() value=上> <input type=button style="width:calc(100%/5 - 5px)"id=p13SelectAllButton disabled onclick=p13selectallfile() value=全選 onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p13RenameFileButton disabled value=改名 onclick=p13renamefile() onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p13DeleteFileButton disabled value=刪除 onclick=p13deletefile() onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p13NewFolderButton disabled value=檔案夾 onclick=p13createfolder() onkeypress=return!1 onkeydown=return!1></div><div style=width:100%;text-align:center><input type=button style="width:calc(100%/5 - 5px)"id=p13UploadButton disabled value=上載 onclick=p13uploadFile() onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p13CutButton disabled value=切 onclick=p13copyFile(1) onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p13CopyButton disabled value=複製 onclick=p13copyFile(0) onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p13PasteButton disabled value=糊 onclick=p13pasteFile() onkeypress=return!1 onkeydown=return!1> <input type=button style="width:calc(100%/5 - 5px)"id=p13RefreshButton disabled value=刷新 onclick=p13folderup(9999) onkeypress=return!1 onkeydown=return!1></div><tr><td style=background-color:#e4e9e7;height:28px><table style=width:100%><tr><td id=p13currentpath style=overflow:hidden;padding-left:4px;padding-top:2px;color:#000><td style=text-align:right;padding-right:4px><select id=p13sortdropdown onchange=p13updateFiles()><option value=1 selected>按名稱排序<option value=2>按大小排序<option value=3>按日期排序<option value=4>按名稱降序<option value=5>按大小降序<option value=6>按日期降序</select></table></table><div id=p13FilesConsoleMsg style=display:none;cursor:pointer;position:absolute;left:30px;top:165px;color:#ff0;background-color:rgba(0,0,0,.6);padding:10px;border-radius:5px onclick=p13clearConsoleMsg()></div><div id=p13filetable style="width:100%;height:calc(100% - 133px);overflow:auto;-webkit-user-select:none"><span id=p13files></span></div><table id=p13toolbarBottom style=width:100%;height:22px;position:absolute;bottom:0 cellpadding=0 cellspacing=0><tr><td style=text-align:left;padding:3px;text-align:center;background-color:#d3d9d6;color:#000>&nbsp;<span id=p13bottomstatus></span></table></div><div id=p10details style=overflow-y:scroll;position:absolute;top:55px;bottom:0;width:100%><div id=p10detailshtml style=margin-left:-3px></div></div><div id=p10console style=overflow:hidden;position:absolute;top:55px;bottom:0;width:100%><table id=consoleTable cellpadding=0 cellspacing=0><tr style=height:28px><td class=areaHead><div class=toright2><div id=p15coreName></div><input type=button id=p15uploadCore value=代理指令 onclick=p15uploadCore(event)></div><div id=p15statetext></div><tr><td id=p15agentConsole style=position:relative><pre id=p15agentConsoleText></pre><tr style=height:28px><td class=areaFoot><table style=width:100%><tr><td style=width:99%><input id=p15consoleText style=width:100%;box-sizing:border-box onkeyup=p15consoleSend(event)><td id=p15outputselecttd><select id=p15outputselect onchange=setupConsole()><option id=p15outputselect1 value=1>代理<option id=p15outputselect3 value=3>推<option id=p15outputselect2 value=2>MQTT</select><td style=width:1%><input id=id_p15consoleClear type=button class=bottombutton value=清除 onclick=p15consoleClear()></table></table></div></div><div id=p20 style=display:none;position:absolute;bottom:0;top:0;width:100%><table cellspacing=0 style=margin:0;padding:0;border-spacing:0;border:0;position:absolute;top:0><tr style=padding:0><td style=padding:0;color:#c8c8c8;text-align:center;cursor:pointer width=60px valign=top onclick=goBack()><div style=padding:0;background-color:#036;width:10px;height:10px;float:right;border:0><div class=menucurve></div></div><div style="padding:0;font-size:25px;background-color:#036;width:50px;border-radius:0 0 10px 0;height:36px">◀</div><td onclick=p20editmesh(1)><img src=/images/meshicon50.png width=50 height=50><td onclick=p20editmesh(1)><div style=margin-left:5px><strong style=font-size:large><span id=p20meshName></span></strong><br></div></table><div style=overflow-y:auto;position:absolute;top:55px;bottom:0;left:0;right:0><div id=p20info style=margin-left:8px;margin-right:8px></div></div></div></div></div><div id=footer style=height:32px;width:100%;text-align:center;background-color:#113962;position:absolute;bottom:0><table id=footerMenu cellpadding=0 cellspacing=0 style=height:32px;width:100%;color:#fff;cursor:pointer;table-layout:fixed></table></div></div><div id=dialog style=display:none><div style="width:100%;background-color:#036;color:#fff;border-radius:5px 5px 0 0"><div id=id_dialogclose style=float:right;padding:5px;cursor:pointer onclick=setDialogMode()><b>X</b></div><div id=id_dialogtitle style=padding:5px></div><div style=width:100%;margin:6px></div></div><div style=margin-right:16px;margin-left:8px><div id=dialog1 style=margin:auto;text-align:center;margin:3px><div id=id_dialogMessage style=padding:10px></div></div><div id=dialog2 style=margin:auto;margin:3px><div id=id_dialogOptions></div></div><div id=dialog3 style=margin:auto;margin:3px><select id=deskkeys style=width:100%><option value=10>Ctrl + Alt + Del<option value=11>Tab<option value=5>Win<option value=0>Win+向下<option value=1>Win+向上<option value=2>Win+L<option value=3>Win+M<option value=4>Shift + Win + M<option value=6>Win+R<option value=7>Alt-F4<option value=8>Ctrl-W<option value=9>Alt-Tab<option value=12>Shift-F10</select></div><div id=dialog4 style=margin:auto;margin:3px><div id=d3upload><div>檔案選擇</div><select id=d3uploadMode onchange=d3modechange()><option value=1>本地檔案上傳<option value=2>伺服器檔案選擇</select></div><div id=d3localmode style=display:none><div>上載檔案</div><form id=d3localmodeform method=post enctype=multipart/form-data action=uploadfile.ashx target=fileUploadFrame><input id=d3auth name=auth style=display:none> <input id=d3filter name=filter style=display:none> <input id=d3attrib name=attrib style=display:none> <input type=file id=d3localFile name=files onchange=d3setActions()> <input type=submit id=d3submit style=display:none></form></div><div id=d3servermode><div id=d3serveraction valign=bottom><input type=button id=p3FolderUp disabled onclick=d3folderup() value=上>&nbsp;<span id=p3CurrentFolder></span></div><div id=d3serverfiles></div></div></div><div id=dialog7 style=margin:auto;margin:3px><div id=d7meshkvm><h4 style="width:100%;border-bottom:1px solid gray">代理遠程桌面</h4><table style=width:100%><tr><td>品質<td style=width:100px><select id=d7bitmapquality style=float:right;width:200px dir=rtl></select><tr><td>縮放比例<td style=width:100px><select id=d7bitmapscaling style=float:right;width:200px dir=rtl><option selected value=1024>100％<option value=896>87.5％<option value=768>75％<option value=640>62.5％<option value=512>50％<option value=384>37.5％<option value=256>25％<option value=128>12.5％</select><tr><td>率<td style=width:100px><select id=d7framelimiter style=float:right;width:200px dir=rtl><option selected value=50>快速<option value=100>中<option value=400>慢<option value=1000>非常慢</select><tr><td>編碼<td style=width:100px><select id=d7encoding style=float:right;width:200px dir=rtl><option value=1>JPEG<option value=2>PNG<option value=3>TIFF<option selected value=4>WEBP</select><tr><td><td><label style=display:block id=d7deskAutoLockLabel><input type=checkbox id=d7deskAutoLock>斷開連接鎖定</label></table></div><div id=d7amtkvm><h4 style="width:100%;border-bottom:1px solid gray">Intel® AMT硬件KVM</h4><table style=width:100%><tr><td>編碼<td style=width:100px><select id=d7desktopmode style=float:right;width:200px><option value=1>RLE8，最快<option value=2>RLE16，推薦<option value=3>RAW8，慢<option value=4>RAW16，非常慢</select></table></div></div></div><div id=idx_dlgButtonBar style=padding:10px;margin-bottom:20px><input id=idx_dlgCancelButton type=button value=取消 style=float:right;width:80px;margin-left:5px onclick=dialogclose(0)> <input id=idx_dlgOkButton type=button value=OK style=float:right;width:80px onclick=dialogclose(1)><div><input id=idx_dlgDeleteButton type=button value=刪除 style=display:none onclick=dialogclose(2)></div></div></div><div id=topMenu style="z-index:1000;background-color:#eee;box-shadow:0 0 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:0 0 5px 5px;position:fixed;top:50px;right:5px;width:170px;display:none"><div style="padding:12px;border-top:1px solid gray;color:#000;cursor:pointer"onclick=topMenu(2)>我的檔案</div><div style="padding:12px;border-top:1px solid gray;color:#000;cursor:pointer"onclick=topMenu(1)>我的帳戶</div><div id=logoutMenuOption><a id=logoutMenuOptionRef href=/logout><div style="padding:12px;border-top:1px solid gray;color:#000;cursor:pointer">登出</div></a></div></div><audio id=chimes><source src=sounds/chimes.mp3 type=audio/mp3></audio><iframe name=fileUploadFrame style=display:none></iframe><script>"use strict";var random="{{{randomlength}}}",webState="{{{webstate}}}";for(var i in""!=webState&&(webState=JSON.parse(decodeURIComponent(webState))),webState)try{localStorage.setItem(i,webState[i])}catch(e){}if(webState&&!webState.loctag)try{localStorage.removeItem("loctag")}catch(e){}var urlargs=parseUriArgs();null!=urlargs.key&&(urlargs.key=""+urlargs.key),urlargs.key&&0==isAlphaNumeric(urlargs.key)&&delete urlargs.key,urlargs.locale&&0==isAlphaNumeric(urlargs.locale)&&delete urlargs.locale,delete urlargs.user,delete urlargs.pass,delete urlargs.viewmode,delete urlargs.gotonode,delete urlargs.gotodevicename,delete urlargs.gotodevicername,delete urlargs.gotodeviceip,delete urlargs.gotomesh,delete urlargs.panel;var args=parseUriArgs();args.key&&0==isAlphaNumeric(args.key)&&delete args.key,args.locale&&0==isAlphaNumeric(args.locale)&&delete args.locale;var debugLevel=parseInt("{{{debuglevel}}}"),features=parseInt("{{{features}}}"),features2=parseInt("{{{features2}}}"),features3=parseInt("{{{features3}}}"),sessionTime=parseInt("{{{sessiontime}}}"),sessionRefreshTimer=null,domain="{{{domain}}}",domainUrl="{{{domainurl}}}",authCookie="{{{authCookie}}}",authRelayCookie="{{{authRelayCookie}}}",logoutControls=JSON.parse(decodeURIComponent("{{{logoutControls}}}")),authCookieRenewTimer=null,webRelayPort=parseInt("{{{webRelayPort}}}"),hidePowerTimeline="{{{hidePowerTimeline}}}",webRelayDns="{{{webRelayDns}}}",meshserver=null,xdr=null,usergroups=null,stars={},serverinfo=null,nodes=[],meshes={},filetree={},userinfo=null,users=(serverinfo=null,null),nodeShortIdent=0,serverPublicNamePort="{{{serverDnsName}}}:{{{serverPublicPort}}}",debugmode=!1,attemptWebRTC=!!(128&features),webrtcconfiguration="{{{webrtcconfig}}}";if(""==webrtcconfiguration)webrtcconfiguration=null;else try{webrtcconfiguration=JSON.parse(decodeURIComponent(webrtcconfiguration))}catch(e){console.log('Invalid WebRTC config: "'+webrtcconfiguration+'".'),webrtcconfiguration=null}var files,terminal,StatusStrs=["已斷線","正在連線...","設定...","已連接","Intel&reg; AMT已連接"],agentsStr=["未知","Windows 32位控制台","Windows 64位控制台","Windows 32位服務","Windows 64位服務","Linux 32位","Linux 64位","MIPS","XENx86","Android","Linux ARM","macOS x86-32位","安卓x86","PogoPlug ARM","Android","Linux Poky x86-32位","macOS x86-64位","ChromeOS","Linux Poky x86-64位","Linux NoKVM x86-32位","Linux NoKVM x86-64位","Windows MinCore控制台","Windows MinCore服務","NodeJS","ARM-Linaro","ARMv6l / ARMv7l","ARMv8 64位","ARMv6l / ARMv7l / NoKVM","MIPS24KC（OpenWRT）","蘋果矽","FreeBSD x86-64","未知","Linux ARM 64 bit","Alpine Linux x86 64 Bit (MUSL)","助理（Windows）","Armada370 - ARM32/HF (libc/2.26)","OpenWRT x86-64","OpenBSD x86-64","未知","未知","MIPSEL24KC (OpenWRT)","ARMADA/CORTEX-A53/MUSL (OpenWRT)","Windows ARM 64bit console","Windows ARM 64bit service","ARMVIRT32 (OpenWRT)","RISC-V x86-64"],domainStates=["沒有","Azure AD","On-Premises AD","Hybrid AD","Microsoft Account"],passRequirements="{{{passRequirements}}}";""!=passRequirements&&(passRequirements=JSON.parse(decodeURIComponent(passRequirements)));var deskPinchZoom,sessionActivity=Date.now(),deskKeyboardShortcuts=[],nightMode=setNightMode(),xterm=null,xtermfit=null,xtermimage=null,xtermResizeTimer=null,devicePagingState=null,p11DeskConsoleMsgTimer=null,p12TermConsoleMsgTimer=null,p13FilesConsoleMsgTimer=null,webpSupport=!1;function startup(){if(!(32&features)){var e=null;try{e=top.location.toString().toLowerCase()}catch(e){}if(top!=self&&(null==e||0==top.active))return void(top.location=self.location)}if(!args.locale){var t=getstore("loctag",0);null!=t&&"*"!=t&&(args.locale=t)}window.onresize=center,center(),QV("changeEmailId",!(2097152&features)),QH("p1message","正在連線..."),go(1),document.onkeypress=ondeskkeypress,document.onkeydown=ondeskkeydown,document.onkeyup=ondeskkeyup,document.onclick=function(e){999==xxdialogMode&&"topMenuIcon"!=e.target.id&&(QV("topMenu",!1),xxdialogMode=0)},(meshserver=MeshServerCreateControl(domainUrl)).onStateChanged=onStateChanged,meshserver.onMessage=onMessage,meshserver.trace=args.trace,meshserver.Start();try{stars=JSON.parse(getstore("stars","{}"))}catch(e){}logoutControls&&logoutControls.logoutUrl&&(Q("logoutMenuOptionRef").href=logoutControls.logoutUrl);var n=localStorage.getItem("desktopsettings");null!=n&&(desktopsettings=JSON.parse(n)),applyDesktopSettings(),null!=args.webrtc&&(attemptWebRTC=1==args.webrtc),sessionTime>=10&&(sessionRefreshTimer=setTimeout(refreshCookieSession,Math.round(6e4*sessionTime*.8))),QV("setDarkModeLink",!(3145728&features2)),deskKeyboardShortcuts=[];var o=getstore("deskKeyShortcuts","0x0A002E,0x100000,0x100028,0x100026,0x10004C,0x10004D,0x11004D,0x100052,0x020073,0x080057,0x020009,0x100025,0x100027").split(",");for(var i in o)deskKeyboardShortcuts.push(parseInt(o[i]));updateDeskShortcutKeys(),updateTermShortcutKeys()}function refreshCookieSession(){var e=null;try{e=new XDomainRequest}catch(e){}e||(e=new XMLHttpRequest),e.open("GET",window.location.origin+domainUrl+"refresh.ashx"),e.timeout=15e3,e.onload=function(){sessionRefreshTimer=setTimeout(refreshCookieSession,Math.round(6e4*sessionTime*.8))},e.onerror=e.ontimeout=function(){sessionRefreshTimer=null},e.send()}function onStateChanged(e,t,n,o){if(0==t){if(setDialogMode(0),go(0),deleteAllNotifications(),"noauth"==o)return void QH("p0span","無法執行身份驗證");2==n?setTimeout(serverPoll,5e3):QH("p0span","無法連接網絡插座"),null!=authCookieRenewTimer&&(clearInterval(authCookieRenewTimer),authCookieRenewTimer=null),devicePagingState=null,updateDevicePageState()}else 2==t&&(meshserver.send({action:"usergroups"}),meshserver.send({action:"meshes"}),meshserver.send({action:"nodes",skip:null==devicePagingState?0:devicePagingState.skip}),meshserver.send({action:"files"}),authCookieRenewTimer=setInterval(function(){meshserver.send({action:"authcookie"})},18e5));QV("topMenuIcon",2==t)}function serverPoll(){xdr=null;try{xdr=new XDomainRequest}catch(e){}xdr||(xdr=new XMLHttpRequest),xdr.open("HEAD",window.location.href),xdr.timeout=15e3,xdr.onload=function(){xdr.status<500?reload():setTimeout(serverPoll,1e4)},xdr.onerror=xdr.ontimeout=function(){setTimeout(serverPoll,1e4)},xdr.send()}function updateSelf(){var e=!!(256&features2);if(userinfo&&(e=4294967295!=userinfo.siteadmin&&!!(1024&userinfo.siteadmin)||!!(256&features2)),QV("p3AccountActions",!(4&features)&&0==serverinfo.domainauth&&0==e),QV("logoutMenuOption",!(4&features)&&0==serverinfo.domainauth),QV("p2AccountSecurity",!(4&features||0!=serverinfo.domainauth||!(4096&features)||0!=e)),QV("p2AccountImage",!e),QV("verifyEmailId",!0!==userinfo.emailVerified&&null!=userinfo.email&&1==serverinfo.emailcheck),QV("manageAuthApp",1!=serverinfo.lock2factor&&4096&features&&(1==userinfo.otpsecret||!(131072&features2))),QV("manageOtp",1!=serverinfo.lock2factor&&!(262144&features2)&&4096&features&&(1==userinfo.otpsecret||userinfo.otphkeys>0)),QV("authPhoneNumberCheck",null!=userinfo.phone),QV("authEmailSetupCheck",1==userinfo.otpekey&&null!=userinfo.email&&1==userinfo.emailVerified),QV("authAppSetupCheck",1==userinfo.otpsecret),QV("authCodesSetupCheck",userinfo.otpkeys>0),QV("p2AccountActions",!(4&features)&&0==serverinfo.domainauth&&null!=userinfo),QV("p2AccountPassActions",!(4&features)&&0==serverinfo.domainauth&&null!=userinfo&&0==userinfo._id.split("/")[2].startsWith("~")),QV("p3createMeshLink1",!1),QV("p3createMeshLink2",!1),null!=userinfo.flags&&1&userinfo.flags?(null==userinfo.accountImageRnd&&(userinfo.accountImageRnd=Math.floor(9999999999*Math.random())),Q("p2AccountImage").src="userimage.ashx?rnd="+userinfo.accountImageRnd):Q("p2AccountImage").src="images/user-256.png","number"==typeof userinfo.passchange)if(-1==userinfo.passchange)QH("p2nextPasswordUpdateTime"," -下次登入時重置。");else if(null!=passRequirements&&"number"==typeof passRequirements.reset){var t=userinfo.passchange+86400*passRequirements.reset-Math.floor(Date.now()/1e3);if(t<0)QH("p2nextPasswordUpdateTime"," -下次登入時重置。");else if(t<3600){var n=Math.floor(t/60);QH("p2nextPasswordUpdateTime",format(1==n?" - 1分鐘後重設。":" - 在{0}分鐘內重置。",n))}else if(t<86400){var o=Math.floor(t/3600);QH("p2nextPasswordUpdateTime",format(1==o?" - 1小時後重設。":" - 在{0}小時內重置。",o))}else{var i=Math.floor(t/86400);QH("p2nextPasswordUpdateTime",format(1==o?" - 1天后重設。":" - 在{0}天內重置。",i))}}}function setSessionActivity(){sessionActivity=Date.now()}function checkIdleSessionTimeout(){Date.now()-sessionActivity>serverinfo.timeout&&(null!=desktop&&(desktop.Stop(),desktopNode=desktop=null),null!=terminal&&(terminal.Stop(),terminal=null),null!=files&&(files.Stop(),files=null),serverinfo.logoutonidlesessiontimeout&&(urlargs.key?window.location.href="logout?key="+urlargs.key:window.location.href="logout"))}function onMessage(e,t){switch(t.action){case"serverinfo":if((serverinfo=t.serverinfo).timeout&&(setInterval(checkIdleSessionTimeout,1e4),checkIdleSessionTimeout()),null!=userinfo&&updateSelf(),null!=serverinfo.certExpire){var n=Math.floor((serverinfo.certExpire-Date.now())/864e5);n>=0&&n<20&&addNotification({text:format("證書將在 {0} 天后到期",n)})}QV("manageEmail2FA",8388608&features&&1!=serverinfo.lock2factor),QV("managePhoneNumber1",33554432&features&&67108864&features&&1!=serverinfo.lock2factor),QV("managePhoneNumber2",33554432&features&&!(67108864&features)&&1!=serverinfo.lock2factor);break;case"authcookie":authCookie=t.cookie,authRelayCookie=t.rcookie;break;case"userinfo":userinfo=t.userinfo,QH("p3userName",userinfo.name),null!=serverinfo&&updateSelf();break;case"users":for(var o in users={},t.users)users[t.users[o]._id]=t.users[o];null!=currentUser&&(currentUser=users[currentUser._id]),updateUsers();break;case"wssessioncount":wssessions=t.wssessions,updateUsers();break;case"meshes":for(var o in meshes={},t.meshes)meshes[t.meshes[o]._id]=t.meshes[o];null!=currentMesh&&(currentMesh=meshes[currentMesh._id]),updateMeshes(),mainUpdate(4);break;case"usergroups":var i=0;if(Array.isArray(t.ugroups)){for(var a in usergroups={},t.ugroups)i++,usergroups[t.ugroups[a]._id]=t.ugroups[a];0==i&&(usergroups=null)}else{for(var a in usergroups=t.ugroups,t.ugroups)i++;0==i&&(usergroups=null)}break;case"files":filetree=setupBackPointers(t.filetree),updateFiles();break;case"nodes":for(var o in nodes=[],t.nodes)for(var s in t.nodes[o])t.nodes[o][s].namel=t.nodes[o][s].name.toLowerCase(),t.nodes[o][s].rname?t.nodes[o][s].rnamel=t.nodes[o][s].rname.toLowerCase():t.nodes[o][s].rnamel=t.nodes[o][s].namel,t.nodes[o][s].meshnamel=meshes[o]?meshes[o].name.toLowerCase():"*",t.nodes[o][s].meshid=o,t.nodes[o][s].state=t.nodes[o][s].state?t.nodes[o][s].state:0,t.nodes[o][s].desc=t.nodes[o][s].desc,t.nodes[o][s].icon||(t.nodes[o][s].icon=1),t.nodes[o][s].ident=++nodeShortIdent,nodes.push(t.nodes[o][s]);null!=currentNode&&0==IsNodeViewable(currentNode)&&(currentNode=null,go(2)),null!=currentNode&&(null!=(currentNode=getNodeFromId(currentNode._id))?gotoDevice(currentNode._id,xxcurrentView,!0):go(2)),devicePagingState=null==t.totalcount?null:{total:t.totalcount,skip:t.skip,limit:t.limit},updateDevicePageState(),mainUpdate(4),0==xxcurrentView&&go(parseInt("{{viewmode}}")),gotoDevice("{{currentNode}}",parseInt("{{viewmode}}"));break;case"powertimeline":if(t.nodeid!=powerTimelineReq)break;for(var a in powerTimelineNode=t.nodeid,powerTimeline=t.timeline,powerTimelineUpdate=Date.now()+3e5,powerTimeline)a%2==1&&(powerTimeline[a]=1e3*powerTimeline[a]);currentNode._id==t.nodeid&&drawDeviceTimeline();break;case"getsysinfo":if(t.nodeid!=powerTimelineReq)break;!0===t.noinfo?updateDeviceDetails(getNodeFromId(t.nodeid)):(t.hardware.time=t.time,updateDeviceDetails(getNodeFromId(t.nodeid),t.hardware));break;case"lastconnect":null!=(b=getNodeFromId(t.nodeid))&&(b.lastconnect=t.time,b.lastaddr=t.addr);break;case"msg":if(null!=t.nodeid){var l=-1;if(null!=nodes)for(var a in nodes)if(nodes[a]._id==t.nodeid){l=a;break}if(-1!=l)if("console"==t.type)p15consoleReceive(nodes[l],t.value,t.source);else if("notify"==t.type){if(!(8&(s=getstore("notifications",0)))&&null!=t.amtMessage)break;s={text:t.value,title:t.title,icon:t.icon,titleid:t.titleid,msgid:t.msgid,args:t.args};null!=t.id&&(s.id=t.id),null!=t.nodeid&&(s.nodeid=t.nodeid),null!=t.tag&&(s.tag=t.tag),null!=t.url&&(s.url=t.url),null!=t.username&&(s.username=t.username),"number"==typeof t.maxtime&&(s.maxtime=t.maxtime),addNotification(s)}else if("userSessions"==t.type&&null!=currentNode&&currentNode._id==t.nodeid&&null==desktop){var r=[];if(null!=t.data)for(var a in t.data)"Active"!=t.data[a].State&&"Console"!=t.data[a].StationName&&3!=debugmode||r.push(t.data[a]);if(0==r.length)connectDesktop(null,1,null,t.tag);else if(1==r.length)connectDesktop(null,1,r[0].SessionId,t.tag);else{var d="",u="{{{userSessionsSort}}}";for(var a in r.sort(function(e,t){return e[u]?t[u]?e[u]<t[u]?-1:e[u]>t[u]?1:0:1:-1}),r)d+='<div style="text-align:left;cursor:pointer;background-color:gray;margin:5px;padding:5px;border-radius:5px" onclick=connectDesktop(event,1,'+r[a].SessionId+","+t.tag+")>"+r[a].State+", "+r[a].StationName,r[a].Username&&(r[a].Domain?d+=" - "+r[a].Domain+"/"+r[a].Username:d+=" - "+r[a].Username),d+="</div>";QH("p11DeskSessionSelector",d),QV("p11DeskSessionSelector",!0)}}}else if("notify"==t.type){s={text:t.value,title:t.title,icon:t.icon,titleid:t.titleid,msgid:t.msgid,args:t.args};null!=t.id&&(s.id=t.id),null!=t.tag&&(s.tag=t.tag),null!=t.url&&(s.url=t.url),null!=t.username&&(s.username=t.username),"number"==typeof t.maxtime&&(s.maxtime=t.maxtime),addNotification(s)}break;case"getnetworkinfo":if(currentNode._id!=t.nodeid)return;updateDeviceDetails(getNodeFromId(t.nodeid),null,t);break;case"getNotes":if((s=Q("d2devNotes"))&&t.id==decodeURIComponent(s.attributes.noteid.value))t.notes?QH("d2devNotes",decodeURIComponent(t.notes)):QH("d2devNotes",""),0==("true"==s.attributes.ro.value)&&(s.removeAttribute("readonly"),QE("idx_dlgOkButton",!0),QV("idx_dlgOkButton",!0),focusTextBox("d2devNotes"));break;case"otpauth-request":if(2==xxdialogMode&&"otpauth-request"==xxdialogTag)if(null!=t.err){var c=["","2FA被鎖定","備用代碼已鎖定","正在使用的登錄令牌","不允許 OTP 2FA","帳戶已被鎖定","無法加載 OTPLIB"];t.err>0&&t.err<c.length?QH("d2optinfo",c[t.err]):QH("d2optinfo",format("錯誤 #{0}",t.err))}else{var p=t.secret;52==p.length?p=p.split(/(.............)/).filter(Boolean).join(" "):32==p.length&&(p=(p=p.split(/(....)/).filter(Boolean).join(" ")).substring(0,20)+"<br/>"+p.substring(20)),QH("d2optinfo",format('安裝 <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2" rel="noreferrer noopener" target=_blank>Google Authenticator</a> 或兼容的應用軟體，請使用<a href="{0}" rel="noreferrer noopener" target=_blank>此鏈結</a>或在下面輸入密碼。然後，輸入當前的6位數保安編碼以啟動兩步登入。',t.url)+'<br /><br /><div style=width:100%;text-align:center><tt id=d2optsecret secret="'+t.secret+'" style=font-size:15px>'+p+'</tt><br /><br />Token: <input type=text autocomplete="one-time-code" inputmode="numeric" pattern="[0-9]*" onkeypress="return (event.keyCode == 8) || (event.charCode >= 48 && event.charCode <= 57)" onkeyup=account_addOtpCheck(event) onkeydown=account_addOtpCheck() maxlength=6 id=d2otpauthinput type=text></div>'),QV("idx_dlgOkButton",!0),QE("idx_dlgOkButton",!1),Q("d2otpauthinput").focus()}break;case"otpauth-setup":if(xxdialogMode)return;setDialogMode(2,"認證軟體",1,null,t.success?"<b style=color:green>認證軟體啟動成功。</b> 你現在需要一個有效的保安編碼才能再次登入。":"<b style=color:red>兩步登入啟用失敗。</b> 從應用程序中清除秘密，然後重試。你只有幾分鐘的時間來輸入正確的代碼。");break;case"otpauth-clear":if(xxdialogMode)return;setDialogMode(2,"認證軟體",1,null,t.success?"<b>認證軟體已刪除。</b> 你可以隨時重新啟動此功能。":"<b style=color:red>兩步登入啟用刪除失敗。</b> 再試一次。");break;case"otpauth-getpasswords":if(xxdialogMode)return;d="一次性保安編碼可以用作輔助身份驗證。生成一群，打印並保存在安全的地方。";if(d+="<div style='border-radius:6px;border: 2px dashed #888;width:100%;margin-top:8px'><div style='padding:8px;font-family:Arial, Helvetica, sans-serif;font-size:20px;font-weight:bold'><table style=width:100%;text-align:center>",t.passwords){var m=0;for(var a in t.passwords){++m%2&&(d+="<tr>");for(var g=""+t.passwords[a].p;g.length<8;)g="0"+g;!0===t.passwords[a].u?d+="<td>"+g.substring(0,4)+"&nbsp;"+g.substring(4):d+="<td><strike style=color:#BBB>"+g.substring(0,4)+"&nbsp;"+g.substring(4)}}else d+="<tr><td>沒有有效保安編碼";d+="</table></div></div><br />",d+="<div><input type=button value='關' onclick=setDialogMode(0) style=float:right></input>",d+="<input type=button value='新保安編碼' onclick='account_manageOtp(1);'></input>",null!=t.passwords&&(d+="<input type=button value='清除' onclick='account_manageOtp(2);'></input>"),setDialogMode(2,"管理備用碼",8,null,d+="</div><br />","otpauth-manage");break;case"verifyPhone":if(xxdialogMode&&"verifyPhone"!=xxdialogTag)return;d='<table><tr><td><img src="images/phone80.png" style=padding:8px>';d+="<td>Check your phone and enter the verification code.",setDialogMode(2,"電話通知",3,account_managePhoneConfirm,d+='<br /><br /><div style=width:100%;text-align:center>驗證碼： <input type=tel pattern="[0-9]" inputmode="number" maxlength=6 id=d2phoneCodeInput onKeyUp=account_managePhoneCodeValidate() onkeypress="if (event.key==\'Enter\') account_managePhoneCodeValidate(1)"></div></table>',t.cookie),Q("d2phoneCodeInput").focus(),account_managePhoneCodeValidate();break;case"previousLogins":if(2==xxdialogMode&&"previousLogins"==xxdialogTag){d="";var f="BBB";if(0==t.events.length)d+="No previous login.";else{for(var a in d+="<div style=max-height:260px;overflow-y:scroll;overflow-x:hidden>",t.events){107==(o=t.events[a].m)?(o="有效登錄",f="BBD1BB",""):108==o?(o="無效的 2FA",f="DD9DC3","x"):109==o?(o="被鎖定賬戶",f="E1BBBB","x"):110==o&&(o="無效的密碼",f="E1BBBB","x"),d+="<div style=width:260px;background-color:#"+f+";border-radius:6px;margin-bottom:4px;padding:4px><div><b>"+EscapeHtml(o)+"</b><br />"+printDateTime(new Date(t.events[a].t))+"</div><div style=font-size:x-small>"+EscapeHtml(t.events[a].a.join(", "))+"</div></div></tr>"}d+="</div>"}setDialogMode(2,"以前的登錄",1,null,d)}break;case"event":if(t.event.noact)break;switch(t.event.action){case"serverinfochange":null!=t.event.lock2factor&&(serverinfo.lock2factor=t.event.lock2factor,updateSelf());break;case"userWebState":if(null!=localStorage){var h=JSON.parse(t.event.state);for(var a in h)localStorage.setItem(a,h[a]);if(null!=h.stars&&(stars=JSON.parse(h.stars)),null!=h.loctag&&h.loctag!=oldLoctag?(null!=h.loctag?args.locale=h.loctag:delete args.locale,mainUpdate(132)):null!=h.stars&&(mainUpdate(4),"*"==Q("SearchInput").value&&onSearchInputChanged()),currentNode&&refreshDevice(currentNode._id),null!=h.deskKeyShortcuts){deskKeyboardShortcuts=[];var v=h.deskKeyShortcuts.split(",");for(var a in v)deskKeyboardShortcuts.push(parseInt(v[a]));updateDeskShortcutKeys()}}break;case"accountchange":if("object"!=typeof t.event.account||null==t.event.account)return void console.log(t.event);if(userinfo.name==t.event.account.name){t.event.account.siteadmin&&t.event.account.siteadmin,userinfo.siteadmin&&userinfo.siteadmin;(t.event.account.quota!=userinfo.quota||!(8&userinfo.siteadmin)&&8&t.event.account.siteadmin)&&meshserver.send({action:"files"}),userinfo=t.event.account,updateSelf(),t.event.nodeListChange==userinfo._id&&meshserver.send({action:"nodes",skip:null==devicePagingState?0:devicePagingState.skip})}break;case"createusergroup":case"usergroupchange":null==usergroups&&(usergroups={});var k=usergroups[t.event.ugrpid];null==k?usergroups[t.event.ugrpid]={_id:t.event.ugrpid,name:t.event.name,desc:t.event.desc,domain:t.event.domain,links:t.event.links}:(k.name=t.event.name,k.desc=t.event.desc,k.links=t.event.links,k.flags=t.event.flags),meshserver.send({action:"meshes"}),meshserver.send({action:"nodes",skip:null==devicePagingState?0:devicePagingState.skip});break;case"deleteusergroup":if(null!=usergroups&&null!=usergroups[t.event.ugrpid]){delete usergroups[t.event.ugrpid];f=0;for(var a in usergroups)f++;0==f&&(usergroups=null)}break;case"createmesh":null!=meshes[t.event.meshid]||!userinfo.manageAllDeviceGroups&&null==t.event.mesh.links[userinfo._id]||(meshes[t.event.meshid]=t.event.mesh,mainUpdate(132),meshserver.send({action:"files"}));break;case"meshchange":if(null==meshes[t.event.meshid]){var y=!1;for(var a in null!=t.event.links[userinfo._id]&&(y=!0),null!=userinfo.links[t.event.meshid]&&(y=!0),userinfo.links)a.startsWith("ugrp/")&&null!=t.event.links[a]&&(y=!0);y&&(meshes[t.event.meshid]={_id:t.event.meshid,name:t.event.name,mtype:t.event.mtype,desc:t.event.desc,links:t.event.links,relayid:t.event.relayid},meshserver.send({action:"nodes",skip:null==devicePagingState?0:devicePagingState.skip}))}else{if(meshes[t.event.meshid].name!=t.event.name)for(var a in meshes[t.event.meshid].name=t.event.name,nodes)nodes[a].meshid==t.event.meshid&&(nodes[a].meshnamel=t.event.name.toLowerCase());if(meshes[t.event.meshid].desc=t.event.desc,meshes[t.event.meshid].links=t.event.links,null!=t.event.relayid&&(meshes[t.event.meshid].relayid=t.event.relayid),0==IsMeshViewable(t.event.meshid)){20==xxcurrentView&&currentMesh==meshes[t.event.meshid]&&go(2),delete meshes[t.event.meshid];var x=[];for(var a in nodes)(nodes[a].meshid!=t.event.meshid||null!=userinfo.links&&null!=userinfo.links[nodes[a]._id])&&x.push(nodes[a]);nodes=x,xxcurrentView>=10&&xxcurrentView<20&&currentNode&&!IsNodeViewable(currentNode)&&(setDialogMode(0),go(2),currentNode=null)}}mainUpdate(132),meshserver.send({action:"files"}),20==xxcurrentView&&currentMesh._id==t.event.meshid&&p20updateMesh();break;case"deletemesh":meshes[t.event.meshid]&&(delete meshes[t.event.meshid],updateMeshes(),meshserver.send({action:"files"}));x=[];for(var a in nodes)nodes[a].meshid!=t.event.meshid&&x.push(nodes[a]);nodes=x,mainUpdate(4),xxcurrentView>=20&&xxcurrentView<30&&currentMesh._id==t.event.meshid&&(setDialogMode(0),go(2)),xxcurrentView>=10&&xxcurrentView<20&&currentNode&&!IsNodeViewable(currentNode)&&(setDialogMode(0),go(2));break;case"addnode":var b=t.event.node;if(!meshes[b.meshid])break;if(null!=getNodeFromId(b._id))break;b.namel=b.name.toLowerCase(),b.rname?b.rnamel=b.rname.toLowerCase():b.rnamel=b.namel,b.meshnamel=meshes[b.meshid]?meshes[b.meshid].name.toLowerCase():"*",b.state=0,b.icon||(b.icon=1),b.ident=++nodeShortIdent,nodes.push(b),mainUpdate(4);break;case"removenode":l=-1;for(var a in nodes)if(nodes[a]._id==t.event.nodeid){l=a;break}if(-1!=l){b=nodes[l];currentNode==b&&(xxcurrentView>=10&&xxcurrentView<20&&(setDialogMode(0),go(2)),currentNode=null),nodes.splice(l,1),mainUpdate(4)}break;case"changenode":l=-1;for(var a in nodes)if(nodes[a]._id==t.event.nodeid){l=a;break}if(-1!=l)(b=nodes[l]).name=t.event.node.name,b.rname=t.event.node.rname,b.lusers=t.event.node.lusers,b.users=t.event.node.users,b.host=t.event.node.host,b.desc=t.event.node.desc,b.publicip=t.event.node.publicip,b.iploc=t.event.node.iploc,b.wifiloc=t.event.node.wifiloc,b.gpsloc=t.event.node.gpsloc,b.tags=t.event.node.tags,b.ssh=t.event.node.ssh,b.rdp=t.event.node.rdp,b.userloc=t.event.node.userloc,b.rdpport=t.event.node.rdpport,b.rfbport=t.event.node.rfbport,b.sshport=t.event.node.sshport,b.httpport=t.event.node.httpport,b.httpsport=t.event.node.httpsport,b.consent=t.event.node.consent,b.pmt=t.event.node.pmt,null!=t.event.node.agent&&(null==b.agent&&(b.agent={}),null!=t.event.node.agent.ver&&(b.agent.ver=t.event.node.agent.ver),null!=t.event.node.agent.id&&(b.agent.id=t.event.node.agent.id),null!=t.event.node.agent.caps&&(b.agent.caps=t.event.node.agent.caps),null!=t.event.node.agent.root&&(b.agent.root=t.event.node.agent.root),null!=t.event.node.agent.core?b.agent.core=t.event.node.agent.core:b.agent.core&&delete b.agent.core,b.agent.tag=t.event.node.agent.tag),null!=t.event.node.intelamt&&(null==b.intelamt&&(b.intelamt={}),null!=t.event.node.intelamt.state&&(b.intelamt.state=t.event.node.intelamt.state),null!=t.event.node.intelamt.host&&(b.intelamt.user=t.event.node.intelamt.host),null!=t.event.node.intelamt.user&&(b.intelamt.user=t.event.node.intelamt.user),null!=t.event.node.intelamt.tls&&(b.intelamt.tls=t.event.node.intelamt.tls),null!=t.event.node.intelamt.ver&&(b.intelamt.ver=t.event.node.intelamt.ver),null!=t.event.node.intelamt.tag&&(b.intelamt.tag=t.event.node.intelamt.tag),null!=t.event.node.intelamt.uuid&&(b.intelamt.uuid=t.event.node.intelamt.uuid),null!=t.event.node.intelamt.realm&&(b.intelamt.realm=t.event.node.intelamt.realm),null!=t.event.node.intelamt.flags&&(b.intelamt.flags=t.event.node.intelamt.flags),null!=t.event.node.intelamt.warn?b.intelamt.warn=t.event.node.intelamt.warn:delete b.intelamt.warn),null!=t.event.node.av&&(b.av=t.event.node.av),null!=t.event.node.wsc&&(b.wsc=t.event.node.wsc),null!=t.event.node.defender&&(b.defender=t.event.node.defender),b.namel=b.name.toLowerCase(),b.rname?b.rnamel=b.rname.toLowerCase():b.rnamel=b.namel,t.event.node.icon&&(b.icon=t.event.node.icon),null!=t.event.node.lastbootuptime&&(b.lastbootuptime=t.event.node.lastbootuptime),null!=t.event.node.idletime&&(b.idletime=t.event.node.idletime),refreshDevice(b._id),updateDeviceViewDevice(b),currentNode==b&&updateDeviceDetails();break;case"nodemeshchange":l=-1;for(var a in nodes)if(nodes[a]._id==t.event.nodeid){l=a;break}if(-1!=l){b=nodes[l];null!=meshes[t.event.newMeshId]||null!=userinfo.links&&null!=userinfo.links[b._id]?(b.meshid=t.event.newMeshId,b.meshnamel=meshes[t.event.newMeshId]?meshes[t.event.newMeshId].name.toLowerCase():"*"):(xxcurrentView>=10&&xxcurrentView<20&&currentNode&&!IsNodeViewable(currentNode)&&(setDialogMode(0),go(2),currentNode=null),nodes.splice(l,1)),mainUpdate(4),refreshDevice(t.event.nodeid)}else{b=t.event.node;if(!meshes[b.meshid])break;b.namel=b.name.toLowerCase(),b.rname?b.rnamel=b.rname.toLowerCase():b.rnamel=b.namel,b.meshnamel=meshes[b.meshid]?meshes[b.meshid].name.toLowerCase():"*",b.state=0,b.icon||(b.icon=1),b.ident=++nodeShortIdent,nodes.push(b),mainUpdate(4)}break;case"nodeconnect":l=-1;for(var a in nodes)if(nodes[a]._id==t.event.nodeid){l=a;break}if(-1!=l)(b=nodes[l]).conn=t.event.conn,b.pwr=t.event.pwr,1&b.conn||delete b.sessions,refreshDevice(b._id),updateDeviceViewDevice(b);break;case"login":null!=users&&users["user/"+domain+"/"+t.event.username.toLowerCase()]&&(users["user/"+domain+"/"+t.event.username.toLowerCase()].login=t.event.time);break;case"notify":s={text:t.event.value,title:t.event.title,icon:t.event.icon,titleid:t.titleid,msgid:t.msgid,args:t.args};null!=t.id&&(s.id=t.id),null!=t.event.tag&&(s.tag=t.event.tag),"number"==typeof t.maxtime&&(s.maxtime=t.maxtime),addNotification(s);break;case"sysinfohash":null!=currentNode&&t.event.nodeid==powerTimelineReq&&meshserver.send({action:"getsysinfo",nodeid:t.event.nodeid});break;case"ifchange":null!=currentNode&&currentNode._id==t.event.nodeid&&meshserver.send({action:"getnetworkinfo",nodeid:currentNode._id});break;case"devicesessions":if(null==(b=getNodeFromId(t.event.nodeid)))break;if(b.sessions=t.event.sessions,null!=b.sessions){for(var a in b.sessions)0==Object.keys(b.sessions[a]).length&&delete b.sessions[a];0==Object.keys(b.sessions).length&&delete b.sessions}refreshDevice(t.event.nodeid),updateDeviceViewDevice(b),xxdialogTag=="SESSIONS-"+t.event.nodeid&&showDeviceSessions(t.event.nodeid,!0),xxdialogTag=="HELPREQ-"+t.event.nodeid&&showDeviceHelpRequests(t.event.nodeid,!0)}break;case"getcookie":if("novnc"==t.tag){var w=window.location.origin+domainUrl+"novnc/vnc.html?ws=wss%3A%2F%2F"+window.location.host+encodeURIComponentEx(domainUrl)+(t.localRelay?"local":"mesh")+"relay.ashx%3Fauth%3D"+t.cookie+"&show_dot=1"+(urlargs.key?"&key="+urlargs.key:"")+"&l={{{lang}}}";null!=(b=getNodeFromId(t.nodeid))&&(w+="&name="+encodeURIComponentEx(b.name)),safeNewWindow(w,"mcnovnc/"+t.nodeid)}else if("mstsc"==t.tag){var S=window.location.origin+domainUrl+"mstsc.html?ws="+t.cookie+(urlargs.key?"&key="+urlargs.key:"");null!=(b=getNodeFromId(t.nodeid))&&(S+="&name="+encodeURIComponentEx(b.name)),t.localRelay&&(S+="&local=1"),safeNewWindow(S,"mcmstsc/"+t.nodeid)}else if("ssh"==t.tag){var D=window.location.origin+domainUrl+"ssh.html?ws="+t.cookie+(urlargs.key?"&key="+urlargs.key:"");null!=(b=getNodeFromId(t.nodeid))&&(D+="&name="+encodeURIComponentEx(b.name)),t.localRelay&&(D+="&local=1"),safeNewWindow(D,"mcssh/"+t.nodeid)}}}check_webp_feature("lossy",function(e,t){webpSupport=t,t||(d7encoding.options[1].disabled=!0,d7encoding.value=1)});var updateNaggleTimer=null,updateNaggleFlags=0;function mainUpdate(e){updateNaggleFlags|=e,null==updateNaggleTimer&&(updateNaggleTimer=setTimeout(function(){1&updateNaggleFlags&&onSearchInputChanged(),4&updateNaggleFlags&&(updateDevices(),updateDeviceDetails()),128&updateNaggleFlags&&updateMeshes(),updateNaggleTimer=null,updateNaggleFlags=0,gotoStartViewPage()},150))}function gotoStartViewPage(){var e=parseInt("{{viewmode}}");if(!(xxcurrentView>1)){if(""!="{{currentNode}}".toLowerCase()){if(null==getNodeFromId("{{currentNode}}"))return;gotoDevice("{{currentNode}}",e)}else if(null!=args.gotonode){if(96==args.gotonode.length&&(args.gotonode=btoa(hex2rstr(args.gotonode)).split("+").join("@").split("/").join("$")),null==getNodeFromId("node/"+domain+"/"+args.gotonode))return;args.panel&&(currentDevicePanel=parseInt(args.panel)),gotoDevice("node/"+domain+"/"+args.gotonode,e)}else if(null!=args.gotodevicename){var t=null;if(null!=nodes)for(var n in nodes)nodes[n].name==args.gotodevicename&&(t=nodes[n]._id);t&&(gotoDevice(t,e),go(e))}else if(null!=args.gotodevicername){t=null;if(null!=nodes)for(var n in nodes)nodes[n].rname==args.gotodevicername&&(t=nodes[n]._id);t&&(gotoDevice(t,e),goBackStack.push(1))}else if(null!=args.gotodeviceip){t=null;if(null!=nodes)for(var n in nodes)nodes[n].ip==args.gotodeviceip&&(t=nodes[n]._id);t&&(gotoDevice(t,e),go(e))}else if(null!=args.gotomesh){if(null==meshes["mesh/"+domain+"/"+args.gotomesh])return;gotoMesh("mesh/"+domain+"/"+args.gotomesh),go(e)}else isNaN(e)?(setDialogMode(0),go(1)):go(e);delete args.gotonode,delete args.gotomesh,delete args.panel,xxcurrentView<2&&go(2)}}function topMenu(e){null!=xxdialogMode&&0!=xxdialogMode&&999!=xxdialogMode||(void 0===e?1==("none"==QS("topMenu").display)?0!=xxdialogMode&&null!=xxdialogMode||(QV("topMenu",!0),xxdialogMode=999):(QV("topMenu",!1),xxdialogMode=0):(QV("topMenu",!1),xxdialogMode=0,1==e&&3!=xxcurrentView&&goForward("account"),2==e&&5!=xxcurrentView&&goForward("files")))}var backStack=[];function goBack(){xxdialogMode||(backStack.length>0&&backStack.pop(),goStack())}function goForward(e){xxdialogMode||(backStack.push(e),goStack())}function goStack(){if(0!=backStack.length){var e=backStack[backStack.length-1],t=e.split("/")[0];if("node"==t&&(setupDeviceMenu(0),gotoDevice(e)),"mesh"==t&&gotoMesh(e),"account"==t&&go(3),"devices"==t&&go(2),"files"==t){if(262144&features&&!(1==userinfo.otpsecret||userinfo.otphkeys>0||userinfo.otpkeys>0||userinfo.otpduo>0||userinfo.otpdev>0||8388608&features&&1==userinfo.otpekey))return void setDialogMode(2,"帳號安全",1,null,'Unable to access this feature until two-factor authentication is enabled. This is required for extra security. Go to the "My Account" and look at the "Account Security" section.');go(5)}}else go(2)}function updateFooterMenu(e){for(;null!=e&&e.length<3;)e.push({n:""});var t="",n="";if(null!=e)for(var o in e)t+='<td style="cursor:pointer'+(""==n?"":";border-left:solid 1px white")+'" onclick="'+e[o].f+'">'+e[o].n,n=e[o].n;QH("footerMenu","<tr>"+t)}function account_viewPreviousLogins(){xxdialogMode||(setDialogMode(2,"以前的登錄",1,null,"載入中...","previousLogins"),meshserver.send({action:"previousLogins"}))}function account_manageImage(e){if(!xxdialogMode){var t=0==e?userinfo:currentUser;setDialogMode(2,"管理帳戶圖片",7,account_manageImageEx2,'<input id=p2file type=file style=width:100% accept="image/*" onchange=account_manageImageEx()><div style=width:100%><canvas id=p2canvas width=256 height=256 style="width:256px;height:256px;margin-left:12px;margin-top:8px;border-radius:16px;box-shadow: 0px 0px 15px #000" onclick=account_canvasClick() /></div>',t._id);var n=Q("p2canvas").getContext("2d");null==t.accountImageRnd&&(t.accountImageRnd=Math.floor(9999999999*Math.random()));var o="";1==e&&(o="&id="+t._id.split("/")[2]);var i=new Image;i.onload=function(){n.clearRect(0,0,256,256),n.drawImage(i,0,0)},i.src=null!=t.flags&&1&t.flags?"userimage.ashx?rnd="+t.accountImageRnd+o:"images/user-256.png",QE("idx_dlgDeleteButton",null!=t.flags&&1&t.flags),QE("idx_dlgOkButton",!1)}}function account_canvasClick(){Q("p2file").click()}function account_manageImageEx(){var e=Q("p2file").files[0],t=new Image;t.onload=function(){var e=0,n=0,o=Math.min(t.width,t.height);t.width>o&&(e=(t.width-o)/2),t.height>o&&(n=(t.height-o)/2);var i=Q("p2canvas").getContext("2d");i.imageSmoothingEnabled=!0,i.webkitImageSmoothingEnabled=!0,i.mozImageSmoothingEnabled=!0,i.clearRect(0,0,256,256),i.drawImage(t,e,n,o,o,0,0,256,256),QE("idx_dlgOkButton",!0)},t.src=URL.createObjectURL(e)}function account_manageImageEx2(e,t){meshserver.send({action:"updateUserImage",userid:t,image:2==e?0:Q("p2canvas").toDataURL("image/jpeg",.8)})}function toggleNightMode(){if(!xxdialogMode){var e=getstore("nightMode","0"),t="<input type=radio id=night0 name=nightmoderadio value=0 "+(0==e?"checked":"")+"><label for=night0>瀏覽器默認</label><br>";t+="<input type=radio id=night2 name=nightmoderadio value=2 "+(2==e?"checked":"")+"><label for=night2>燈光模式</label><br>",setDialogMode(2,"夜間模式",3,toggleNightModeEx,t+="<input type=radio id=night1 name=nightmoderadio value=1 "+(1==e?"checked":"")+"><label for=night1>黑暗模式</label><br>"),QV("uiMenu",!1)}}function toggleNightModeEx(){var e="0";Q("night1").checked&&(e="1"),Q("night2").checked&&(e="2"),putstore("nightMode",e),setNightMode()}function setNightMode(){var e=getstore("nightMode","0");return nightMode=!1,1048576&features2&&(e="1"),2097152&features2&&(e="2"),"1"==e?nightMode=!0:"0"==e&&window.matchMedia&&(nightMode=window.matchMedia("(prefers-color-scheme: dark)").matches),nightMode?(QC("body").add("night"),QS("body")["background-color"]="#000",QS("body").color="lightgray"):(QC("body").remove("night"),QS("body")["background-color"]="#FFF",QS("body").color="black"),nightMode}function account_managePhone(){var e;!xxdialogMode&&33554432&features&&(null!=userinfo.phone?(e='<table style=width:100%><tr><td style=width:56px><img src="images/phone80.png" style=padding:8px>',e+="<td style=text-align:center><div style=padding:6px>驗證電話號碼</div><div style=font-size:20px>"+userinfo.phone+"</div>",setDialogMode(2,"電話通知",3,account_managePhoneRemove,e+="<div style=margin:10px><label><input id=d2delPhone type=checkbox onclick=account_managePhoneRemoveValidate() />刪除電話號碼</label></div>"),account_managePhoneRemoveValidate()):(e='<table style=width:100%><tr><td style=width:56px><img src="images/phone80.png" style=padding:8px>',e+="<td>Enter your SMS capable phone number. Once verified, the number may be used for login verification and other notifications.",setDialogMode(2,"電話通知",3,account_managePhoneAdd,e+='<br /><br /><div style=width:100%;text-align:center>電話號碼： <input type=tel pattern="[0-9]" autocomplete="tel" inputmode="tel" maxlength=18 id=d2phoneinput onKeyUp=account_managePhoneValidate() onkeypress="if (event.key==\'Enter\') account_managePhoneValidate(1)"></div></table>',"verifyPhone"),Q("d2phoneinput").focus(),account_managePhoneValidate()))}function isPhoneNumber(e){return e.match(/^\(?([0-9]{3,4})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/)}function account_managePhoneValidate(e){var t=isPhoneNumber(Q("d2phoneinput").value);QE("idx_dlgOkButton",t),1==e&&t&&dialogclose(1)}function account_managePhoneCodeValidate(e){var t=6==Q("d2phoneCodeInput").value.length&&Q("d2phoneCodeInput").value.match(/[0-9]/);QE("idx_dlgOkButton",t),1==e&&t&&dialogclose(1)}function account_managePhoneConfirm(e,t){meshserver.send({action:"confirmPhone",code:Q("d2phoneCodeInput").value,cookie:t})}function account_managePhoneAdd(){0!=isPhoneNumber(Q("d2phoneinput").value)&&(QE("d2phoneinput",!1),meshserver.send({action:"verifyPhone",phone:Q("d2phoneinput").value}))}function account_managePhoneRemove(){Q("d2delPhone").checked&&meshserver.send({action:"removePhone"})}function account_managePhoneRemoveValidate(){QE("idx_dlgOkButton",Q("d2delPhone").checked)}function account_manageAuthEmail(){if(!xxdialogMode&&8388608&features){var e=1==userinfo.otpekey&&null!=userinfo.email&&1==userinfo.emailVerified;setDialogMode(2,"電郵認證",1,function(){e!=Q("email2facheck").checked&&meshserver.send({action:"otpemail",enabled:Q("email2facheck").checked})},"啟用後，每次登入時，你都可以選擇向電郵帳戶接收登入保安編碼，以提高安全性。<br /><br /><label><input id=email2facheck type=checkbox "+(e?"checked":"")+"/>啟用電郵二因子鑑別。</label>")}}var d3filetreelinkpath,loclist={af:"南非文",sq:"阿爾巴尼亞文",ar:"阿拉伯文（標準）","ar-dz":"阿拉伯文（阿爾及利亞）","ar-bh":"阿拉伯文（巴林）","ar-eg":"阿拉伯文（埃及）","ar-iq":"阿拉伯文（伊拉克）","ar-jo":"阿拉伯文（約旦）","ar-kw":"阿拉伯文（科威特）","ar-lb":"阿拉伯文（黎巴嫩）","ar-ly":"阿拉伯文（利比亞）","ar-ma":"阿拉伯文（摩洛哥）","ar-om":"阿拉伯文（阿曼）","ar-qa":"阿拉伯文（卡塔爾）","ar-sa":"阿拉伯文（沙特阿拉伯）","ar-sy":"阿拉伯文（敘利亞）","ar-tn":"阿拉伯文（突尼斯）","ar-ae":"阿拉伯文（阿聯酋）","ar-ye":"阿拉伯文（也門）",an:"阿拉貢文",hy:"亞美尼亞文",as:"阿薩姆文",ast:"阿斯圖里亞斯文",az:"阿塞拜疆文",eu:"巴斯克",bg:"保加利亞文",be:"白俄羅斯文",bn:"孟加拉",bs:"波斯尼亞文",br:"布列塔尼",my:"緬甸文",ca:"加泰羅尼亞文",ch:"查莫羅",ce:"車臣",zh:"中文","zh-hk":"中文（香港）","zh-cn":"中文（中國）","zh-sg":"中文（新加坡）","zh-tw":"中文（台灣）",cv:"楚瓦什",co:"科西嘉文",cr:"克里語",hr:"克羅地亞文",cs:"捷克文",da:"丹麥文",nl:"荷蘭文（標準）","nl-be":"荷蘭文（比利時）",en:"英文","en-au":"英文（澳洲）","en-bz":"英文（伯利茲）","en-ca":"英文（加拿大）","en-ie":"英文（愛爾蘭）","en-jm":"英文（牙買加）","en-nz":"英文（紐西蘭）","en-ph":"英文（菲律賓）","en-za":"英語（南非）","en-tt":"英文（特立尼達和多巴哥）","en-gb":"英文（英國）","en-us":"美國英語","en-zw":"英文（津巴布韋）",eo:"世界語",et:"愛沙尼亞語",fo:"法羅語",fa:"波斯語（波斯語）",fj:"斐濟",fi:"芬蘭",fr:"法語（標準）","fr-be":"法語（比利時）","fr-ca":"法語（加拿大）","fr-fr":"法語（法國）","fr-lu":"法語（盧森堡）","fr-mc":"法語（摩納哥）","fr-ch":"法語（瑞士）",fy:"弗里斯蘭語",fur:"弗留利",gd:"蓋爾語（蘇格蘭語）","gd-ie":"蓋爾語（愛爾蘭）",gl:"加拉契語",ka:"格魯吉亞文",de:"德語（標準）","de-at":"德語（奧地利）","de-de":"德文（德國）","de-li":"德文（列支敦士登）","de-lu":"德語（盧森堡）","de-ch":"德文（瑞士）",el:"希臘文",gu:"古久拉提",ht:"海地文",he:"希伯來文",hi:"印地文",hu:"匈牙利文",is:"冰島文",id:"印度尼西亞文",iu:"因紐特文",ga:"愛爾蘭文",it:"意大利文（標準）","it-ch":"義大利文（瑞士）",ja:"日文",kn:"卡納達文",ks:"克什米爾文",kk:"哈薩克文",km:"高棉文",ky:"吉爾吉斯",tlh:"克林貢",ko:"韓文","ko-kp":"韓文（朝鮮）","ko-kr":"韓文（韓國）",la:"拉丁文",lv:"拉脫維亞文",lt:"立陶宛文",lb:"盧森堡文",mk:"FYRO馬其頓語",ms:"馬來文",ml:"馬拉雅拉姆文",mt:"馬耳他文",mi:"毛利文",mr:"馬拉地文",mo:"摩爾達維亞文",nv:"納瓦霍文",ng:"恩東加",ne:"尼泊爾文",no:"挪威文",nb:"挪威文（Bokmal）",nn:"挪威文（尼諾斯克）",oc:"歐舒丹",or:"奧里亞",om:"奧羅莫","fa-ir":"波斯/伊朗",pl:"波蘭文",pt:"葡萄牙文","pt-br":"葡萄牙文（巴西）",pa:"旁遮普文","pa-in":"旁遮普（印度）","pa-pk":"旁遮普（巴基斯坦）",qu:"蓋丘亞族",rm:"雷托-羅曼語",ro:"羅馬尼亞文","ro-mo":"羅馬尼亞文（摩爾達維亞）",ru:"俄文","ru-mo":"俄文（摩爾達維亞）",sz:"薩米（拉普蘭）",sg:"三鄉",sa:"梵文",sc:"撒丁島",sd:"信地",si:"僧伽羅文",sr:"塞爾維亞",sk:"斯洛伐克文",sl:"斯洛文尼亞文",so:"索馬尼",sb:"索比亞文",es:"西班牙文","es-ar":"西班牙文（阿根廷）","es-bo":"西班牙文（玻利維亞）","es-cl":"西班牙文（智利）","es-co":"西班牙文（哥倫比亞）","es-cr":"西班牙文（哥斯達黎加）","es-do":"西班牙文（多米尼加共和國）","es-ec":"西班牙文（厄瓜多爾）","es-sv":"西班牙文（薩爾瓦多）","es-gt":"西班牙文（危地馬拉）","es-hn":"西班牙文（洪都拉斯）","es-mx":"西班牙文（墨西哥）","es-ni":"西班牙文（尼加拉瓜）","es-pa":"西班牙文（巴拿馬）","es-py":"西班牙文（巴拉圭）","es-pe":"西班牙文（秘魯）","es-pr":"西班牙文（波多黎各）","es-es":"西班牙文（西班牙）","es-uy":"西班牙文（烏拉圭）","es-ve":"西班牙文（委內瑞拉）",sx:"蘇圖",sw:"斯瓦希里文",sv:"瑞典文","sv-fi":"瑞典文（芬蘭）","sv-sv":"瑞典文（瑞典）",ta:"泰米爾文",tt:"塔塔爾族",te:"泰盧加",th:"泰國",tig:"蒂格雷",ts:"特松加",tn:"茨瓦納",tr:"土耳其",tk:"土庫曼文",uk:"烏克蘭",hsb:"上索布族",ur:"烏爾都文",ve:"文達",vi:"越南文",vo:"沃拉普克",wa:"瓦隆",cy:"威爾士文",xh:"科薩",ji:"意第緒文",zu:"祖魯族"},loclistex={"zh-chs":"簡體中文","zh-cht":"繁體中文"};function account_showLocalizationSettings(){if(xxdialogMode)return!1;var e=getstore("loctag",0),t="",n='<select id=d2locselect style=width:180px><option value="*">用戶瀏覽器值</option>';for(var o in loclist)n+='<option value="'+o+'"'+(e==o?" selected":"")+">"+o+" - "+loclist[o]+"</option>";if(n+="</select>",serverinfo.languages&&serverinfo.languages.length>0){t+="更改語言將需要刷新頁面。<br /><br />";var i='<select id=d2langselect style=width:180px><option value="*">用戶瀏覽器值</option>';for(var o in serverinfo.languages){var a=serverinfo.languages[o];i+='<option value="'+a+'"'+(userinfo.lang==a?" selected":"")+">"+a+" - "+(loclist[a]?loclist[a]:loclistex[a])+"</option>"}t+=addHtmlValue("語言",i+="</select>")}return t+=addHtmlValue("日期和時間",n),4294967295==userinfo.siteadmin&&""==domain&&(t+='<br /><a rel="noreferrer noopener" target="_blank" href="translator.htm">幫助翻譯MeshCentral</a>'),setDialogMode(2,"本地化設置",3,account_showLocalizationSettingsEx,t),!1}function account_showLocalizationSettingsEx(){var e=Q("d2langselect").value;"*"==e&&null==userinfo.lang&&(e=userinfo.lang),e!=userinfo.lang&&meshserver.send({action:"changelang",lang:e});var t=getstore("loctag",0),n=Q("d2locselect").value;t!=n&&("*"!=n?args.locale=n:delete args.locale,putstore("loctag",args.locale),mainUpdate(4294967295))}function account_manageAuthApp(){!xxdialogMode&&4096&features&&(1==userinfo.otpsecret?account_removeOtp():account_addOtp())}function account_addOtp(){!xxdialogMode&&1!=userinfo.otpsecret&&4096&features&&(setDialogMode(2,"認證軟體",2,function(){meshserver.send({action:"otpauth-setup",secret:Q("d2optsecret").attributes.secret.value,token:Q("d2otpauthinput").value})},"<div id=d2optinfo>載入中...</div>","otpauth-request"),meshserver.send({action:"otpauth-request"}))}function account_addOtpCheck(e){var t=6==Q("d2otpauthinput").value.length;QE("idx_dlgOkButton",t),e&&13==e.keyCode&&t&&dialogclose(1)}function account_removeOtp(){!xxdialogMode&&1==userinfo.otpsecret&&4096&features&&setDialogMode(2,"認證軟體",3,function(){meshserver.send({action:"otpauth-clear"})},"確認刪除身份驗證軟體兩步登入？")}function account_manageOtp(e){2==xxdialogMode&&"otpauth-manage"==xxdialogTag&&dialogclose(0),xxdialogMode||!(4096&features)||1!=userinfo.otpsecret&&userinfo.otphkeys<1||meshserver.send({action:"otpauth-getpasswords",subaction:e})}function account_showVerifyEmail(){xxdialogMode||1==userinfo.emailVerified||1!=serverinfo.emailcheck||setDialogMode(2,"電郵驗證",3,account_showVerifyEmailEx,"單擊確定將驗證電郵發送到：<br /><div style=padding:8px><b>"+EscapeHtml(userinfo.email)+"</b></div>請等待幾分鐘以接收驗證。")}function account_showVerifyEmailEx(){meshserver.send({action:"verifyemail",email:userinfo.email})}function account_showChangeEmail(){xxdialogMode||(setDialogMode(2,"電郵地址變更",3,account_changeEmail,addHtmlValue("電郵","<input id=dp3email style=width:170px maxlength=256 onchange=account_validateEmail() onkeyup=account_validateEmail(event) />")),null!=userinfo.email&&(Q("dp3email").value=userinfo.email),account_validateEmail(),Q("dp3email").focus())}function account_validateEmail(e,t){QE("idx_dlgOkButton",validateEmail(Q("dp3email").value)&&Q("dp3email").value!=userinfo.email),null!=e&&13==e.keyCode&&dialogclose(1)}function account_changeEmail(){meshserver.send({action:"changeemail",email:Q("dp3email").value})}function account_showDeleteAccount(){if(!xxdialogMode){var e="<form method=post><table style=margin-left:10px><input type=hidden name=action value=deleteaccount /><input type=hidden name=authcookie value="+authCookie+" /><tr>";e+="<td align=right>密碼：</td><td><input id=apassword1 type=password name=apassword1 autocomplete=off onchange=account_validateDeleteAccount() onkeyup=account_validateDeleteAccount() /></td>",e+="</tr><tr><td align=right>密碼：</td><td><input id=apassword2 type=password name=apassword2 autocomplete=off onchange=account_validateDeleteAccount() onkeyup=account_validateDeleteAccount() /></td>",e+="</tr></table><div style=padding:10px;margin-bottom:4px>",e+='<input id=account_dlgCancelButton type=button value="取消" style=float:right;width:80px;margin-left:5px onclick=dialogclose(0)>',e+='<input id=account_dlgOkButton type=submit value="OK" style="float:right;width:80px" onclick=dialogclose(1)>',setDialogMode(2,"刪除帳戶",0,null,e+="</div><br /></form>"),account_validateDeleteAccount(),Q("apassword1").focus()}}function account_showChangePassword(){if(xxdialogMode)return!1;var e="<table style=margin-left:10px>";if(e+="<tr><td align=right>"+nobreak("舊密碼：")+"</td><td><input id=apassword0 type=password name=apassword0 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /> <b></b></td></tr>",e+="<tr><td align=right>"+nobreak("新密碼：")+"</td><td><input id=apassword1 type=password name=apassword1 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /> <b><span id=dxPassWarn></span></b></td></tr>",e+="<tr><td align=right>"+nobreak("新密碼：")+"</td><td><input id=apassword2 type=password name=apassword2 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /></td></tr>",65536&features&&(e+="<tr><td align=right>密碼提示：</td><td><input id=apasswordhint name=apasswordhint maxlength=250 type=text autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /></td></tr>"),e+="</table>",passRequirements){var t=[],n=0;for(var o in passRequirements)"reset"!=o&&"hint"!=o&&(t.push(o+":"+passRequirements[o]),n++);n>0&&(e+="<br /><span style=font-size:x-small>"+format("要求：{0}。",t.join(", "))+"</span>")}return setDialogMode(2,"更改密碼",3,account_showChangePasswordEx,e+="<br />"),Q("apassword0").focus(),account_validateNewPassword(),!1}function account_showChangePasswordEx(){if(Q("apassword1").value==Q("apassword2").value){var e={action:"changepassword",oldpass:Q("apassword0").value,newpass:Q("apassword1").value};65536&features&&(e.hint=Q("apasswordhint").value),meshserver.send(e)}}function account_createMesh(){if(!xxdialogMode)if(4294967295!=userinfo.siteadmin&&64&userinfo.siteadmin)setDialogMode(2,"新裝置群",1,null,"此帳戶無權建立新的裝置群。");else if(!0===userinfo.emailVerified||1!=serverinfo.emailcheck||4294967295==userinfo.siteadmin)if(!(262144&features)||1==userinfo.otpsecret||userinfo.otphkeys>0||userinfo.otpkeys>0||userinfo.otpduo>0||userinfo.otpdev>0||8388608&features&&1==userinfo.otpekey){var e=addHtmlValue("名稱","<input id=dp3meshname style=width:170px maxlength=64 onchange=account_validateMeshCreate() onkeyup=account_validateMeshCreate() />");e+=addHtmlValue("類型","<div style=width:170px;margin:0;padding:0><select id=dp3meshtype style=width:100% onchange=account_validateMeshCreate() ><option value=2>軟體代理群</option><option value=1>僅限Intel&reg; AMT</option></select></div>"),setDialogMode(2,"創建裝置群",3,account_createMeshEx,e+=addHtmlValue("描述","<div style=width:170px;margin:0;padding:0><textarea id=dp3meshdesc maxlength=1024 style=width:100%;resize:none></textarea></div>")),account_validateMeshCreate(),Q("dp3meshname").focus()}else setDialogMode(2,"帳號安全",1,null,"在啟用二因子身份驗證之前，無法訪問裝置。這是額外的安全性所必需的。轉到“我的帳戶”，然後查看“帳戶安全性”部分。");else setDialogMode(2,"帳號安全",1,null,"在驗證電郵地址之前，無法訪問裝置。這是密碼恢復所必需的。轉到“我的帳戶”以更改並驗證電郵地址。")}function account_validateMeshCreate(){QE("idx_dlgOkButton",Q("dp3meshname").value.length>0)}function account_createMeshEx(e,t){meshserver.send({action:"createmesh",meshname:Q("dp3meshname").value,meshtype:parseInt(Q("dp3meshtype").value),desc:Q("dp3meshdesc").value})}function account_validateDeleteAccount(){QE("account_dlgOkButton",Q("apassword1").value.length>0&&Q("apassword1").value==Q("apassword2").value)}function account_validateNewPassword(){var e="",t=Q("apassword0").value.length>0&&Q("apassword1").value.length>0&&Q("apassword1").value==Q("apassword2").value&&Q("apassword0").value!=Q("apassword1").value;if(65536&features&&Q("apasswordhint").value==Q("apassword1").value&&(t=!1),""!=Q("apassword1").value)if(null==passRequirements||""==passRequirements){var n=checkPasswordStrength(Q("apassword1").value);e=n>=80?"<span style=color:green>Strong<span>":n>=60?"<span style=color:blue>&#9679;<span>":"<span style=color:red>&#9679;<span>"}else{0==checkPasswordRequirements(Q("apassword1").value,passRequirements)&&(t=!1,e="<span style=color:red>政策<span>")}QH("dxPassWarn",e),QE("idx_dlgOkButton",t)}function checkPasswordStrength(e){var t=0,n={},o=0,i={digits:/\d/.test(e),lower:/[a-z]/.test(e),upper:/[A-Z]/.test(e),nonWords:/\W/.test(e)};if(!e)return 0;for(var a=0;a<e.length;a++)n[e[a]]=(n[e[a]]||0)+1,t+=5/n[e[a]];for(var s in i)o+=1==i[s]?1:0;return parseInt(t+10*(o-1))}function checkPasswordRequirements(e,t){if(null==t||""==t||"object"!=typeof t)return!0;if(t.min&&e.length<t.min)return!1;if(t.max&&e.length>t.max)return!1;for(var n=0,o=0,i=0,a=0,s=0;s<e.length;s++)/\d/.test(e[s])&&n++,/[a-z]/.test(e[s])&&o++,/[A-Z]/.test(e[s])&&i++,/\W/.test(e[s])&&a++;return!(t.numeric&&n<t.numeric)&&(!(t.lower&&o<t.lower)&&(!(t.upper&&i<t.upper)&&!(t.nonalpha&&a<t.nonalpha)))}function updateMeshes(){var e="",t=0;for(i in meshes){t++;var n=GetMeshRights(meshes[i]),o="部分權限";4294967295==n?o="完整管理員":0==n&&(o="沒有權利"),e+="<div style=cursor:pointer onclick=goForward('"+i+"')>",e+='<div style="float:left;margin-left:4px"><img src="/images/meshicon50.png" width=50 height=50 /></div>',e+="<div class=meshList>",e+="<div><div style=color:black;padding-left:12px;padding-top:2px><b>"+EscapeHtml(meshes[i].name)+"</b></div><div style=padding-left:12px;padding-top:3px;color:black>"+o+"</div></div>",e+="</div></div>"}QH("p3meshes",e),QV("p3noMeshFound",0==t)}function gotoMesh(e){!(262144&features)||1==userinfo.otpsecret||userinfo.otphkeys>0||userinfo.otpkeys>0||userinfo.otpduo>0||userinfo.otpdev>0||8388608&features&&1==userinfo.otpekey?(null==(currentMesh=meshes[e])&&goBack(),p20updateMesh(),go(20)):setDialogMode(2,"帳號安全",1,null,'Unable to access this feature until two-factor authentication is enabled. This is required for extra security. Go to the "My Account" and look at the "Account Security" section.')}function d3init(){d3fileoptions={dialog:1,filter:"d3filter",files:"d3serverfiles",folderup:"p3FolderUp",currentFolder:"p3CurrentFolder",func:d3setActions},Q("d3localFile").value="",Q("d3localFile").accept=Q("d3filter").value,d3modechange()}function d3modechange(){var e=Q("d3uploadMode").value;QV("d3localmode",1==e),QV("d3servermode",2==e),1==e?d3setActions():d3updatefiles()}var filetreelinkpath,d3filetreelocation=[],d3fileoptions=null;function d3updatefiles(){if(null!=d3fileoptions&&("d3filter"!=d3fileoptions.filter||1!=Q("d3uploadMode").value)){for(var e="",t="",n=filetree,o=1,i="",a=[],s=[],l=document.getElementsByName("fc"),r=0;r<l.length;r++)l[r].checked&&s.push(l[r].value);for(var r in d3filetreelinkpath="",d3filetreelocation){if(null==n.f||null==n.f[d3filetreelocation[r]])break;if(a.push(d3filetreelocation[r]),1==o){var d=d3filetreelocation[r].split("/");window.location.origin+domainUrl+d[0]+"files/"+d[2],d3filetreelocation[r]===userinfo._id?d3filetreelinkpath+="self":d3filetreelinkpath+=d[0]+"/"+d[2]}else""!=d3filetreelinkpath&&(d3filetreelinkpath+="/"+d3filetreelocation[r],o>2&&"/"+d3filetreelocation[r]);i=(n=n.f[d3filetreelocation[r]]).n,o++}d3filetreelocation=a;var u=p5sort_files(n.f),c="";for(var r in d3fileoptions.filter&&(c=Q(d3fileoptions.filter).value),u){var p,m=u[r],g=m.n;if(3!=m.t||""==c||0!=m.nx.toLowerCase().endsWith(c)){p=EscapeHtml(g);var f="";null!=m.s&&(f=getFileSizeStr(m.s));var h="";if(3!=m.t){h='<div class=filelist file=999><span style=float:right title=""></span><span title="'+p+'"><div class=fileIcon'+m.t+' onclick=d3folderset("'+encodeURIComponentEx(m.nx)+'")></div>&nbsp;<a href=# style=cursor:pointer onclick=\'return d3folderset("'+encodeURIComponentEx(m.nx)+"\")'>"+p+"</a></span></div>"}else{var v=p;h='<div class=filelist file=3><input style=float:left name=fcx class=fcb type=checkbox onchange=d3setActions() value="'+m.nx+'">&nbsp;<span style=float:right>'+EscapeHtml(f)+'</span><span title="'+p+'"><div class=fileIcon'+m.t+"></div>"+v+"</span></div>"}m.t<3?e+=h:t+=h}}d3fileoptions.currentFolder&&QH(d3fileoptions.currentFolder,i),QH(d3fileoptions.files,e+t),QE(d3fileoptions.folderup,d3filetreelocation.length>0),d3fileoptions.func&&d3fileoptions.func()}}function d3folderset(e){return d3filetreelocation.push(decodeURIComponent(e)),d3updatefiles(),!1}function d3folderup(e){if(null==e)d3filetreelocation.pop();else for(;d3filetreelocation.length>e;)d3filetreelocation.pop();d3updatefiles()}function d3getFileSel(){for(var e=[],t=document.getElementsByName("fcx"),n=0;n<t.length;n++)t[n].checked&&e.push(t[n].value);return e}function d3setActions(){1==d3fileoptions.dialog?1==Q("d3uploadMode").value?QE("idx_dlgOkButton",Q("d3localFile").value.length>0):QE("idx_dlgOkButton",1==d3getFileSel().length):2==d3fileoptions.dialog&&QE("idx_dlgOkButton",1==d3getFileSel().length)}var sortorder,filetreelocation=[];function p5refreshFiles(){meshserver.send({action:"files"})}function updateFiles(){if(QV("MainMenuMyFiles",!(8&features)),!(8&features)){for(var e,t="",n="",o="<a style=cursor:pointer;color:black onclick=p5folderup(0)>根</a>",i="Root",a=filetree,s=1,l=[],r=filetreelinkpath,d=[],u=document.getElementsByName("fc"),c=0;c<u.length;c++)u[c].checked&&d.push(u[c].value);for(var c in filetreelinkpath="",filetreelocation){if(null==a.f||null==a.f[filetreelocation[c]])break;if(l.push(filetreelocation[c]),i+=" / "+filetreelocation[c],1==s){var p=filetreelocation[c].split("/");e=window.location.origin+domainUrl+p[0]+"files/"+p[2],filetreelinkpath+=filetreelocation[c]}else""!=filetreelinkpath&&(filetreelinkpath+="/"+filetreelocation[c],s>2&&(e+="/"+filetreelocation[c]));a=a.f[filetreelocation[c]],o+=" / <a style=cursor:pointer;color:black onclick=p5folderup("+s+")>"+EscapeHtml(null!=a.n?a.n:filetreelocation[c])+"</a>",s++}filetreelocation=l;var m=i.toLowerCase().startsWith("root / "+userinfo._id+" / public"),g=p5sort_files(a.f);for(var c in g){var f,h=g[c],v=h.n;f=EscapeHtml(v);var k="";null!=h.s&&(k=getFileSizeStr(h.s));var y="";if(h.t<3||4==h.t){var x=1==h.t||4==h.t?p5getQuotabar(h):"";y="<div class=filelist file=999><input file=999 style=float:left name=fc class=fcb type=checkbox onchange=p5setActions() value='"+EscapeHtml(v)+"'>&nbsp;<span style=float:right;padding-right:4px>"+x+'</span><span title="'+f+'"><div class=fileIcon'+h.t+'></div><a style=cursor:pointer onclick=p5folderset("'+encodeURIComponent(h.nx)+'")>'+f+"</a></span></div>"}else{var b=f,w="";m&&(w=" (<a style=cursor:pointer onclick='p5showPublicLink(\""+e+"/"+h.nx+"\")'>鏈結</a>)"),h.s>0&&(b='<a rel="noreferrer noopener" target="_blank" href="downloadfile.ashx?link='+encodeURIComponent(filetreelinkpath+"/"+h.nx)+'">'+f+"</a>"+w),y="<div class=filelist file=3><input file=3 style=float:left name=fc class=fcb type=checkbox onchange=p5setActions() value='"+h.nx+"'>&nbsp;<span style=float:right;padding-right:4px>"+EscapeHtml(k)+'</span><span title="'+f+'"><div class=fileIcon'+h.t+"></div>"+b+"</span></div>"}h.t<3?t+=y:n+=y}if(QH("p5rightOfButtons",p5getQuotabar(a)),QH("p5files",t+n),QH("p5currentpath",o),QE("p5FolderUp",0!=filetreelocation.length),QV("p5PublicShare",m),r==filetreelinkpath){u=document.getElementsByName("fc");for(c=0;c<u.length;c++)u[c].checked=d.indexOf(u[c].value)>=0}p5setActions()}}function getNiceSize(e){return e<=0?"超出儲存空間":e<2048?format("還剩{0}b",e):e<2097152?format("還剩{0}k",Math.round(e/1024)):e<2147483648?format("還剩{0}m",Math.round(e/1024/1024)):format("還剩{0}g",Math.round(e/1024/1024/1024))}function getNetworkSpeed(e){return e<=0?"0 bps":e<1e3?format("{0} bps",e):e<1e6?format("{0} Kbps",Math.round(e/1e3)):e<1e9?format("{0} Mbps",Math.round(e/1e6)):format("{0} Gbps",(e/1e9).toFixed(1))}function p5getQuotabar(e){for(;e.t>1&&4!=e.t;)e=e.parent;return 1!=e.t&&4!=e.t||null==e.maxbytes?"":getNiceSize(e.maxbytes-e.s)+" <progress style=height:10px;width:100px value="+e.s+" max="+e.maxbytes+" />"}function p5showPublicLink(e){setDialogMode(2,"公開鏈結",1,null,'<input type=text style=width:100% value="'+e+'" readonly />')}function p5sort_filename(e,t){return e.ln>t.ln?1*sortorder:e.ln<t.ln?-1*sortorder:0}function p5sort_timestamp(e,t){return e.d>t.d?1*sortorder:e.d<t.d?-1*sortorder:0}function p5sort_bysize(e,t){return e.s==t.s?p5sort_filename(e,t):(e.s-t.s)*sortorder}function p5sort_files(e){var t=[],n=Q("p5sortdropdown").value;for(var o in e)e[o].nx=o,null==e[o].n&&(e[o].n=o),e[o].ln=e[o].n.toLowerCase(),t.push(e[o]);return sortorder=1,n>3&&(sortorder=-1,n-=3),1==n?t.sort(p5sort_filename):2==n?t.sort(p5sort_bysize):3==n&&t.sort(p5sort_timestamp),t}function p5setActions(){var e=getFileSelCount(),t=getFileCount(),n=getFileSelCount(!1);QE("p5DeleteFileButton",e>0&&filetreelocation.length>0),QE("p5NewFolderButton",filetreelocation.length>0),QE("p5UploadButton",filetreelocation.length>0),QE("p5RenameFileButton",1==e&&filetreelocation.length>0),QE("p5SelectAllButton",t>0),Q("p5SelectAllButton").value=e>0?"沒有":"所有",QE("p5CutButton",n>0&&e==n),QE("p5CopyButton",n>0&&e==n),QE("p5PasteButton",null!=p5clipboard&&p5clipboard.length>0&&filetreelocation.length>0)}function getFileSelCount(e){for(var t=0,n=document.getElementsByName("fc"),o=0;o<n.length;o++)!n[o].checked||0==e&&"3"!=n[o].attributes.file.value||t++;return t}function getFileSelDirCount(){for(var e=0,t=document.getElementsByName("fc"),n=0;n<t.length;n++)t[n].checked&&"999"==t[n].attributes.file.value&&e++;return e}function getFileCount(){return document.getElementsByName("fc").length}function p5selectallfile(){for(var e=0==getFileSelCount(),t=document.getElementsByName("fc"),n=0;n<t.length;n++)t[n].checked=e;p5setActions()}function setupBackPointers(e){if(null!=e.f){var t=0,n=0;for(var o in e.f)setupBackPointers(e.f[o]),e.f[o].parent=e,e.f[o].s&&(t+=e.f[o].s),e.f[o].c&&(n+=e.f[o].c),3==e.f[o].t&&n++;e.s=t,e.c=n}return e}function getFileSizeStr(e){return 1==e?"1個位元組":format("{0}個字節",e)}function p5folderup(e){if(null==e)filetreelocation.pop();else for(;filetreelocation.length>e;)filetreelocation.pop();return updateFiles(),!1}function p5folderset(e){return filetreelocation.push(decodeURIComponent(e)),updateFiles(),!1}function p5createfolder(){setDialogMode(2,"新建檔案夾",3,p5createfolderEx,"<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% />"),focusTextBox("p5renameinput"),p5fileNameCheck()}function p5createfolderEx(){meshserver.send({action:"fileoperation",fileop:"createfolder",path:filetreelocation,newfolder:Q("p5renameinput").value})}function p5deletefile(){var e=getFileSelCount(),t=getFileSelDirCount()>0?"<br /><br /><label><input type=checkbox id=p5recdeleteinput>遞迴刪除</label><br>":"<input type=checkbox id=p5recdeleteinput style='display:none'>";setDialogMode(2,"刪除",3,p5deletefileEx,e>1?format("刪除{0}個所選項目？",e)+t:"刪除所選項目？"+t)}function p5deletefileEx(){for(var e=[],t=document.getElementsByName("fc"),n=0;n<t.length;n++)t[n].checked&&e.push(t[n].value);meshserver.send({action:"fileoperation",fileop:"delete",path:filetreelocation,delfiles:e,rec:Q("p5recdeleteinput").checked})}function p5renamefile(){for(var e,t=document.getElementsByName("fc"),n=0;n<t.length;n++)t[n].checked&&(e=t[n].value);setDialogMode(2,"改名",3,p5renamefileEx,'<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% value="'+e+'" />',{action:"fileoperation",fileop:"rename",path:filetreelocation,oldname:e}),focusTextBox("p5renameinput"),p5fileNameCheck()}function p5renamefileEx(e,t){t.newname=Q("p5renameinput").value,meshserver.send(t)}function p5fileNameCheck(e){var t=isFilenameValid(Q("p5renameinput").value);QE("idx_dlgOkButton",t),1==t&&e&&13==e.keyCode&&dialogclose(1)}var isFilenameValid=function(){var e=/^[^\\/:\*\?"<>\|]+$/,t=/^\./,n=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i;return function(o){return e.test(o)&&!t.test(o)&&!n.test(o)&&"."!=o[0]}}();function p5uploadFile(){setDialogMode(2,"上載檔案",3,p5uploadFileEx,'<form method=post enctype=multipart/form-data action=uploadfile.ashx target=fileUploadFrame><input type=text name=link style=display:none id=p5uploadpath value="'+encodeURIComponent(filetreelinkpath)+'" /><input type=file name=files id=p5uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p5uploadinput\')" /><input type=hidden name=authCookie value='+authCookie+" /><input type=submit id=p5loginSubmit style=display:none /></form>"),updateUploadDialogOk("p5uploadinput")}function p5uploadFileEx(){Q("p5loginSubmit").click()}function updateUploadDialogOk(e){QE("idx_dlgOkButton",""!=Q(e).value)}var p5clipboard=null,p5clipboardFolder=null,p5clipboardCut=0;function p5copyFile(e){var t=document.getElementsByName("fc");p5clipboard=[],p5clipboardCut=e,p5clipboardFolder=Clone(filetreelocation);for(var n=0;n<t.length;n++)t[n].checked&&"3"==t[n].attributes.file.value&&p5clipboard.push(t[n].value);p5updateClipview()}function p5pasteFile(){var e="";null!=p5clipboard&&p5clipboard.length>0&&(e=format("將{1}入口{2}中的{0}限製到此位置？",0==p5clipboardCut?"copy":"move",p5clipboard.length,p5clipboard.length>1?"s":"")),setDialogMode(2,"糊",3,p5pasteFileEx,e)}function p5pasteFileEx(){meshserver.send({action:"fileoperation",fileop:0==p5clipboardCut?"copy":"move",scpath:p5clipboardFolder,path:filetreelocation,names:p5clipboard}),p5folderup(999),1==p5clipboardCut&&(p5clipboard=null,p5clipboardFolder=null,p5clipboardCut=0,p5updateClipview())}function p5updateClipview(){var e="";null!=p5clipboard&&p5clipboard.length>0&&(e=format("保存{0}項目{1}給{2}",p5clipboard.length,p5clipboard.length>1?"s":"",0==p5clipboardCut?"複製":"移動")+', <a href=# onclick="return p5clearClip()" style=cursor:pointer>清除</a>.'),QH("p5bottomstatus",e),p5setActions()}function p5clearClip(){return p5clipboard=null,p5clipboardFolder=null,p5clipboardCut=0,p5updateClipview(),!1}function p5fileDragDrop(e){if(haltEvent(e),QV("bigfail",!1),QV("bigok",!1),null!=e.dataTransfer&&0!=e.dataTransfer.files.length&&0!=filetreelocation.length)for(var t=[],n=[],o=[],i=[],a=e.dataTransfer.files.length,s=0;s<e.dataTransfer.files.length;s++){var l=new FileReader,r=e.dataTransfer.files[s];t.push(r.name),n.push(r.size),o.push(r.type),l.onload=function(e){i.push(e.target.result),0==--a&&(Q("p5fileDragName").value=t.join("*"),Q("p5fileDragSize").value=n.join("*"),Q("p5fileDragType").value=o.join("*"),Q("p5fileDragData").value=i.join("*"),Q("p5fileDragLink").value=encodeURIComponent(filetreelinkpath),Q("p5loginSubmit2").click())},l.readAsDataURL(r)}}var p5dragtimer=null;function p5fileDragOver(e){haltEvent(e),null!=p5dragtimer&&(clearTimeout(p5dragtimer),p5dragtimer=null);var t=!0;0==filetreelocation.length&&(t=!1),QV("bigok",t),QV("bigfail",!t)}function p5fileDragLeave(e){haltEvent(e),"p5filetable"!=e.target.id?(QV("bigfail",!1),QV("bigok",!1)):p5dragtimer=setTimeout("QV('bigfail',false);QV('bigok',false);p5dragtimer=null;",200)}function onRealNameCheckBox(){putstore("showRealNames",(showRealNames=Q("RealNameCheckBox").checked)?1:0),mainUpdate(5)}function onOnlineCheckBox(e){putstore("onlineOnly",Q("OnlineCheckBox").checked?1:0),onSearchInputChanged()}function updateDevicePageState(){if(null==devicePagingState||devicePagingState.total<=devicePagingState.limit)QV("devViewPageState",!1),QV("devViewPageButton2",!1),QV("devViewPageButton3",!1);else{var e=Math.floor((devicePagingState.skip+devicePagingState.limit)/devicePagingState.limit),t=Math.ceil(devicePagingState.total/devicePagingState.limit);QV("devViewPageState",!0),QV("devViewPageButton2",!0),QV("devViewPageButton3",!0),QH("devViewPageState",e+"/"+t)}}function onDeviceViewPageChange(e){if(null!=devicePagingState){var t=Math.floor((devicePagingState.skip+devicePagingState.limit)/devicePagingState.limit),n=Math.ceil(devicePagingState.total/devicePagingState.limit);switch(e){case 2:t>1&&meshserver.send({action:"nodes",skip:(t-2)*devicePagingState.limit});break;case 3:t<n&&meshserver.send({action:"nodes",skip:t*devicePagingState.limit})}}}function onDeviceSearchChanged(e){setTimeout(function(){onSearchInputChanged()},10)}function clearSearchInput(){Q("SearchInput").value="",Q("OnlineCheckBox").checked=!1,onSearchInputChanged()}function onSearchInputChanged(){var e=Q("SearchInput").value.toLowerCase().trim();putstore("_search",Q("SearchInput").value),QS("SearchInput")["background-color"]=""==e?"#FFFFFF":"#FDFFBE";var t=e.startsWith("!");t&&(e=e.substring(1));var n=Q("SearchInput").value.trim();t&&(n=n.substring(1));var o=null,i=null,a=null,s=null,l=null,r=null,d=null,u=null;if(e.startsWith("user:".toLowerCase())?o=e.substring(5):e.startsWith("u:".toLowerCase())?o=e.substring(2):e.startsWith("ip:".toLowerCase())?i=e.substring(3):e.startsWith("group:".toLowerCase())?a=e.substring(6):e.startsWith("g:".toLowerCase())?a=e.substring(2):e.startsWith("tag:".toLowerCase())?s=n.substring(4):e.startsWith("t:".toLowerCase())?s=n.substring(2):e.startsWith("atag:".toLowerCase())?l=n.substring(5).toLowerCase():e.startsWith("a:".toLowerCase())?l=n.substring(2).toLowerCase():e.startsWith("os:".toLowerCase())?d=n.substring(3).toLowerCase():e.startsWith("amt:".toLowerCase())?u=n.substring(4).toLowerCase():"wsc:ok"==e?r=1:"wsc:noav"==e?r=2:"wsc:noupdate"==e?r=3:"wsc:nofirewall"==e?r=4:"wsc:any"==e&&(r=5),""==e)for(var c in nodes)nodes[c].v=!0;else if(null!=i)for(var c in nodes)nodes[c].v=null!=nodes[c].ip&&nodes[c].ip.indexOf(i)>=0;else if(null!=a)for(var c in nodes)nodes[c].v=meshes[nodes[c].meshid].name.toLowerCase().indexOf(a)>=0;else if(null!=s)for(var c in nodes)nodes[c].v=null==nodes[c].tags&&""==s||null!=nodes[c].tags&&nodes[c].tags.indexOf(s)>=0;else if(null!=l)for(var c in nodes)nodes[c].v=null!=nodes[c].agent&&null==nodes[c].agent.tag&&""==l||null!=nodes[c].agent&&null!=nodes[c].agent.tag&&nodes[c].agent.tag.toLowerCase().indexOf(l)>=0;else if(null!=o){for(var c in nodes)if(nodes[c].v=!1,nodes[c].users&&nodes[c].users.length>0)for(var p in nodes[c].users)nodes[c].users[p].toLowerCase().indexOf(o)>=0&&(nodes[c].v=!0)}else if(null!=d)for(var c in nodes)nodes[c].v=null!=nodes[c].osdesc&&nodes[c].osdesc.toLowerCase().indexOf(d)>=0;else if(null!=u)for(var c in nodes)nodes[c].v=null!=nodes[c].intelamt&&(""==u||nodes[c].intelamt.state==u);else if(null!=r)for(var c in nodes)nodes[c].v=!1,nodes[c].wsc&&(1==r&&"OK"==nodes[c].wsc.antiVirus&&"OK"==nodes[c].wsc.autoUpdate&&"OK"==nodes[c].wsc.firewall?nodes[c].v=!0:(2!=r&&5!=r||"OK"==nodes[c].wsc.antiVirus)&&(3!=r&&5!=r||"OK"==nodes[c].wsc.autoUpdate)&&(4!=r&&5!=r||"OK"==nodes[c].wsc.firewall)||(nodes[c].v=!0));else if("*"==e)for(var c in nodes)nodes[c].v=1==stars[nodes[c]._id];else try{var m=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(m);for(var c in nodes)nodes[c].v=32768&features2?268435456&features2?g.test(nodes[c].name.toLowerCase())||g.test(meshes[nodes[c].meshid].name.toLowerCase())||null!=nodes[c].rnamel&&g.test(nodes[c].rnamel.toLowerCase()):g.test(nodes[c].name.toLowerCase())||null!=nodes[c].rnamel&&g.test(nodes[c].rnamel.toLowerCase()):268435456&features2?showRealNames?null!=nodes[c].rnamel&&g.test(nodes[c].rnamel.toLowerCase())||g.test(meshes[nodes[c].meshid].name.toLowerCase()):g.test(nodes[c].name.toLowerCase())||g.test(meshes[nodes[c].meshid].name.toLowerCase()):showRealNames?null!=nodes[c].rnamel&&g.test(nodes[c].rnamel.toLowerCase()):g.test(nodes[c].name.toLowerCase())}catch(e){for(var c in nodes)nodes[c].v=!0}if(t)for(var c in nodes)nodes[c].v=!nodes[c].v;if(Q("OnlineCheckBox").checked)for(var c in nodes)null!=nodes[c].conn&&0!=nodes[c].conn||(nodes[c].v=!1);mainUpdate(4)}var gotKeyPressEvent=!1;function ondeskkeypress(e,t){if(setSessionActivity(),desktop&&!xxdialogMode&&10==xxcurrentView&&1==currentDevicePanel){if(gotKeyPressEvent=!0,Q("softKeyboard").value="",null!=currentNode){var n=GetMeshRights(currentNode.meshid);if(0==!(8192&features2||4294967295!=n&&(!(8&n)||256&n)))return!1;if(1==!(4294967295==n||!(8&n)||256&n||!(4096&n))&&(1==e.altKey||1==e.ctrlKey||e.keyCode<32&&8!=e.keyCode&&13!=e.keyCode||e.keyCode>90))return!1}return desktop.m.handleKeys(e)}if(terminal&&!xxdialogMode&&10==xxcurrentView&&5==currentDevicePanel&&1!==t){if(1==e.altKey)return!0;gotKeyPressEvent=!0,Q("softKeyboard").value="";var o=0;return 0!=e.charCode?o=e.charCode:0!=e.keyCode&&(o=e.keyCode),0!=o&&("sshterminalrelay.ashx"==terminal.urlname?terminal.socket.send("~"+String.fromCharCode(o)):terminal.sendText(String.fromCharCode(o))),!1}}function ondeskkeydown(e,t){if(setSessionActivity(),desktop&&!xxdialogMode&&10==xxcurrentView&&1==currentDevicePanel){if(gotKeyPressEvent=!1,Q("softKeyboard").value="",null!=currentNode){var n=GetMeshRights(currentNode.meshid);if(0==!(8192&features2||4294967295!=n&&(!(8&n)||256&n)))return!1;if(1==!(4294967295==n||!(8&n)||256&n||!(4096&n))&&(1==e.altKey||1==e.ctrlKey||e.keyCode<32&&8!=e.keyCode&&13!=e.keyCode||e.keyCode>90))return!1}return desktop.m.handleKeyDown(e)}if(terminal&&!xxdialogMode&&10==xxcurrentView&&5==currentDevicePanel&&1!==t){if(1==e.altKey)return!0;Q("softKeyboard").value="",gotKeyPressEvent=!1;var o=0;0!=e.charCode?o=e.charCode:0!=e.keyCode&&(o=e.keyCode),8==o?"sshterminalrelay.ashx"==terminal.urlname?terminal.socket.send("~"+String.fromCharCode(o)):terminal.sendText(String.fromCharCode(o)):e.ctrlKey&&o>=64&&o<=95&&("sshterminalrelay.ashx"==terminal.urlname?terminal.socket.send("~"+String.fromCharCode(o-64)):terminal.sendText(String.fromCharCode(o-64)))}}function ondeskkeyup(e,t){if(setSessionActivity(),desktop&&!xxdialogMode&&10==xxcurrentView&&1==currentDevicePanel){var n=Q("softKeyboard").value;if(Q("softKeyboard").value="",null!=currentNode){var o=GetMeshRights(currentNode.meshid);if(0==!(8192&features2||4294967295!=o&&(!(8&o)||256&o)))return!1;if(1==!(4294967295==o||!(8&o)||256&o||!(4096&o))&&(1==e.altKey||1==e.ctrlKey||e.keyCode<32&&8!=e.keyCode&&13!=e.keyCode||e.keyCode>90))return!1}if(!(0==gotKeyPressEvent&&n.length>0&&desktop.m.SendKeyUnicode))return desktop.m.handleKeyUp(e);var i=n[n.length-1].charCodeAt(0);desktop.m.SendKeyUnicode(desktop.m.KeyAction.DOWN,i),desktop.m.SendKeyUnicode(desktop.m.KeyAction.UP,i)}if(terminal&&!xxdialogMode&&10==xxcurrentView&&5==currentDevicePanel&&0==gotKeyPressEvent&&1!==t){if(1==e.altKey)return!0;n=Q("softKeyboard").value;return Q("softKeyboard").value="","sshterminalrelay.ashx"==terminal.urlname?terminal.socket.send("~"+n):n&&terminal.sendText(n),!1}}var deviceHeaderCount,sort=0,deviceHeaderId=0,deviceHeaders={},showRealNames=!1,deviceHeaderTotal=0,deviceHeadersTitles=(deviceHeaders={},{});function updateDevices(){var e="",t=0,n=null,o=0,i={};for(var a in deviceHeaderId=0,deviceHeaderCount={},deviceHeaderTotal=0,deviceHeaders={},deviceHeadersTitles={},0==sort?nodes.sort(meshSort):1==sort?nodes.sort(powerSort):2==sort&&(1==showRealNames?nodes.sort(deviceHostSort):nodes.sort(deviceSort)),nodes)if(0!=nodes[a].v){if(0==sort){if(nodes.sort(meshSort),(meshes[nodes[a].meshid]?nodes[a].meshid:"*")!=n){deviceHeaderSet();var s="";null!=meshes[nodes[a].meshid]&&1==meshes[nodes[a].meshid].mtype&&(s="<span style=color:lightgray>，只適用於Intel&reg; AMT</span>"),null!=n&&(2==t&&(e+="<td><div style=width:301px></div></td>"),""!=e&&(e+="</tr></table>")),e+="<div class=DevSt style=padding-top:4px><span style=float:right>",meshes[nodes[a].meshid]?(e+='</span><span id=MxMESH style=cursor:pointer onclick=goForward("'+nodes[a].meshid+'")>'+EscapeHtml(meshes[nodes[a].meshid].name)+"</span>"+s+"<span id=DevxHeader"+deviceHeaderId+" style=color:lightgray></span></div>",n=nodes[a].meshid):(e+="</span><span id=MxMESH><i>個別裝置</i></span><span id=DevxHeader"+deviceHeaderId+" style=color:lightgray></span></div>",n="*"),i[n]=1,t=0}}else 1==sort?nodes[a].pwr!==n&&(deviceHeaderSet(),null!==n&&(2==t&&(e+="<td><div style=width:301px></div></td>"),""!=e&&(e+="</tr></table>")),e+="<div class=DevSt style=width:100%;padding-top:4px><span>"+PowerStateStr2(nodes[a].pwr)+"</span><span id=DevxHeader"+deviceHeaderId+" style=color:lightgray></span></div>",n=nodes[a].pwr,t=0):2==sort&&null==n&&(n="1");o++,e+="<div name=xxdevice onclick=goForward('"+nodes[a]._id+"') class=devList1 id='"+nodes[a]._id+"'></div>",deviceHeaderTotal++,void 0===deviceHeaderCount[nodes[a].state]?deviceHeaderCount[nodes[a].state]=1:deviceHeaderCount[nodes[a].state]++}if(""==e&&nodes.length>0&&""!=Q("SearchInput").value&&(e='<div style="margin:30px">沒有與此搜索匹配的裝置。</div>'),0==sort&&""==Q("SearchInput").value)for(var a in meshes){var l=meshes[a];null==i[l._id]&&IsMeshViewable(l)&&(""!=n&&""!=e&&(e+="</tr></table>"),e+="<div><div colspan=3 class=DevSt><span style=float:right>",e+='</span><span id=MxMESH style=cursor:pointer onclick=goForward("'+l._id+'")>'+EscapeHtml(l.name)+"</span></div>",1==l.mtype&&(e+="<div style=padding:10px><i>該群中沒有Intel&reg; AMT裝置"),l.mtype>1&&(e+="<div style=padding:10px><i>該群中沒有裝置"),e+=".</i></div></div>",n=l._id,o++)}for(var a in 0==o?""!=Q("SearchInput").value||Q("OnlineCheckBox").checked?QH("xdevices",'<div style="margin-top:50px;text-align:center"><span style="font-size:30px">沒有裝置</span><br /><br />沒有與此搜索匹配的裝置。 <a onclick=clearSearchInput() style=cursor:pointer>清除搜索過濾器</a></div>'):QH("xdevices",'<div style="margin-top:50px;text-align:center"><span style="font-size:30px">沒有裝置</span><br /><br />使用此網站的桌面版本新增裝置。</div>'):QH("xdevices",e),deviceHeaderSet(),deviceHeaders)QH(a,deviceHeaders[a]);for(var a in deviceHeadersTitles)Q(a).title=deviceHeadersTitles[a];onDevicesScrollEx()}var onDevicesTouchActive=!1,onDevicesScrollnagleTimer=null;function onDevicesScroll(){null==onDevicesScrollnagleTimer&&(onDevicesScrollnagleTimer=setTimeout(onDevicesScrollEx,250))}function onDeviceTouch(e){onDevicesTouchActive!=e&&(onDevicesTouchActive=e,0==e&&onDevicesScrollEx())}function onDevicesScrollEx(){var e=document.getElementsByName("xxdevice");onDevicesScrollnagleTimer=null;for(var t=0;t<e.length;t++){var n=getNodeFromId(e[t].id);if(null==n)break;updateDeviceViewHtml(e[t],n)}}function updateDeviceViewDevice(e){if(null!=e){var t=Q(e._id);null!=t&&""!=t.innerHTML&&updateDeviceViewHtml(t,e)}}function updateDeviceViewHtml(e,t){var n=Q("xdevices").scrollTop-250,o=Q("xdevices").scrollTop+Q("xdevices").clientHeight+250;if(e.offsetTop>=n&&e.offsetTop<o){var i=EscapeHtml(t.name);0==i.length&&(i="<i>沒有</i>"),null!=t.rname&&t.rname.length>0&&(i+=" / "+EscapeHtml(t.rname));var a=EscapeHtml(t.name);1==showRealNames&&null!=t.rname&&(a=EscapeHtml(t.rname)),0==a.length&&(a="<i>沒有</i>");var s="",l="";if(1==stars[t._id]&&(l+="<img class=deviceNotifyDotSub src=images/icon-star-notify-16.png width=16 height=16>"),null!=t.sessions&&(null!=t.sessions.msg&&(l+='<div style="width:16;height:16" class=deviceNotifyDotSub>'+Object.keys(t.sessions.msg).length+"</div>"),null==t.sessions.kvm&&null==t.sessions.terminal&&null==t.sessions.files&&null==t.sessions.tcp&&null==t.sessions.udp||(l+="<img class=deviceNotifyDotSub src=images/icon-relay-notify.png width=16 height=16>"),null!=t.sessions.help&&(l+="<img class=deviceNotifyDotSub src=images/icon-help-notify-16.png width=16 height=16>"),null!=t.sessions.battery)){var r=t.sessions.battery,d="";"ac"==r.state?d="裝置已插入":"dc"==r.state&&(d="裝置由電池供電");var u="",c=-1;"number"==typeof r.level&&r.level>=0&&r.level<=100&&(u=r.level+"%",(c=Math.floor((r.level+10)/25)+1)>5&&(lvl=5),"ac"==r.state&&(100==r.level?c=11:c+=5)),c>0&&(s+='<div class="deviceBatterySmall deviceBatterySmall'+c+'" title="'+(null!=d?d+", "+u:u)+'"></div>')}""!=l&&(s+="<div class=deviceNotifyDot>"+l+"</div>");var p=t.icon,m=NodeStateStr(t);t.conn&&0!=t.conn||3==t.mtype||(p+=" gray"),e.innerHTML="<div>"+s+'<div class="i'+p+' devList2"></div><div class=devList3><div class=devList4><b>'+a+"</b></div><div class=devList5>"+m+"</div></div></div>"}else e.innerHTML=""}function showDeviceHelpRequests(e,t,n){if(n&&haltEvent(n),xxdialogMode&&!t)return!1;var o=null,i="";if(null==(o=null==e?currentNode:getNodeFromId(e))||null==o.sessions)return setDialogMode(0),!1;if(null!=o.sessions.help)for(var a in o.sessions.help)i+="<div style=margin-bottom:6px><b>"+EscapeHtml(a)+"</b></div><div style=margin-bottom:6px>"+EscapeHtml(o.sessions.help[a])+"</div>";return""!=i?setDialogMode(2,"幫助請求 - "+EscapeHtml(o.name),1,null,i,"HELPREQ-"+o._id):setDialogMode(0),!1}function showDeviceSessions(e,t,n){if(!(!0!==t&&xxdialogMode||null==currentNode)){var o=currentNode,i="";for(var a in o.sessions)if("kvm"==a&&null==o.sessions.multidesk)for(var s in i+="<u>遠程桌面</u>",o.sessions.kvm)if(s.startsWith("user/")){var l="";s!=userinfo._id&&4294967295!=GetNodeRights(o)||(l=' <a href=# onclick=\'return endDeviceSession("kvm", "'+encodeURIComponentEx(o._id)+'", "'+encodeURIComponentEx(s)+'")\' title="斷開此會話" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'),i+=addHtmlValue4(getUserName(s),(1==o.sessions.kvm[s]?"1節":nobreak(format("{0}節",o.sessions.kvm[s])))+l)}else"busy"==s&&(i+=addHtmlValue2("設備忙",1==o.sessions.kvm[s]?"1節":nobreak(format("{0}節",o.sessions.kvm[s]))));else if("multidesk"==a)for(var s in i+="<u>遠程桌面</u>",o.sessions.multidesk){l="";s!=userinfo._id&&4294967295!=GetNodeRights(o)||(l=' <a href=# onclick=\'return endDeviceSession("multidesk", "'+encodeURIComponentEx(o._id)+'", "'+encodeURIComponentEx(s)+'")\' title="斷開此會話" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'),i+=addHtmlValue4(getUserName(s),(1==o.sessions.multidesk[s]?"1節":nobreak(format("{0}節",o.sessions.multidesk[s])))+l)}else if("terminal"==a)for(var s in i+="<u>終端機</u>",o.sessions.terminal){l="";s!=userinfo._id&&4294967295!=GetNodeRights(o)||(l=' <a href=# onclick=\'return endDeviceSession("terminal", "'+encodeURIComponentEx(o._id)+'", "'+encodeURIComponentEx(s)+'")\' title="斷開此會話" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'),i+=addHtmlValue4(getUserName(s),(1==o.sessions.terminal[s]?"1節":nobreak(format("{0}節",o.sessions.terminal[s])))+l)}else if("files"==a)for(var s in i+="<u>檔案</u>",o.sessions.files){l="";s!=userinfo._id&&4294967295!=GetNodeRights(o)||(l=' <a href=# onclick=\'return endDeviceSession("files", "'+encodeURIComponentEx(o._id)+'", "'+encodeURIComponentEx(s)+'")\' title="斷開此會話" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'),i+=addHtmlValue4(getUserName(s),(1==o.sessions.files[s]?"1節":nobreak(format("{0}節",o.sessions.files[s])))+l)}else if("tcp"==a)for(var s in i+="<u>TCP路由</u>",o.sessions.tcp){l="";s!=userinfo._id&&4294967295!=GetNodeRights(o)||(l=' <a href=# onclick=\'return endDeviceSession("tcp", "'+encodeURIComponentEx(o._id)+'", "'+encodeURIComponentEx(s)+'")\' title="斷開此會話" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'),i+=addHtmlValue4(getUserName(s),(1==o.sessions.tcp[s]?"1節":nobreak(format("{0}節",o.sessions.tcp[s])))+l)}else if("udp"==a)for(var s in i+="<u>UDP路由</u>",o.sessions.udp){l="";s!=userinfo._id&&4294967295!=GetNodeRights(o)||(l=' <a href=# onclick=\'return endDeviceSession("udp", "'+encodeURIComponentEx(o._id)+'", "'+encodeURIComponentEx(s)+'")\' title="斷開此會話" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'),i+=addHtmlValue4(getUserName(s),(1==o.sessions.udp[s]?"1節":nobreak(format("{0}節",o.sessions.udp[s])))+l)}""!=i?setDialogMode(2,"節 - "+EscapeHtml(o.name),1,null,i,"SESSIONS-"+o._id):setDialogMode(0)}}function endDeviceSession(e,t,n){var o=decodeURIComponent(n).split("/"),i=o[0]+"/"+o[1]+"/"+o[2],a=null;4==o.length&&o[3].startsWith("guest:")&&(a=atob(o[3].substring(6))),"multidesk"==e?meshserver.send({action:"endDesktopMultiplex",nodeid:decodeURIComponent(t),xuserid:i,guestname:a,guestname:a}):meshserver.send({action:"msg",type:"endtunnel",nodeid:decodeURIComponent(t),xuserid:i,guestname:a,guestname:a,protocol:e})}function showDeviceMessages(e,t,n){if(n&&haltEvent(n),xxdialogMode&&!t)return!1;var o=null,i="<div style=max-height:200px;width:100%;overflow-y:auto;overflow-x:hidden>",a=0;if(null==(o=null==e?currentNode:getNodeFromId(e))||null==o.sessions||null==o.sessions.msg)return setDialogMode(0),!1;for(var s in o.sessions.msg){var l=s,r=5;"string"==typeof o.sessions.msg[s].msg&&(l=o.sessions.msg[s].msg),"number"==typeof o.sessions.msg[s].icon&&(r=o.sessions.msg[s].icon),(r<1||r>9)&&(r=5),i+="<table style=width:100%><td style=width:24px><div class=NotifyIconSmall"+r+'></div><td><div style="border-radius:5px;background-color:#BBB;width:calc(100% - 18px);padding:8px">'+EscapeHtml(l)+"</div></table>",a++}return i+="</div>",a>0&&setDialogMode(2,"代理訊息 - "+EscapeHtml(o.name),1,null,i,"MESSAGES-"+o._id),!1}var powerStatetable=["","有電源","休眠","休眠","休眠","冬眠","關機","存在","離開"],powerStateStrings=["","有電源","休眠中","休眠中","沉睡","冬眠","軟關機","存在","離開"],powerStateStrings2=["","裝置已連接電源","裝置處於睡眠狀態（S1）","裝置處於睡眠狀態（S2）","裝置處於深度睡眠狀態（S3）","裝置正在休眠（S4）","裝置處於軟關機狀態（S5）","裝置存在，但無法確定電源狀態","設備已關機"],powerColorTable=["#00000000","black","blue","blue","lightblue","blueviolet","darkgreen","lightseagreen","lightseagreen"];function NodeStateStr(e){var t=[];return e.state>0&&e.state<powerStatetable.length&&state.push(powerStatetable[e.state]),e.conn&&(1&e.conn&&t.push("<span>"+(4==e.mtype?"PDU"==e.porttype?"轉變":"IP-KVM":"代理")+"</span>"),2&e.conn?t.push("<span>CIRA</span>"):4&e.conn&&t.push("<span>Intel&reg; AMT</span>"),8&e.conn&&t.push("<span>中繼</span>"),16&e.conn&&t.push("<span>MQTT</span>")),null!=e.pwr&&0!=e.pwr&&t.push(powerStateStrings[e.pwr]),t.join(", ")}function PowerStateStr(e){return e<powerStatetable.length?powerStatetable[e]:""}function PowerStateStr2(e){return 0!=e&&e<powerStatetable.length?powerStatetable[e]:"未知"}function onSortSelectChange(e){sort=document.getElementById("sortselect").selectedIndex,e||putstore("sort",sort),mainUpdate(4)}function deviceHeaderSet(){if(0!=deviceHeaderId){deviceHeaders["DevxHeader"+deviceHeaderId]=", "+deviceHeaderTotal+" 節點";var e="";for(var t in deviceHeaderCount)e.length>0&&(e+=", "),e+=deviceHeaderCount[t]+" "+PowerStateStr2(t);deviceHeadersTitles["DevxHeader"+deviceHeaderId]=e,deviceHeaderId++,deviceHeaderCount={},deviceHeaderTotal=0}else deviceHeaderId=1}var sortCollator=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function meshSort(e,t){var n=sortCollator.compare(e.meshnamel,t.meshnamel);return 0!=n||0!=(n=sortCollator.compare(e.meshid,t.meshid))?n:1==showRealNames?sortCollator.compare(e.rnamel,t.rnamel):sortCollator.compare(e.namel,t.namel)}function powerSort(e,t){var n=e.pwr?e.pwr:0,o=t.pwr?t.pwr:0;return n>o?-1:n<o?1:n==o?1==showRealNames?sortCollator.compare(e.rnamel,t.rnamel):sortCollator.compare(e.namel,t.namel):void 0}function deviceSort(e,t){return sortCollator.compare(e.namel,t.namel)}function deviceHostSort(e,t){return sortCollator.compare(e.rnamel,t.rnamel)}function refreshDevice(e){currentNode&&currentNode._id==e&&gotoDevice(e,xxcurrentView,!0)}var currentNode,currentDevicePanel=0,powerTimelineNode=null,powerTimelineReq=null,powerTimelineUpdate=null,powerTimeline=null;function getCurrentNode(){return currentNode}function gotoDevice(e,t,n){if(!0===userinfo.emailVerified||1!=serverinfo.emailcheck||4294967295==userinfo.siteadmin)if(!(262144&features)||1==userinfo.otpsecret||userinfo.otphkeys>0||userinfo.otpkeys>0||userinfo.otpduo>0||userinfo.otpdev>0||8388608&features&&1==userinfo.otpekey){var o=getNodeFromId(e);if(null!=o){var i=meshes[o.meshid],a=GetNodeRights(o),s=null==currentNode||currentNode._id!=e;if(!currentNode||currentNode._id!=o._id||1==n){if(currentNode=o,QV("p10deviceNotify",null!=currentNode.sessions&&(null!=o.sessions.kvm||null!=o.sessions.terminal||null!=o.sessions.files||null!=o.sessions.tcp||null!=o.sessions.udp)),QV("p10deviceStar",1==stars[currentNode._id]),QV("p10deviceHelp",null!=currentNode.sessions&&null!=currentNode.sessions.help),null!=currentNode.sessions&&null!=currentNode.sessions.msg?(QV("p10deviceMsg",!0),QH("p10deviceMsg",Object.keys(currentNode.sessions.msg).length)):QV("p10deviceMsg",!1),QV("p10deviceBattery",!1),null!=currentNode.sessions&&null!=currentNode.sessions.battery){var l=currentNode.sessions.battery,r="";"ac"==l.state&&(r="裝置已插入"),"dc"==l.state&&(r="裝置由電池供電");var d="",u=-1;"number"==typeof l.level&&l.level>=0&&l.level<=100&&(d=l.level+"%",(u=Math.floor((l.level+10)/25)+1)>5&&(lvl=5),"ac"==l.state&&(100==l.level?u=11:u+=5)),u>0&&(Q("p10deviceBattery").title=null!=r?r+", "+d:d,QV("p10deviceBattery",!0),Q("p10deviceBattery").className="deviceBatteryLarge deviceBatteryLarge"+u)}else QV("p10deviceBattery",!1);var c=EscapeHtml(o.name);0==c.length&&(c="<i>沒有</i>"),4&a&&(c="<span onclick=showEditNodeValueDialog(0) style=cursor:pointer>"+c+"</span>"),QH("p10deviceName",c);var p="<table style=width:100%>";i&&(p+=addDeviceAttribute("<span>群</span>",'<a onclick=goForward("'+o.meshid+'") style=cursor:pointer>'+EscapeHtml(meshes[o.meshid].name)+"</a>")),null!=o.rname&&(p+=addDeviceAttribute("<span>名稱</span>","<span>"+EscapeHtml(o.rname)+"</span>")),(1&features||4==o.mtype)&&3!=o.mtype||(4&a?o.host?p+=addDeviceAttribute("主機名","<span onclick=showEditNodeValueDialog(1) style=cursor:pointer>"+EscapeHtml(o.host)+"</span>"):p+=addDeviceAttribute("主機名","<span onclick=showEditNodeValueDialog(1) style=cursor:pointer><i>沒有</i></span>"):p+=addDeviceAttribute("主機名",EscapeHtml(o.host)));var m=o.desc?EscapeHtml(o.desc):"<i>沒有</i>";if(p+=addDeviceAttribute("描述",4&a?"<span onclick=showEditNodeValueDialog(2) style=cursor:pointer>"+m+"</span>":m),4==o.mtype&&(null!=o.portnum&&(p+=addDeviceAttribute("端口號",o.portnum)),null!=o.porttype&&(p+=addDeviceAttribute("端口類型",o.porttype))),null!=o.agent&&null!=o.agent.id&&3==o.mtype)4==o.agent.id&&(p+=addDeviceAttribute("設備類型","視窗")),6==o.agent.id&&(p+=addDeviceAttribute("設備類型","Linux")),29==o.agent.id&&(p+=addDeviceAttribute("設備類型","macOS"));else if(null!=o.agent&&null!=o.agent.id&&null!=o.agent.ver){var g="";g=o.agent.id<=agentsStr.length?agentsStr[o.agent.id]:agentsStr[0],0!=o.agent.ver&&(g+=" v"+o.agent.ver),14==o.agent.id&&(g=o.agent.core),!1===o.agent.root&&1&o.conn&&(g+=", 受限制的"),p+=addDeviceAttribute("Mesh Agent",g)}if(null!=o.intelamt){g="";var f={0:nobreak("未啟動（預）"),1:nobreak("未啟動（輸入）"),2:nobreak("已啟動")};if(null!=o.intelamt.ver&&null==o.intelamt.state?g+="<i>"+nobreak("未知狀態")+"</i>, v"+EscapeHtml(o.intelamt.ver):null==o.intelamt.ver&&2==o.intelamt.state?g+="<i>已啟動</i>":null==o.intelamt.ver||null==o.intelamt.state?g+="<i>未知版本和狀態</i>":(g+=f[o.intelamt.state],o.intelamt.flags&&(2&o.intelamt.flags?g=" <span>CCM</span>":4&o.intelamt.flags&&(g=" <span>ACM</span>")),g+=", v"+EscapeHtml(o.intelamt.ver)),2==o.intelamt.state){1==o.intelamt.tls&&(g+=', <span title="Intel&reg; AMT已設置TLS網絡安全性">TLS</span>');var h=!1;if(null==o.intelamt.user||""==o.intelamt.user)4&a?(g+=', <i style=color:#FF0000;cursor:pointer title="編輯Intel&reg; AMT憑證" onclick=editDeviceAmtSettings("'+o._id+'")>沒有憑證</i>',h=!0):g+=", <i style=color:#FF0000>沒有憑證</i>";else if(1&features2&&null!=o.intelamt.warn){var v=null;1&o.intelamt.warn&&(v="無效證件"),8&o.intelamt.warn&&(v="嘗試憑證"),null!=v&&(4&a?(g+=', <i style=color:#FF0000;cursor:pointer title="編輯Intel&reg; AMT憑證" onclick=editDeviceAmtSettings("'+o._id+'")>'+v+"</i>",h=!0):g+=", <i style=color:#FF0000>"+v+"</i>")}4&a&&!(1&features2)&&(h=!0),g+=" ",h&&(g+='<img src=images/link4.png height=10 width=10 title="編輯Intel&reg; AMT憑證" style=cursor:pointer onclick=editDeviceAmtSettings("'+o._id+'")>')}var k="Intel&reg; ME";"number"==typeof o.intelamt.sku&&(8&o.intelamt.sku?k="Intel&reg; AMT":16&o.intelamt.sku&&(k="Intel&reg; M")),p+=addDeviceAttribute(k,g)}if(null!=o.agent&&null!=o.agent.tag&&"mailto:"!=o.agent.tag){var y=EscapeHtml(o.agent.tag);y.startsWith("mailto:")&&(y='<a href="'+y+'">'+y.substring(7)+"</a>"),p+=addDeviceAttribute("代理標籤",y)}var x=o.conn;if(x&&x>1){var b=[];1&o.conn&&b.push("<span>"+(4==o.mtype?"PDU"==o.porttype?"轉變":"IP-KVM":"代理")+"</span>"),2&o.conn?b.push("<span>Intel&reg; AMT CIRA</span>"):4&o.conn&&b.push("<span>Intel&reg; AMT</span>"),8&o.conn&&b.push("<span>代理中繼</span>"),16&o.conn&&b.push("<span>MQTT</span>"),p+=addDeviceAttribute("連接性",b.join(", "))}var w="<i>沒有</i>";if(null!=o.tags)for(var S in w="",o.tags)w+="<span class=tagSpan>"+EscapeHtml(o.tags[S])+"</span> ";if(p+=addDeviceAttribute("標籤",4&a?"<span onclick=showEditNodeValueDialog(3) style=cursor:pointer;color:black>"+w+"</span>":"<span style=line-height:26px;color:black>"+w+"</span>"),null!=o.ssh||null!=o.rdp){var D=[];4&a?(null!=o.ssh&&D.push("<span onclick=showClearSshDialog(3) style=cursor:pointer>"+(1==o.ssh?"SSH-用戶+密碼":2==o.ssh?"SSH-用戶+密鑰+密碼":"SSH-用戶+密鑰")+' <img class=hoverButton src="images/link5.png" width=10 height=10 /></span>'),null!=o.rdp&&D.push('<span onclick=showClearRdpDialog(3) style=cursor:pointer>RDP <img class=hoverButton src="images/link5.png" width=10 height=10 /></span>')):(null!=o.ssh&&D.push(1==o.ssh?"SSH-用戶+密碼":2==o.ssh?"SSH-用戶+密鑰+密碼":"SSH-用戶+密鑰"),null!=o.rdp&&D.push("RDP")),p+=addDeviceAttribute("證書",D.join(", "))}p+="</table><br />",262220&a&&o.mtype<3&&(p+='<input type=button value="動作" onclick=deviceActionFunction() />'),p+='<input type=button value="筆記" onclick=showNotes('+!(128&a)+',"'+encodeURIComponent(o._id)+'") />',4==o.mtype&&1&x&&("PDU"==o.porttype?1==o.pwr?262144&a&&(p+='<input type=button value="關掉" title="關掉" onclick=setIpPduState(0) />'):8==o.pwr&&64&a&&(p+='<input type=button value="打開" title="打開" onclick=setIpPduState(1) />'):8&a&&(p+='<input type=button value="遙控" title="遙控" onclick=openIpKvmRemoteControl("'+encodeURIComponentEx(o._id)+'") />')),QH("p10html",p),3==o.mtype&&null!=o.agent&&o.agent.id>4&&512&features2&&(o.agent.caps=6),setupTerminal(),setupFiles(),16&a&&setupConsole(),p="<div style=float:right;font-size:x-small;margin-right:10px>",32768&a&&(p+='<a style=cursor:pointer onclick=p10showDeleteNodeDialog("'+o._id+'")>刪除裝置</a>'),p+="</div><div style=font-size:x-small>",0!=webRelayPort&&(p+='<a onclick=p10WebRouter("'+o._id+'",1,'+(o.httpport?o.httpport:80)+")>HTTP"+(o.httpport&&80!=o.httpport?"/"+o.httpport:"")+"</a>&nbsp;",p+='<a onclick=p10WebRouter("'+o._id+'",2,'+(o.httpsport?o.httpsport:443)+")>HTTPS"+(o.httpsport&&443!=o.httpsport?"/"+o.httpsport:"")+"</a>&nbsp;"),(1&x||3==o.mtype)&&o.agent&&8&a&&!(536870912&features)&&(p+='<a id=rfbLink onclick=p10rfb("'+o._id+'")>網絡-VNC</a>&nbsp;'),(1&x||3==o.mtype)&&o.agent&&8&a&&!(1073741824&features)&&(p+='<a id=mstscLink onclick=p10mstsc("'+o._id+'")>網絡RDP</a>&nbsp;'),512&features2&&(1&x||3==o.mtype)&&o.agent&&8&a&&(p+='<a id=sshLink onclick=p10ssh("'+o._id+'")>網絡SSH</a>&nbsp;'),p+="</div><br>",QH("p10html3",p);var M=PowerStateStr(o.state);1&x&&(M.length>0&&(M+=", "),M+=4==o.mtype?"PDU"==o.porttype?"轉變":"IP-KVM":"Mesh Agent"),2&x?(M.length>0&&(M+=", "),M+="Intel &reg;AMT已連接"):4&x&&(M.length>0&&(M+=", "),M+="檢測到Intel&reg; AMT"),16&x&&(M.length>0&&(M+=", "),M+="MQTT通道已連接"),("PDU"==o.porttype||o.pwr>1&&7!=o.pwr)&&(M.length>0&&(M+=", "),M+=powerStateStrings[o.pwr]),QH("MainComputerState","<span style=font-size:12px>"+M+"</span>");var C=o.icon;o.conn&&0!=o.conn||3==o.mtype||(C+=" gray"),QH("MainComputerImage",'<div class="i'+C+'"></div>'),powerTimelineNode!=currentNode._id&&powerTimelineReq!=currentNode._id&&(QH("p10html2",""),powerTimelineReq=currentNode._id,meshserver.send({action:"powertimeline",nodeid:currentNode._id}),meshserver.send({action:"lastconnect",nodeid:currentNode._id}),meshserver.send({action:"getsysinfo",nodeid:currentNode._id}),meshserver.send({action:"getnetworkinfo",nodeid:currentNode._id}),QH("p10detailshtml","")),s&&(p11clearConsoleMsg(),p13clearConsoleMsg()),QV("p11DeskSessionSelector",!1),QH("p11DeskSessionSelector","")}setupDesktop(),t||(t=10),go(t),10==xxcurrentView&&setupDeviceMenu()}else goBack()}else setDialogMode(2,"帳號安全",1,null,"在啟用二因子身份驗證之前，無法訪問裝置。這是額外的安全性所必需的。轉到“我的帳戶”，然後查看“帳戶安全性”部分。");else setDialogMode(2,"帳號安全",1,null,"在驗證電郵地址之前，無法訪問裝置。這是密碼恢復所必需的。轉到“我的帳戶”以更改並驗證電郵地址。")}function setIpPduState(e){0==e?setDialogMode(2,"電源操作",3,function(){meshserver.send({action:"poweraction",nodeids:[currentNode._id],actiontype:2})},"執行斷電？"):setDialogMode(2,"電源操作",3,function(){meshserver.send({action:"wakedevices",nodeids:[currentNode._id]})},"執行開機？")}function openIpKvmRemoteControl(e){if(!xxdialogMode){var t=decodeURIComponent(e).split("/")[2];safeNewWindow("/ipkvm.ashx/"+t+"/","ipkvm:"+t)}}function deviceToastFunction(){xxdialogMode||setDialogMode(2,"裝置吐司",3,deviceToastFunctionEx,"<textarea id=d2devToast style=width:100%;height:80px;resize:none;overflow-y:scroll></textarea>")}function deviceToastFunctionEx(){meshserver.send({action:"toast",nodeids:[currentNode._id],title:"MeshCentral",msg:Q("d2devToast").value})}function setupDeviceMenu(e,t){var n=GetNodeRights(currentNode);null!=e&&(currentDevicePanel=e),QV("p10general",0==currentDevicePanel),QV("p10desktop",1==currentDevicePanel),QV("p10files",2==currentDevicePanel),QV("p10details",3==currentDevicePanel),QV("p10console",4==currentDevicePanel),QV("p10terminal",5==currentDevicePanel);var o=[];0!=currentDevicePanel&&o.push({n:"一般",f:"setupDeviceMenu(0)"}),1==currentDevicePanel||null==currentNode||!(8&n||256&n)||4294967295!=n&&65536&n||!(null==currentNode.agent&&currentNode.intelamt&&("number"!=typeof currentNode.intelamt.sku||8&currentNode.intelamt.sku)||currentNode.agent&&1&currentNode.agent.caps)||o.push({n:"桌面",f:"setupDeviceMenu(1)"}),5==currentDevicePanel||null==currentNode||!(8&n||256&n)||4294967295!=n&&512&n||!(null==currentNode.agent&&currentNode.intelamt&&("number"!=typeof currentNode.intelamt.sku||8&currentNode.intelamt.sku)||currentNode.agent&&2&currentNode.agent.caps)||o.push({n:"終端機",f:"setupDeviceMenu(5)"}),2!=currentDevicePanel&&null!=currentNode&&8&n&&(4294967295==n||!(1024&n))&&1!=currentNode.mtype&&currentNode.agent&&4&currentNode.agent.caps&&o.push({n:"檔案",f:"setupDeviceMenu(2)"}),3!=currentDevicePanel&&null!=currentNode&&currentNode.mtype<3&&1048576&n&&o.push({n:"細節",f:"setupDeviceMenu(3)"}),4!=currentDevicePanel&&null!=currentNode&&16&n&&2==currentNode.mtype&&o.push({n:"控制台",f:"setupDeviceMenu(4)"}),updateFooterMenu(o),updateCurrentUrl(),1==currentDevicePanel&&deskAdjust()}function deviceActionFunction(){if(!xxdialogMode){var e=GetNodeRights(currentNode),t=0,n="選擇要在此裝置上執行的操作。<br /><br />",o="<select id=d2deviceop style=float:right;width:170px onchange=deviceActionFunctionValidate()>",i="";null!=currentNode.agent&&14==currentNode.agent.id?1&currentNode.conn&&8&e&&(t++,o+="<option value=400>閃光</option>",o+="<option value=401>顫動</option>",i+="<div id=d2devicetimediv>"+addHtmlValue("時間","<select id=d2devicetime style=float:right;width:170px><option value=1000>1秒</option><option value=5000>5秒</option><option value=10000>10 秒</option></select>")+"</div>"):(64&e&&(t++,o+="<option value=100>喚醒</option>"),0!=currentNode.conn&&262144&e&&(t++,o+="<option value=4>休眠</option><option value=3>重設</option><option value=2>關機</option>"),null!=currentNode.intelamt&&2==currentNode.intelamt.state&&6&currentNode.conn&&262144&e&&(t++,o+="<option value=310>英特爾&reg; AMT 重置</option>",o+="<option value=308>英特爾&reg; AMT 關機</option>"),null!=currentNode.intelamt&&2==currentNode.intelamt.state&&6&currentNode.conn&&64&e&&(t++,o+="<option value=302>英特爾&reg; AMT 開機</option>")),n+=addHtmlValue("操作",o+="</select>"),0==t&&(n="該設備當前無可用操作。"),setDialogMode(2,"裝置指令",0==t?2:3,deviceActionFunctionEx,n+i),t>0&&deviceActionFunctionValidate()}}function deviceActionFunctionValidate(){var e=Q("d2deviceop").value;try{QV("d2devicetimediv",400==e||401==e)}catch(e){}}function deviceActionFunctionEx(){var e=Q("d2deviceop").value;100==e?meshserver.send({action:"wakedevices",nodeids:[currentNode._id]}):103==e||104==e||106==e||107==e||(302==e?setDialogMode(2,"英特爾&reg; AMT 電源操作",3,function(){meshserver.send({action:"poweraction",nodeids:[currentNode._id],actiontype:parseInt(e)})},"執行英特爾&reg; AMT 開機？"):308==e?setDialogMode(2,"英特爾&reg; AMT 電源操作",3,function(){meshserver.send({action:"poweraction",nodeids:[currentNode._id],actiontype:parseInt(e)})},"Perform Intel&reg; AMT power off?<br><br><b>NOTE: If there is an active AMT session, then power off command will be rejected, so you must disconnect from the AMT session first!</b>"):310==e?setDialogMode(2,"英特爾&reg; AMT 電源操作",3,function(){meshserver.send({action:"poweraction",nodeids:[currentNode._id],actiontype:parseInt(e)})},"執行英特爾&reg; AMT 重置？"):400==e||401==e?meshserver.send({action:"poweraction",nodeids:[currentNode._id],actiontype:parseInt(e),time:parseInt(Q("d2devicetime").value)}):meshserver.send({action:"poweraction",nodeids:[currentNode._id],actiontype:parseInt(e)}))}function showNotes(e,t){if(!xxdialogMode){null==t&&(t=encodeURIComponentEx("p"+userinfo._id));var n="<textarea id=d2devNotes ro="+e+" noteid="+t+" readonly style=background-color:#fcf3cf;width:100%;height:200px;resize:none;overflow-y:scroll></textarea>";t.startsWith("node%2F%2F")&&(n+="<span style=font-size:10px>其他裝置群管理員可以查看和更改裝置群註釋。<span>"),setDialogMode(2,"筆記",3,showNotesEx,n,t),meshserver.send({action:"getNotes",id:decodeURIComponent(t)})}}function showNotesEx(e,t){meshserver.send({action:"setNotes",id:decodeURIComponent(t),notes:encodeURIComponentEx(Q("d2devNotes").value)})}function deviceLockFunction(){null==xxdialogMode&&0!=xxdialogMode||null==desktop||1!=desktop.contype||setDialogMode(2,"鎖定桌面",3,function(){null!=desktop&&1==desktop.contype&&desktop.sendCtrlMsg('{"ctrlChannel":"102938","type":"lock"}')},"鎖定用戶桌面？")}function deviceChat(e){xxdialogMode||setDialogMode(2,"裝置指令",3,function(){var t="/messenger?id=meshmessenger/"+encodeURIComponentEx(currentNode._id)+"/"+encodeURIComponentEx(userinfo._id)+"&title="+currentNode.name;""!=serverinfo.domainsuffix&&(t="/"+serverinfo.domainsuffix+t),null!=authCookie&&""!=authCookie&&(t+="&auth="+authCookie),e&&1==e.shiftKey?safeNewWindow(t,"meshmessenger:"+currentNode._id):safeNewWindow(t,"meshmessenger:"+currentNode._id,"directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=400,height=560"),meshserver.send({action:"meshmessenger",nodeid:decodeURIComponent(currentNode._id)})},"開始聊天會話？")}function deviceUrlFunction(){xxdialogMode||(setDialogMode(2,"在裝置上打開頁面",3,deviceUrlFunctionEx,'<input id=d2devurl placeholder="http://server.com" style=width:100%;overflow-y:scroll onkeyup=deviceUrlFunctionValidate() onchange=deviceUrlFunctionValidate()></input>'),Q("d2devurl").focus(),deviceUrlFunctionValidate())}function deviceUrlFunctionValidate(){var e=Q("d2devurl").value.toLowerCase();QE("idx_dlgOkButton",e.startsWith("http://")&&e.length>7||e.startsWith("https://")&&e.length>8)}function deviceUrlFunctionEx(){meshserver.send({action:"msg",type:"openUrl",nodeid:currentNode._id,url:Q("d2devurl").value})}function runDeviceCmd(e){xxdialogMode||d2runCommandDialog({nodeids:[e?decodeURIComponent(e):currentNode._id]})}function d2runCommandDialog(e){var t=!1,n=!1,o=!1;for(var i in e.nodeids){var a=getNodeFromId(e.nodeids[i]);a.agent&&(24&~GetNodeRights(a)||(o=!0),isWindowsNode(a)?t=!0:n=!0)}if(1==t||1==n||1==o){var s={type:1,runAs:0,source:1,cmd:""};try{s=JSON.parse(getstore("runopt",s))}catch(e){}if(e.selectedFile){var l=e.selectedFile.name.toLowerCase();console.log("filename",l),l.endsWith(".bat")&&(s.type=1),l.endsWith(".ps1")&&(s.type=2),l.endsWith(".sh")&&(s.type=3),l.endsWith(".agentconsole")&&(s.type=4)}var r="";e.title&&(r+=e.title+"<br />"),r+="<select id=d2cmdtype onclick=d2runCommandValidate() style=width:100%;margin-bottom:4px;margin-top:4px>",1==t&&(r+="<option value=1"+(1==s.type?" selected":"")+">Windows命令提示</option><option value=2"+(2==s.type?" selected":"")+">Windows PowerShell</option>"),1==n&&(r+="<option value=3"+(3==s.type?" selected":"")+">Linux / BSD / macOS命令外殼</option>"),1==o&&(r+="<option value=4"+(4==s.type?" selected":"")+">代理控制台</option>"),r+="</select>",r+="<select id=d2cmduser style=width:100%;margin-bottom:4px><option value=0"+(0==s.runAs?" selected":"")+">以代理身份運行</option><option value=1"+(1==s.runAs?" selected":"")+">以用戶身份運行，如果沒有用戶，則運行代理</option><option value=2"+(2==s.runAs?" selected":"")+">必須以用戶身份運行</option></select>",null==e.selectedFile&&(r+="<select id=d2cmdsource onclick=d2runCommandValidate() style=width:100%;margin-bottom:4px><option value=0"+(0==s.source?" selected":"")+">Commands from text box</option><option value=1"+(1==s.source?" selected":"")+">Commands from file</option>",8&userinfo.siteadmin&&(r+="<option value=2"+(2==s.source?" selected":"")+">Commands from file on server</option>"),r+="</select><textarea id=d2runcmd onkeyup=d2runCommandValidate() style=background-color:#fcf3cf;width:100%;height:200px;resize:none;overflow-y:scroll>"+(s.cmd?EscapeHtml(decodeURIComponent(s.cmd)):"")+"</textarea>",r+="<div id=d2runfile style=display:none><input id=d2runfileex type=file onchange=d2runCommandValidate() id=d2localFile name=files onchange=d2runCommandValidate() /></div>",8&userinfo.siteadmin&&(r+='<div id=d2runsfile style=display:none><div id=d2serveraction valign=bottom><input type=button id=p2FolderUp disabled="disabled" onclick=d3folderup() value="Up" />&nbsp;<span id=p2CurrentFolder></span></div><div id=d2serverfiles></div></div>')),setDialogMode(2,"運行命令",3,d2groupActionFunctionRunCommands,r,e),null==e.selectedFile&&(Q("d2runcmd").focus(),8&userinfo.siteadmin&&(d3fileoptions={dialog:2,files:"d2serverfiles",folderup:"p2FolderUp",currentFolder:"p2CurrentFolder",func:null},d3updatefiles())),d2runCommandValidate()}}function d2runCommandValidate(){if(QV("d2cmduser",Q("d2cmdtype").value<4),null==xxdialogTag.selectedFile){QV("d2runcmd",0==Q("d2cmdsource").value),QV("d2runfile",1==Q("d2cmdsource").value),QV("d2runsfile",2==Q("d2cmdsource").value);var e=!1;0==Q("d2cmdsource").value&&Q("d2runcmd").value.length>0&&(e=!0),1==Q("d2cmdsource").value&&1==Q("d2runfileex").files.length&&(e=!0),2==Q("d2cmdsource").value&&(e=!1),QE("idx_dlgOkButton",e)}else QE("idx_dlgOkButton",!0)}function d2groupActionFunctionRunCommands(e,t){var n=3;try{n=parseInt(Q("d2cmdtype").value)}catch(e){}null==t.selectedFile&&putstore("runopt",JSON.stringify({type:n,runAs:parseInt(Q("d2cmduser").value),source:parseInt(Q("d2cmdsource").value),cmd:encodeURIComponent(Q("d2runcmd").value)}));var o={action:"runcommands",nodeids:t.nodeids,type:n,runAsUser:parseInt(Q("d2cmduser").value)};if(t.selectedFile)(i=new FileReader).onload=function(e){o.cmds=e.target.result,meshserver.send(o),t.func&&t.func()},i.readAsText(t.selectedFile);else if(0==Q("d2cmdsource").value)o.cmds=Q("d2runcmd").value,meshserver.send(o),t.func&&t.func();else if(1==Q("d2cmdsource").value){var i;(i=new FileReader).onload=function(e){o.cmds=e.target.result,meshserver.send(o),t.func&&t.func()},i.readAsText(Q("d2runfileex").files[0])}else if(2==Q("d2cmdsource").value){var a=d3getFileSel();if(1!=a.length)return;o.cmdpath=d3filetreelocation.join("/")+"/"+a[0],meshserver.send(o),t.func&&t.func()}}function updateDeviceTimeline(){2==meshserver.State&&null!=powerTimelineNode&&null!=powerTimelineUpdate&&null!=currentNode&&3!=currentNode.mtype&&powerTimelineNode==powerTimelineReq&&currentNode._id==powerTimelineNode&&powerTimelineUpdate<Date.now()&&(powerTimelineUpdate=null,meshserver.send({action:"powertimeline",nodeid:currentNode._id}))}function drawDeviceTimeline(){if(3!=currentNode.mtype&&"true"!==hidePowerTimeline){var e=null,t=Date.now();currentNode._id==powerTimelineNode&&(e=powerTimeline);var n=new Date;n.setHours(0,0,0,0);(n=new Date(n.getTime()-5184e5)).getTime();var o=[];if(null!=e&&e.length>1){o.push([0,e[1],e[0]]);for(var i=e[1],a=2;a<e.length;a+=2){var s=e[a],l=t;e.length>a+1&&(l=e[a+1]),o.push([i,i+l,s]),i+=l}}var r="",d=1,u=new Date,c=Q("masthead").offsetWidth-122;u.setHours(0,0,0,0);for(a=0;a<7;a++){var p="",m=u.getTime(),g=m+864e5;for(var f in o){var h=o[f];if(1==isTimeBlockInside(m,g,h[0],h[1])){var v=Math.max(m,h[0]),k=Math.min(Math.min(g,h[1]),t),y=Math.round((k-v)*c/864e5);y>0&&(p+="<div style=display:table-cell;width:"+y+"px;background-color:"+powerColor(h[2])+";height:16px></div>")}}r+="<tr style="+(d%2==0?"background-color:#DDD":"")+"><td><div>&nbsp;"+printDate(u)+"<div></div></div></td><td><div>"+p+"</div></td></tr>",++d,u=new Date(u.getFullYear(),u.getMonth(),u.getDate()-1)}QH("p10html2",'<table style="color:black;background-color:#EEE;border-color:#AAA;border-width:1px;border-style:solid;border-collapse:collapse;width:calc(100% - 18px);margin:9px" border=0 cellpadding=2 cellspacing=0><tbody><tr style=background-color:#AAAAAA;font-weight:bold><th scope=col style=text-align:center;width:90px>天</th><th scope=col style=text-align:center>電源狀態</th></tr>'+r+"</tbody></table>")}else QH("p10html2","<br />")}function powerColor(e){return e<powerColorTable.length?powerColorTable[e]:"yellow"}function isTimeBlockInside(e,t,n,o){return n<e&&o>t||(n>e&&n<t||o>e&&o<t)}function addDeviceAttribute(e,t){return"<tr><td style=width:100px;color:gray>"+e+"</td><td style=overflow:hidden>"+t+"</td></tr>"}function editDeviceAmtSettings(e,t){if(!xxdialogMode){var n="",o=getNodeFromId(e),i=3;4&GetNodeRights(o)&&(n+=addHtmlValue("用戶名",'<input id=dp10username style=width:170px maxlength=32 autocomplete=nope placeholder="admin" onchange=validateDeviceAmtSettings() onkeyup=validateDeviceAmtSettings() />'),n+=addHtmlValue("密碼","<input id=dp10password type=password style=width:170px autocomplete=nope maxlength=32 onchange=validateDeviceAmtSettings() onkeyup=validateDeviceAmtSettings() />"),1&features2||(n+=addHtmlValue("安全","<select id=dp10tls style=width:176px><option value=0>沒有TLS加密</option><option value=1>需要TLS加密</option></select>")),null!=o.intelamt.user&&""!=o.intelamt.user&&(i=7),setDialogMode(2,"編輯Intel&reg; AMT憑證",i,editDeviceAmtSettingsEx,n,{node:o,func:t}),null!=o.intelamt.user&&""!=o.intelamt.user?Q("dp10username").value=o.intelamt.user:Q("dp10username").value="admin",1&features2||(Q("dp10tls").value=o.intelamt.tls),validateDeviceAmtSettings())}}function validateDeviceAmtSettings(){QE("idx_dlgOkButton",passwordcheck(Q("dp10password").value))}function editDeviceAmtSettingsEx(e,t){if(2==e)meshserver.send({action:"changedevice",nodeid:t.node._id,intelamt:{user:"",pass:""}});else{var n=Q("dp10username").value;""==n&&(n="admin");var o=Q("dp10password").value;""==o&&(n="");var i={action:"changedevice",nodeid:t.node._id,intelamt:{user:n,pass:o}};1&features2||(i.intelamt.tls=parseInt(Q("dp10tls").value)),meshserver.send(i),t.func&&setTimeout(t.func,1e3)}}function p10showDeleteNodeDialog(e){xxdialogMode||(setDialogMode(2,"刪除節點",3,p10showDeleteNodeDialogEx,format("刪除{0}？",EscapeHtml(currentNode.name))+"<br /><br /><label><input id=p10check type=checkbox onchange=p10validateDeleteNodeDialog() />確認</label>",e),p10validateDeleteNodeDialog())}function p10validateDeleteNodeDialog(){QE("idx_dlgOkButton",Q("p10check").checked)}function p10showDeleteNodeDialogEx(e,t){meshserver.send({action:"removedevices",nodeids:[t]})}function p10WebRouter(e,t,n,o){var i=null,a=getNodeFromId(e);if(3==a.mtype){var s=meshes[a.meshid];s&&s.relayid&&(i=s.relayid,o=a.host)}var l=serverinfo.name;(-1==l.indexOf(".")||2&features)&&(l=window.location.hostname),""!=webRelayDns&&(l=webRelayDns);var r="https://"+l+":"+webRelayPort+"/control-redirect.ashx?n="+e+"&p="+n+"&appid="+t+"&c="+authRelayCookie;return null!=o&&(r+="&addr="+o),null!=i&&(r+="&relayid="+i),safeNewWindow(r,"WebRelay"),!1}function p10rfb(e,t){var n=getNodeFromId(e),o=null,i=meshes[n.meshid];null==t&&(t=null!=n.rfbport?n.rfbport:5900),3==n.mtype&&i&&i.relayid&&(e=i.relayid,o=n.host),meshserver.send({action:"getcookie",nodeid:e,tcpport:t,tcpaddr:o,tag:"novnc",name:i?i.name:null})}function p10mstsc(e,t){var n=getNodeFromId(e),o=meshes[n.meshid];null==t&&(t=null!=n.rdpport?n.rdpport:3389),meshserver.send({action:"getcookie",nodeid:e,tcpport:t,tag:"mstsc",name:o?o.name:null})}function p10ssh(e,t){var n=getNodeFromId(e),o=meshes[n.meshid];null==t&&(t=null!=n.sshport?n.sshport:22),meshserver.send({action:"getcookie",nodeid:e,tcpport:t,tag:"ssh",name:o?o.name:null})}function p10showiconselector(){if(!xxdialogMode&&4&GetNodeRights(currentNode)){setDialogMode(2,"圖符選擇",0,null,"<table align=center><td style=text-align:center><div style=display:inline-block class=i1 onclick=p10setIcon(1)></div><div style=display:inline-block class=i2 onclick=p10setIcon(2)></div><div style=display:inline-block class=i3 onclick=p10setIcon(3)></div><div style=display:inline-block class=i4 onclick=p10setIcon(4)></div><br /><div style=display:inline-block class=i5 onclick=p10setIcon(5)></div><div style=display:inline-block class=i6 onclick=p10setIcon(6)></div><div style=display:inline-block class=i7 onclick=p10setIcon(7)></div><div style=display:inline-block class=i8 onclick=p10setIcon(8)></div></table>"),QV("id_dialogclose",!0)}}function p10setIcon(e){setDialogMode(0),meshserver.send({action:"changedevice",nodeid:currentNode._id,icon:e})}function showClearSshDialog(){setDialogMode(2,"編輯裝置",3,showClearSshDialogEx,"清除 SSH 憑據？")}function showClearSshDialogEx(e,t){meshserver.send({action:"changedevice",nodeid:currentNode._id,ssh:0})}function showClearRdpDialog(){setDialogMode(2,"編輯裝置",3,showClearRdpDialogEx,"清除 RDP 憑據？")}function showClearRdpDialogEx(e,t){meshserver.send({action:"changedevice",nodeid:currentNode._id,rdp:0})}var desktop,desktopNode,showEditNodeValueDialog_modes=["裝置名稱","主機名","描述","標籤"],showEditNodeValueDialog_modes2=["name","host","desc","tags"],showEditNodeValueDialog_modes3=["","","","群1，群2，群3"];function showEditNodeValueDialog(e){if(!xxdialogMode){var t=addHtmlValue(showEditNodeValueDialog_modes[e],'<input id=dp10devicevalue style=width:170px maxlength=64 placeholder="'+showEditNodeValueDialog_modes3[e]+'" onchange=p10editdevicevalueValidate('+e+",event) onkeyup=p10editdevicevalueValidate("+e+",event) />");if(3==e){var n=[],o="";for(var i in nodes)if(nodes[i].tags)for(var a in nodes[i].tags)-1==n.indexOf(nodes[i].tags[a])&&n.push(nodes[i].tags[a]);if(n.length>0){for(var i in n.sort(),n)o+='<span style=padding:4px;background-color:#BBB;border-radius:3px;cursor:pointer onclick=showEditNodeValueDialogAddTag("'+encodeURIComponentEx(n[i])+'")>'+EscapeHtml(n[i])+"</span> ";t+="<div style=margin-top:8px;width:280px;line-height:26px;max-height:160px;overflow-y:auto>"+o+"</div>"}}setDialogMode(2,"編輯裝置",3,showEditNodeValueDialogEx,t,e);var s=currentNode[showEditNodeValueDialog_modes2[e]];null==s&&(s=""),Array.isArray(s)&&(s=s.join(", ")),Q("dp10devicevalue").value=s,p10editdevicevalueValidate(),Q("dp10devicevalue").focus()}}function showEditNodeValueDialogAddTag(e){var t=Q("dp10devicevalue").value.split(","),n=[];for(var o in t)n.push(t[o].trim());n.indexOf(e)>=0||(Q("dp10devicevalue").value+=(0==Q("dp10devicevalue").value.length?"":", ")+decodeURIComponent(e),setTimeout(function(){Q("dp10devicevalue").selectionStart=Q("dp10devicevalue").selectionEnd=9e4},0),p10editdevicevalueValidate())}function showEditNodeValueDialogEx(e,t){var n={action:"changedevice",nodeid:currentNode._id};n[showEditNodeValueDialog_modes2[t]]=Q("dp10devicevalue").value,meshserver.send(n)}function p10editdevicevalueValidate(e,t){var n=e>1||Q("dp10devicevalue").value.length>0;QE("idx_dlgOkButton",n),null!=t&&1==n&&13==t.keyCode&&dialogclose(1)}var desktopsettings={encoding:2,showfocus:!1,showmouse:!0,showcad:!0,quality:40,scaling:1024,framerate:50,autolock:!1,agentencoding:4};function setupDesktop(){desktopNode!=currentNode&&null!=desktop&&(desktop.Stop(),desktopNode=null,desktop=null),desktopNode==currentNode&&null!=desktop||(desktopNode=currentNode,Q("Desk").addEventListener("DOMMouseScroll",function(e){return dmousewheel(e)}),Q("Desk").addEventListener("mousewheel",function(e){return dmousewheel(e)})),desktopNode=currentNode,updateDesktopButtons(),Q("Desk").toBlob||QV("deskSaveBtn",!1)}function updateDesktopButtons(){meshes[currentNode.meshid];var e=0;null!=desktop&&(e=desktop.State);var t=GetNodeRights(currentNode);QV("disconnectbutton1",0!=e),QE("deskFullScreen",0!=e),QV("connectbutton1",0==e&&(8&t||256&t)&&null!=currentNode.agent&&1&currentNode.agent.caps),QV("connectbutton1h",0==e&&8&t&&null!=currentNode.intelamt&&2==currentNode.intelamt.state&&null!=currentNode.intelamt.ver&&(null==currentNode.intelamt.sku||"number"==typeof currentNode.intelamt.sku&&!!(8&currentNode.intelamt.sku))),QV("d7amtkvm",!(null==currentNode.intelamt||"number"==typeof currentNode.intelamt.sku&&16&currentNode.intelamt.sku||null==currentNode.intelamt.ver&&null!=currentNode.agent||0!=e&&2!=desktop.contype)),QV("d7meshkvm",null!=currentNode.agent&&1&currentNode.agent.caps&&(0==e||1==desktop.contype));var n=!!(1&currentNode.conn);QE("connectbutton1",n);var o=!!(6&currentNode.conn);QE("connectbutton1h",o),QV("DeskToastButton",!!(16384&t)&&currentNode.agent&&currentNode.agent.id<5&&8&t),QV("deskActionsBtn",8&t),Q("DeskControl").checked=!!(8&t),0==n&&QV("DeskTools",!1)}var agentConsoleMessages=["","正在等待用戶授予訪問權限...","被拒絕","無法啟動遠程終端接合{0}（{1}）","超時","收到無效的網絡數據"];function formatAgentConsoleMessage(e,t,n){for(null==n&&(n=[]);n.length<3;)n.push("");return(t&&t<agentConsoleMessages.length?EscapeHtml(format(agentConsoleMessages[t],n[0],n[1],n[2])):EscapeHtml(e)).split("\n").join("<br />")+"<br /><br />"}function connectDesktop(e,t,n,o){if(setSessionActivity(),QV("p11DeskSessionSelector",!1),p11clearConsoleMsg(),null==desktop)if(desktopNode=currentNode,2==t){if(null==desktopNode.intelamt.user||""==desktopNode.intelamt.user)return void editDeviceAmtSettings(desktopNode._id,connectDesktop);(desktop=CreateAmtRedirect(CreateAmtRemoteDesktop("Desk"),authCookie)).debugmode=debugmode,desktop.onStateChanged=onDesktopStateChange,desktop.m.bpp=1==desktopsettings.encoding||3==desktopsettings.encoding?1:2,desktop.m.useZRLE=desktopsettings.encoding<3,desktop.m.showmouse=!0,desktop.m.onScreenSizeChange=function(e,t,n){fullscreen&&(QS("deskarea3").width=t*fullscreenzoom+"px",QS("deskarea3").height=n*fullscreenzoom+"px"),deskAdjust()},4==desktopNode.conn&&null!=desktopNode.intelamt&&1==desktopNode.intelamt.tls?desktop.Start(desktopNode._id,16995,"*","*",1):desktop.Start(desktopNode._id,16994,"*","*",0),desktop.contype=2}else null==t||1==t||3==t&&currentNode.agent.id>4?((desktop=CreateAgentRedirect(meshserver,CreateAgentRemoteDesktop("Desk"),serverPublicNamePort,authCookie,authRelayCookie,domainUrl)).debugmode=debugmode,desktop.m.debugmode=debugmode,desktop.attemptWebRTC=attemptWebRTC,desktop.webrtcconfig=webrtcconfiguration,desktop.options={},null!=n&&(desktop.options.tsid=n),null!=o&&(desktop.options.consent=o),1==desktopsettings.autolock&&(desktop.options.autolock=!0),desktop.onStateChanged=onDesktopStateChange,8192&features2&&(desktop.m.stopInput=!0),desktop.onConsoleMessageChange=function(){desktop.consoleMessage?(Q("p11DeskConsoleMsg").innerHTML+=formatAgentConsoleMessage(desktop.consoleMessage,desktop.consoleMessageId,desktop.consoleMessageArgs),QV("p11DeskConsoleMsg",!0),null!=p11DeskConsoleMsgTimer&&clearTimeout(p11DeskConsoleMsgTimer),desktop.consoleMessageTimeout&&(p11DeskConsoleMsgTimer=setTimeout(p11clearConsoleMsg,1e3*desktop.consoleMessageTimeout))):p11clearConsoleMsg()},desktop.m.ImageType=desktopsettings.agentencoding,desktop.m.CompressionLevel=desktopsettings.quality,desktop.m.ScalingLevel=desktopsettings.scaling,desktop.m.FrameRateTimer=desktopsettings.framerate,desktop.m.onDisplayinfo=deskDisplayInfo,desktop.m.onScreenSizeChange=function(e,t,n){fullscreen&&(QS("deskarea3").width=t*fullscreenzoom+"px",QS("deskarea3").height=n*fullscreenzoom+"px"),deskAdjust()},desktop.Start(desktopNode._id),desktop.contype=1):3==t&&meshserver.send({action:"msg",type:"userSessions",nodeid:currentNode._id,tag:o});else desktop.Stop(),desktopNode=desktop=null}function p11clearConsoleMsg(){QH("p11DeskConsoleMsg",""),QV("p11DeskConsoleMsg",!1),p11DeskConsoleMsgTimer&&(clearTimeout(p11DeskConsoleMsgTimer),p11DeskConsoleMsgTimer=null)}function p12clearConsoleMsg(){QH("p12TermConsoleMsg",""),QV("p12TermConsoleMsg",!1),p12TermConsoleMsgTimer&&(clearTimeout(p12TermConsoleMsgTimer),p12TermConsoleMsgTimer=null)}function p13clearConsoleMsg(){QH("p13FilesConsoleMsg",""),QV("p13FilesConsoleMsg",!1),p13FilesConsoleMsgTimer&&(clearTimeout(p13FilesConsoleMsgTimer),p13FilesConsoleMsgTimer=null)}function p12setConsoleMsg(e,t){e?(Q("p12TermConsoleMsg").innerHTML+=e,QV("p12TermConsoleMsg",!0),null!=p12TermConsoleMsgTimer&&clearTimeout(p12TermConsoleMsgTimer),t&&(p12TermConsoleMsgTimer=setTimeout(p12clearConsoleMsg,t))):p12clearConsoleMsg()}function p13setConsoleMsg(e,t){e?(Q("p13FilesConsoleMsg").innerHTML+=e,QV("p13FilesConsoleMsg",!0),null!=p13FilesConsoleMsgTimer&&clearTimeout(p13FilesConsoleMsgTimer),t&&(p13FilesConsoleMsgTimer=setTimeout(p13clearConsoleMsg,t))):p13clearConsoleMsg()}function onDesktopStateChange(e,t){var n=t;3==n&&2==e.contype&&n++;var o=StatusStrs[n];if(null!=desktop&&1==desktop.webRtcActive&&(o+="，WebRTC"),QH("deskstatus",o),0===t)desktop.Stop(),desktopNode=desktop=null,QV("DeskScreens",!1),1==fullscreen&&deskToggleFull();updateDesktopButtons(),deskAdjust(),setTimeout(deskAdjust,50)}function showDesktopSettings(){xxdialogMode||(applyDesktopSettings(),updateDesktopButtons(),setDialogMode(7,"遠程桌面設置",3,showDesktopSettingsChanged))}function showDesktopSettingsChanged(){desktopsettings.encoding=d7desktopmode.value,desktopsettings.quality=d7bitmapquality.value,desktopsettings.scaling=d7bitmapscaling.value,desktopsettings.framerate=d7framelimiter.value,desktopsettings.autolock=d7deskAutoLock.checked,desktopsettings.agentencoding=d7encoding.value,localStorage.setItem("desktopsettings",JSON.stringify(desktopsettings)),applyDesktopSettings(),desktop&&(1==desktop.contype&&(0!=desktop.State&&desktop.m.SendCompressionLevel(desktopsettings.agentencoding,desktopsettings.quality,desktopsettings.scaling,desktopsettings.framerate),desktop.sendCtrlMsg('{"ctrlChannel":"102938","type":"autolock","value":'+desktopsettings.autolock+"}"),desktop.m.SendRefresh()),2==desktop.contype&&0!=desktop.State&&(desktop.Stop(),setTimeout(function(){connectDesktop(null,2)},50)))}function applyDesktopSettings(){var e="",t=512&features?[100,90,70,50,40,30,20,10,5,1]:[50,40,30,20,10,5,1];for(var n in t)e+="<option value="+t[n]+">"+t[n]+"%</option>";QH("d7bitmapquality",e),d7desktopmode.value=desktopsettings.encoding,d7bitmapquality.value=40,desktopsettings.agentencoding?d7encoding.value=desktopsettings.agentencoding:desktopsettings.agentencoding=4,t.indexOf(parseInt(desktopsettings.quality))>=0&&(d7bitmapquality.value=desktopsettings.quality),d7bitmapscaling.value=desktopsettings.scaling,desktopsettings.framerate&&(d7framelimiter.value=desktopsettings.framerate),null!=desktopsettings.autolock&&(d7deskAutoLock.checked=desktopsettings.autolock)}var keyboardShown=!1,keyboardShownTimer=null,fullScreenMode=!1;function toggleKeyboard(){xxdialogMode||(null!=keyboardShownTimer&&clearTimeout(keyboardShownTimer),keyboardShown?(Q("softKeyboard").blur(),keyboardShown=!1):(Q("softKeyboard").focus(),keyboardShown=!0),QV("deskkeybutton2a",fullscreen&&!keyboardShown),QV("deskkeybutton2b",fullscreen&&keyboardShown))}function keyboardFocusChange(){keyboardShownTimer=setTimeout(function(){keyboardShownTimer=null,keyboardShown=Q("softKeyboard")==document.activeElement,QV("deskkeybutton2a",fullscreen&&!keyboardShown),QV("deskkeybutton2b",fullscreen&&keyboardShown)},10)}function exitButton(){xxdialogMode||(QV("deskButtonMenu",!1),QV("termButtonMenu",!1),deskToggleFull())}function deskMenuButton(e){toggleMenu(!0),deskSendKeys(e)}function updateDeskShortcutKeys(){var e='<div class="menuButton" onclick="deskMenuButton(-1)">定制</div>';for(var t in deskKeyboardShortcuts)e+='<div class="menuButton" onclick="deskMenuButton('+deskKeyboardShortcuts[t]+')">'+keyShortcutTotext(deskKeyboardShortcuts[t])+"</div>";QH("deskButtonMenu",e)}var keyStrings={8:"退格",9:"Tab",13:"輸入",27:"逃脫",32:"Space",44:"打印屏幕",45:"插入",46:"Del",36:"家",35:"結尾",32:"Espace",33:"向上翻頁",34:"向下翻頁",37:"左",38:"上",39:"右",40:"下",0:"沒有"};function keyShortcutTotext(e){var t=[];return 65536&e&&t.push("Shift"),131072&e&&t.push("Alt"),524288&e&&t.push("Ctrl"),1048576&e&&t.push("Win"),(e&=65535)>=112&&e<=123?t.push("F"+(e-111)):0!=e&&keyStrings[e]?t.push(keyStrings[e]):0!=e&&t.push(String.fromCharCode(e)),t.join(" + ")}function deskCustomizeKeys(){if(!xxdialogMode){var e='<div id=d2shortcuts style="width:100%;height:180px;padding:4px;overflow-y:auto;border:1px solid gray"></div><div style=width:100%;padding:5px>';for(var t in e+="<label><input id=d1kshift type=checkbox /> Shift</label><label> <input id=d1kalt type=checkbox /> Alt</label><label> <input id=d1kctrl type=checkbox /> Ctrl</label> <input id=d1kwin type=checkbox /> Win</label>",e+=" <select id=d2keySelect>",keyStrings)e+="<option value="+t+">"+keyStrings[t]+"</option>";for(t=1;t<=12;t++)e+="<option value="+(t+111)+">F"+t+"</option>";for(t=0;t<10;t++)e+="<option value="+(t+48)+">"+t+"</option>";for(t=0;t<26;t++)e+="<option value="+(t+65)+">"+String.fromCharCode(t+65)+"</option>";e+="</select> <input type=button value=添加 onclick=addDeskCustomizeKey() /></div>",QH("p10dialog2",e),xxdialogMode=2,QV("p10dialog",!0),deskUpdateShortcutList()}}function deskCustomizeKeysEx(){QV("p10dialog",!1),xxdialogMode=0,putstore("deskKeyShortcuts",deskKeyboardShortcuts.join(",")),updateDeskShortcutKeys()}function restoreDeskCustomizeKey(){deskKeyboardShortcuts=[],putstore("deskKeyShortcuts",null);var e=getstore("deskKeyShortcuts","0x0A002E,0x100000,0x100028,0x100026,0x10004C,0x10004D,0x11004D,0x100052,0x020073,0x080057,0x020009,0x100025,0x100027").split(",");for(var t in e)""!=e[t]&&deskKeyboardShortcuts.push(parseInt(e[t]));updateDeskShortcutKeys(),deskUpdateShortcutList()}function deskUpdateShortcutList(){var e="";for(var t in deskKeyboardShortcuts){var n=keyShortcutTotext(deskKeyboardShortcuts[t]),o="";t!=deskKeyboardShortcuts.length-1&&(o+='<img width=8 height=8 style=float:right;cursor:pointer;padding:3px src="images/c2.png" onclick=deskCustomizeKeyDown('+deskKeyboardShortcuts[t]+")>"),0!=t&&(o+='<img width=8 height=8 style=float:right;cursor:pointer;padding:3px src="images/c3.png" onclick=deskCustomizeKeyUp('+deskKeyboardShortcuts[t]+")>"),e+='<div style="width:100%;background-color:#AAA;border-radius:4px;margin-bottom:4px;padding:4px;text-align:left;box-sizing:border-box" value='+deskKeyboardShortcuts[t]+">"+n+'<img width=10 height=10 style=float:right;cursor:pointer;padding:2px;margin-left:8px src="images/trash.png" onclick=removeDeskCustomizeKey('+deskKeyboardShortcuts[t]+")>"+o+"</div>"}""==e&&(e="<i>未定義鍵盤快捷鍵</i>"),QH("d2shortcuts",e)}function deskCustomizeKeyDown(e){var t=deskKeyboardShortcuts.indexOf(e),n=deskKeyboardShortcuts[t+1];deskKeyboardShortcuts[t+1]=deskKeyboardShortcuts[t],deskKeyboardShortcuts[t]=n,deskUpdateShortcutList()}function deskCustomizeKeyUp(e){var t=deskKeyboardShortcuts.indexOf(e),n=deskKeyboardShortcuts[t];deskKeyboardShortcuts[t]=deskKeyboardShortcuts[t-1],deskKeyboardShortcuts[t-1]=n,deskUpdateShortcutList()}function removeDeskCustomizeKey(e){var t=[];for(var n in deskKeyboardShortcuts)deskKeyboardShortcuts[n]!=e&&t.push(deskKeyboardShortcuts[n]);deskKeyboardShortcuts=t,deskUpdateShortcutList()}function addDeskCustomizeKey(){var e=parseInt(Q("d2keySelect").value);Q("d1kshift").checked&&(e|=65536),Q("d1kalt").checked&&(e|=131072),Q("d1kctrl").checked&&(e|=524288),Q("d1kwin").checked&&(e|=1048576),e>0&&-1==deskKeyboardShortcuts.indexOf(e)&&(deskKeyboardShortcuts.push(e),deskUpdateShortcutList())}function deskSendKeys(e){if(!xxdialogMode&&null!=desktop&&3==desktop.State)if(-1!=e)if(655406!=e){var t=(16711680&e)>>16,n=65535&e,o=[],i=[],a={8:65288,9:65289,13:65293,27:65307,45:65379,46:65535,36:65360,35:65367,33:65365,34:65366,37:65361,38:65362,39:65363,40:65364,112:65470,113:65471,114:65472,115:65473,116:65474,117:65475,118:65476,119:65477,120:65478,121:65479,122:65480,123:65481};if(2==desktop.contype){1&t&&(o.push([65505,1]),i.push([65505,0])),2&t&&(o.push([65513,1]),i.push([65513,0])),8&t&&(o.push([65507,1]),i.push([65507,0])),16&t&&(o.push([65511,1]),i.push([65511,0])),a[n]&&(n=a[n]),n>=65&&n<=90&&(n+=32),0!=n&&(o.push([n,1]),i.push([n,0])),i.reverse();for(var s=0;s<i.length;s++)o.push(i[s]);desktop.m.sendkey(o)}else{1&t&&(o.push([desktop.m.KeyAction.DOWN,16]),i.push([desktop.m.KeyAction.UP,16])),2&t&&(o.push([desktop.m.KeyAction.EXDOWN,18]),i.push([desktop.m.KeyAction.EXUP,18])),8&t&&(o.push([desktop.m.KeyAction.EXDOWN,17]),i.push([desktop.m.KeyAction.EXUP,17])),16&t&&(o.push([desktop.m.KeyAction.EXDOWN,91]),i.push([desktop.m.KeyAction.EXUP,91])),0!=n&&(o.push([desktop.m.KeyAction.DOWN,n]),i.push([desktop.m.KeyAction.UP,n])),i.reverse();for(s=0;s<i.length;s++)o.push(i[s]);desktop.m.SendKeyMsgKC(o)}}else desktop.m.sendcad();else deskCustomizeKeys()}function toggleMenu(e){xxdialogMode||(QV("deskButtonMenu",fullscreen&&!e&&1==currentDevicePanel),QV("termButtonMenu",fullscreen&&!e&&5==currentDevicePanel),QV("deskkeybutton3a",fullscreen&&e),QV("deskkeybutton3b",fullscreen&&!e))}function deskChangeMouseButton(e){xxdialogMode||null!=desktop&&(desktop.m.SwapMouse=!desktop.m.SwapMouse,QV("deskkeybutton4a",fullscreen&&!desktop.m.SwapMouse),QV("deskkeybutton4b",fullscreen&&desktop.m.SwapMouse))}function deskChangeFullscreenZoom(){if(!xxdialogMode){if(1==currentDevicePanel){if(null==desktop)return;fullscreenzoom=1==fullscreenzoom?.5:1,QV("deskkeybutton5a",fullscreen&&1==fullscreenzoom),QV("deskkeybutton5b",fullscreen&&1!=fullscreenzoom),QS("deskarea3").width=desktop.m.ScreenWidth*fullscreenzoom+"px",QS("deskarea3").height=desktop.m.ScreenHeight*fullscreenzoom+"px",deskAdjust()}if(5==currentDevicePanel){if(null==terminal)return;xterm.setOption("fontSize",15==xterm.getOption("fontSize")?10:15)}}}var terminalNode,filesNode,fullscreen=!1,fullscreenzoom=1;function deskToggleFull(){fullscreen=!fullscreen,QV("mastheadx",!fullscreen),QV("masthead",!fullscreen),QV("topbar",!fullscreen),QV("p11deviceNameHeader",!fullscreen),QV("footer",!fullscreen),QV("column_l_bottomgap",!fullscreen),QV("idx_deskFullBtn2",fullscreen),QV("deskFullBtn",!fullscreen),QV("p10deskTopTable",!fullscreen),QV("deskarea1",!fullscreen),QV("deskarea4",!fullscreen),QV("termarea1",!fullscreen),QV("termarea4",!fullscreen);var e=GetNodeRights(currentNode),t=!(8192&features2||14==currentNode.agent.id||4294967295!=e&&(!(8&e)||256&e||4096&e));QV("deskkeybutton1",fullscreen),1==currentDevicePanel&&(QS("deskkeybutton2a").top=QS("deskkeybutton2b").top="210px",QS("deskkeybutton5a").top=QS("deskkeybutton5b").top=t?"160px":"60px",QV("deskkeybutton2a",fullscreen&&t),QV("deskkeybutton2b",!1),QV("deskkeybutton3a",fullscreen&&t),QV("deskkeybutton3b",!1),QV("deskkeybutton4a",fullscreen&&t&&!desktop.m.SwapMouse),QV("deskkeybutton4b",fullscreen&&t&&desktop.m.SwapMouse),QV("deskkeybutton5a",fullscreen&&1==fullscreenzoom),QV("deskkeybutton5b",fullscreen&&1!=fullscreenzoom)),5==currentDevicePanel&&(QS("deskkeybutton2a").top=QS("deskkeybutton2b").top="110px",QV("deskkeybutton2a",fullscreen),QV("deskkeybutton2b",!1),QV("deskkeybutton3a",fullscreen),QV("deskkeybutton3b",!1),QV("deskkeybutton4a",!1),QV("deskkeybutton4b",!1),QV("deskkeybutton5a",!1),QV("deskkeybutton5a",!1)),fullscreen?(QS("DeskParent").height=null,QS("page_content").top="0px",QS("page_content").bottom="0px",1==currentDevicePanel&&(QS("p10desktop").top="0px",QS("p10desktop").overflow="scroll",QS("deskarea3").top="0px",QS("deskarea3").width=desktop.m.ScreenWidth*fullscreenzoom+"px",QS("deskarea3").height=desktop.m.ScreenHeight*fullscreenzoom+"px",QS("deskarea3")["padding-right"]="55px"),5==currentDevicePanel&&(QS("p10terminal").top="0px",QS("p10terminal").overflow="scroll",QS("termarea3").top="0px",QS("termarea3").bottom=null,QS("termarea3").right=null,QS("termarea3")["padding-right"]="55px",QS("termarea3").height="100%"),QS("body")["background-color"]="#000",QS("p10")["background-color"]="#000"):(QS("DeskParent").height="100%",QS("page_content").top="50px",QS("page_content").bottom="32px",1==currentDevicePanel&&(QS("p10desktop").top="55px",QS("p10desktop").overflow="hidden",QS("deskarea3").top="32px",QS("deskarea3").left=null,QS("deskarea3").width="100%",QS("deskarea3").height="calc(100% - 64px)",QS("deskarea3")["padding-right"]="",QS("DeskParent")["margin-top"]=null,QS("DeskParent")["margin-left"]=null),5==currentDevicePanel&&(QS("p10terminal").top="55px",QS("p10terminal").overflow="hidden",Q("p10terminal").scrollTop=0,Q("p10terminal").scrollLeft=0,QS("termarea3").top="32px",QS("termarea3").bottom="32px",QS("termarea3")["padding-right"]=null,QS("termarea3").height="calc(100% - 60px)"),QS("body")["background-color"]=nightMode?"#000":"#FFF",QS("p10")["background-color"]=null),1==currentDevicePanel&&deskAdjust()}function deskAdjust(){if(1==currentDevicePanel)if(fullscreen){QS("Desk")["margin-top"]=null,QS("Desk")["margin-bottom"]=null,QS("Desk").width="100%",QS("Desk").height="100%";var e=Q("p10desktop").clientHeight,t=Q("p10desktop").clientWidth,n=Q("deskarea3").clientHeight,o=Q("deskarea3").clientWidth-55;QS("deskarea3").top=e>n?(e-n)/2+"px":null,QS("deskarea3").left=t>o?(t-o)/2+"px":null}else{if((e=Q("DeskParent").clientHeight)/(t=Q("DeskParent").clientWidth)>(n=Q("Desk").height)/(o=Q("Desk").width)){var i=n*t/o+"px";QS("Desk").height=i,QS("Desk").width="100%"}else{var a=o*e/n+"px";QS("Desk").width=a,QS("Desk").height="100%"}QS("DeskParent").overflow="hidden";var s=(Q("DeskParent").clientHeight-Q("Desk").clientHeight)/2;QS("Desk")["margin-top"]=s+"px",QS("Desk")["margin-bottom"]=s+"px"}}function sendSpecialKeys(){xxdialogMode||null==desktop||3!=desktop.State||setDialogMode(3,"特殊鍵",3,deskSendKeys)}function deskSaveImage(){if(setSessionActivity(),!xxdialogMode&&null!=desktop&&3==desktop.State){var e=new Date,t="Desktop-"+currentNode.name+"-"+e.getFullYear()+"-"+("0"+(e.getMonth()+1)).slice(-2)+"-"+("0"+e.getDate()).slice(-2)+"-"+("0"+e.getHours()).slice(-2)+"-"+("0"+e.getMinutes()).slice(-2);Q("Desk").toBlob(function(e){saveAs(e,t+".png")})}}function deskSelectScreens(){if(!xxdialogMode&&null!=desktop&&3==desktop.State){var e="",t=desktop.m.displays;for(var n in t)e+="<option value="+n+" "+(desktop.m.selectedDisplay==n?" selected":"")+">"+t[n]+"</option>";setDialogMode(2,"屏幕選擇",3,deskSelectScreensEx,e=addHtmlValue4("屏幕","<select style=width:100% id=deskdisplays>"+e+"</select>"))}}function deskSelectScreensEx(){null!=desktop&&3==desktop.State&&desktop.m.SetDisplay(parseInt(Q("deskdisplays").value))}function deskDisplayInfo(e,t,n,o){var i=0;for(var a in t)i++;QV("DeskScreens",i>1)}function dmousedown(e){setSessionActivity(),xxdialogMode||null==desktop||(fullscreen&&(e.addx=Q("p10desktop").scrollLeft*(1/fullscreenzoom),e.addy=Q("p10desktop").scrollTop*(1/fullscreenzoom)),desktop.m.mousedown(e))}function dmouseup(e){setSessionActivity(),xxdialogMode||null==desktop||(fullscreen&&(e.addx=Q("p10desktop").scrollLeft*(1/fullscreenzoom),e.addy=Q("p10desktop").scrollTop*(1/fullscreenzoom)),desktop.m.mouseup(e))}function dmousemove(e){setSessionActivity(),xxdialogMode||null==desktop||(fullscreen&&(e.addx=Q("p10desktop").scrollLeft*(1/fullscreenzoom),e.addy=Q("p10desktop").scrollTop*(1/fullscreenzoom)),desktop.m.mousemove(e))}function dmousewheel(e){return setSessionActivity(),!(xxdialogMode||null==desktop||!desktop.m.mousewheel)&&(fullscreen&&(e.addx=Q("p10desktop").scrollLeft*(1/fullscreenzoom),e.addy=Q("p10desktop").scrollTop*(1/fullscreenzoom)),desktop.m.mousewheel(e),haltEvent(e),!0)}function drotate(e){xxdialogMode||null==desktop||(desktop.m.setRotation(desktop.m.rotation+e),deskAdjust())}function setupTerminal(){terminalNode!=currentNode&&null!=terminal&&(terminal.Stop(),terminal=null),terminalNode=currentNode,updateTerminalButtons()}function updateTerminalButtons(){currentNode.agent;var e=null!=terminal&&0!=terminal.state;QE("termFullScreen",0!=e),3==terminalNode.mtype&&null!=terminalNode.agent&&terminalNode.agent.id>4&&512&features2&&(terminalNode.agent.caps=6),QV("disconnectbutton2span",1==e),QV("connectbutton2span",0==e&&null!=terminalNode.agent&&2&terminalNode.agent.caps&&3!=terminalNode.mtype),QV("connectbutton2sspan",0==e&&null!=terminalNode.agent&&2&terminalNode.agent.caps&&3!=terminalNode.agent.id);var t=!!(1&terminalNode.conn)||3==terminalNode.mtype;QE("connectbutton2",t),QE("connectbutton2s",t),QV("termActionsBtn",3!=terminalNode.mtype),QE("ctrlcbutton",e),QE("ctrlxbutton",e),QE("escbutton",e),1==e&&3!=terminal.contype||null==terminalNode.agent||3==terminalNode.agent.id||4==terminalNode.agent.id?QH("terminalCustomUpperRight",""):QH("terminalCustomUpperRight","<a style=cursor:pointer onclick=cmsshportaction(1,event)>"+format("SSH 端口 {0}",terminalNode.sshport?terminalNode.sshport:22)+"</a>")}function cmsshportaction(e){if(!xxdialogMode){setDialogMode(2,"SSH 連接",3,function(){var e=Q("d10sshport").value.length>0?parseInt(Q("d10sshport").value):22;meshserver.send({action:"changedevice",nodeid:currentNode._id,sshport:e})},'SSH遠程連接端口：<br /><br /><input type=text placeholder="22" inputmode="numeric" pattern="[0-9]*" onkeypress="return (event.keyCode == 8) || (event.charCode >= 48 && event.charCode <= 57)" maxlength=5 id=d10sshport type=text>',currentNode),Q("d10sshport").focus(),null!=currentNode.sshport&&(Q("d10sshport").value=currentNode.sshport)}}function onTerminalStateChange(e,t){var n=t;3==n&&2==e.contype&&n++;var o=StatusStrs[n];switch(1==terminal.webRtcActive&&(o+="，WebRTC"),QH("termstatus",o),t){case 0:xterm.dispose(),xterm=xtermfit=xtermimage=null,null!=terminal&&(terminal.Stop(),terminal=null);break;case 3:xterm.focus()}updateTerminalButtons()}function CreateRemoteTunnel(e,t){var n={protocol:1};return null!=t&&"number"==typeof t.protocol&&(n.protocol=t.protocol),n.onTunnelUpdate=e,n.xxStateChange=function(e){},n.ProcessBinaryData=function(e){n.onTunnelUpdate(e)},n.ProcessData=function(e){n.onTunnelUpdate(e)},n.terminalEmulation=1,n.fxEmulation=0,n.lineFeed="\r\n",n}function tunnelUpdate(e){null!=xterm&&(xterm.writeUtf8?"string"==typeof e?xterm.writeUtf8(e):xterm.writeUtf8(new Uint8Array(e)):"string"==typeof e?xterm.write(e):xterm.write(new Uint8Array(e)))}function sshTunnelAuthDialog(e,t){var n="";e.askkeypass?n+=addHtmlValue("驗證","<select id=dp2authmethod style=width:150px onchange=sshAuthUpdate(event)><option value=3 selected>存儲密鑰</option><option value=1>用戶名密碼</option><option value=2>用戶名和密鑰</option></select>"):n+=addHtmlValue("驗證","<select id=dp2authmethod style=width:150px onchange=sshAuthUpdate(event)><option value=1 selected>用戶名密碼</option><option value=2>用戶名和密鑰</option></select>"),n+="<div id=d2userauth style=display:none>",n+=addHtmlValue("用戶名","<input id=dp2user style=width:150px maxlength=64 autocomplete=off onkeyup=sshAuthUpdate(event) />"),n+="</div>",n+="<div id=d2passauth style=display:none>",n+=addHtmlValue("密碼","<input type=password id=dp2pass style=width:150px maxlength=64 autocomplete=off onkeyup=sshAuthUpdate(event) />"),4194304&features2||(n+="<label><input id=dp2keep type=checkbox>記住憑據</label>"),n+="</div><div id=d2keyauth style=display:none>",n+=addHtmlValue("密鑰文件","<input type=file id=dp2key style=width:150px maxlength=64 autocomplete=off onchange=sshAuthUpdate(event) /><div id=d2badkey style=font-size:x-small>密鑰文件必須是 OpenSSH 格式。</div>"),n+=addHtmlValue("密鑰密碼","<input type=password id=dp2keypass style=width:150px maxlength=64 autocomplete=off onkeyup=sshAuthUpdate(event) />"),4194304&features2||(n+="<label><input id=dp2keep1 type=checkbox onchange=sshAuthUpdate(event)>記住用戶和密鑰</label><br/>",n+="<label><input id=dp2keep2 type=checkbox>記住密碼</label>"),n+="</div>",e.askkeypass&&(n+="<div id=d2keyauth2 style=display:none>",n+=addHtmlValue("密碼","<input type=password id=dp2keypass2 style=width:150px maxlength=64 autocomplete=off onkeyup=sshAuthUpdate(event) />"),n+="</div>"),setDialogMode(2,"驗證",11,t,n,"ssh"),Q("dp2user").focus(),sshAuthUpdate(),setTimeout(sshAuthUpdate,50)}function sshTunnelUpdate(e){if("string"==typeof e)if("{"==e[0]){var t=JSON.parse(e);switch(t.action){case"sshauth":sshTunnelAuthDialog(t,sshConnectEx);break;case"sshautoauth":terminal.socket.send(JSON.stringify({action:"sshautoauth",cols:xterm.cols,rows:xterm.rows,width:Q("termarea3xdiv").offsetWidth,height:Q("termarea3xdiv").offsetHeight}));break;case"autherror":p12setConsoleMsg("授權錯誤",5e3);break;case"sessionerror":p12setConsoleMsg("會話已過期",5e3);break;case"sessiontimeout":p12setConsoleMsg("會話超時",5e3)}}else"~"==e[0]&&(xterm.writeUtf8?xterm.writeUtf8(e.substring(1)):xterm.write(e.substring(1)))}function sshAuthUpdate(e){if(QV("d2userauth",3!=Q("dp2authmethod").value),QV("d2passauth",1==Q("dp2authmethod").value),QV("d2keyauth",2==Q("dp2authmethod").value),QV("d2keyauth2",3==Q("dp2authmethod").value),1==Q("dp2authmethod").value)QE("idx_dlgOkButton",Q("dp2user").value.length>0&&Q("dp2pass").value.length>0);else if(3==Q("dp2authmethod").value)QE("idx_dlgOkButton",Q("dp2keypass2").value.length>0);else{if(QE("idx_dlgOkButton",!1),4194304&features2||QE("dp2keep2",Q("dp2keep1").checked),1==(Q("dp2user").value.length>0&&null!=Q("dp2key").files&&1==Q("dp2key").files.length&&Q("dp2key").files[0].size<8e3)){var t=new FileReader;t.onload=function(e){var t=e.target.result.indexOf("-----BEGIN OPENSSH PRIVATE KEY-----")>=0&&e.target.result.indexOf("-----END OPENSSH PRIVATE KEY-----")>=0||e.target.result.indexOf("-----BEGIN RSA PRIVATE KEY-----")>=0&&e.target.result.indexOf("-----END RSA PRIVATE KEY-----")>=0;QE("idx_dlgOkButton",t),QS("d2badkey").color=t?"#000":"#F00"},t.readAsText(Q("dp2key").files[0])}}e&&13==e.keyCode&&e.target&&1==Q("dp2authmethod").value&&("dp2user"==e.target.id&&Q("dp2pass").focus(),"dp2pass"==e.target.id&&dialogclose(1))}function sshConnectEx(e){if(0==e)null!=terminal&&connectTerminal();else{var t=0;if(1==Q("dp2authmethod").value)4194304&features2||(t=Q("dp2keep").checked?1:0),terminal.socket.send(JSON.stringify({action:"sshauth",username:Q("dp2user").value,password:Q("dp2pass").value,keep:t,cols:xterm.cols,rows:xterm.rows,width:Q("termarea3xdiv").offsetWidth,height:Q("termarea3xdiv").offsetHeight}));else if(3==Q("dp2authmethod").value)terminal.socket.send(JSON.stringify({action:"sshkeyauth",keypass:Q("dp2keypass2").value,cols:xterm.cols,rows:xterm.rows,width:Q("termarea3xdiv").offsetWidth,height:Q("termarea3xdiv").offsetHeight}));else{4194304&features2||1==(t=Q("dp2keep1").checked?1:0)&&(t+=Q("dp2keep2").checked?1:0);var n=new FileReader,o=Q("dp2user").value,i=Q("dp2keypass").value;n.onload=function(e){terminal.socket.send(JSON.stringify({action:"sshauth",username:o,keypass:i,key:e.target.result,keep:t,cols:xterm.cols,rows:xterm.rows,width:Q("termarea3xdiv").offsetWidth,height:Q("termarea3xdiv").offsetHeight}))},n.readAsText(Q("dp2key").files[0])}}}function xTermSendResize(){xtermResizeTimer=null,null!=xterm&&null!=terminal&&null!=terminal.sendCtrlMsg&&("sshterminalrelay.ashx"==terminal.urlname?terminal.socket.send(JSON.stringify({action:"resize",cols:xterm.cols,rows:xterm.rows,width:Q("termarea3xdiv").offsetWidth,height:Q("termarea3xdiv").offsetHeight})):terminal.sendCtrlMsg(JSON.stringify({ctrlChannel:"102938",type:"termsize",cols:xterm.cols,rows:xterm.rows})))}function connectTerminal(e,t,n){if(p12clearConsoleMsg(),terminal)terminal.Stop(),terminal=null,fullscreen&&deskToggleFull();else{var o={protocol:null!=n&&"number"==typeof n.protocol?n.protocol:1};n&&n.requireLogin&&(o.requireLogin=!0),null!=serverinfo.linuxshell&&currentNode.agent.id>4&&("root"==serverinfo.linuxshell&&(o.protocol=1,delete o.requireLogin),"user"==serverinfo.linuxshell&&(o.protocol=8,delete o.requireLogin),"login"==serverinfo.linuxshell&&(o.protocol=1,o.requireLogin=!0)),QV("termarea3xdiv",!0),null!=xterm&&xterm.dispose(),xterm=new Terminal({allowProposedApi:!0}),xtermfit=new FitAddon.FitAddon,xtermimage=new ImageAddon.ImageAddon,xtermfit&&xterm.loadAddon(xtermfit),xterm.loadAddon(xtermimage),xterm.open(Q("termarea3xdiv")),xterm.onData(function(e){"sshterminalrelay.ashx"==terminal.urlname?terminal.socket.send("~"+e):terminal.sendText(e)}),xtermfit&&xtermfit.fit(),xterm.onResize(function(e){xtermResizeTimer&&clearTimeout(xtermResizeTimer),xtermResizeTimer=setTimeout(xTermSendResize,200)}),document.getElementsByClassName("xterm-helper-textarea")[0].onfocus=()=>{xterm.blur(),fullscreen||toggleKeyboard()},document.getElementsByClassName("xterm-viewport")[0].style.overflow="hidden",terminal=CreateAgentRedirect(meshserver,CreateRemoteTunnel(3==t?sshTunnelUpdate:tunnelUpdate,o),serverPublicNamePort,authCookie,authRelayCookie,domainUrl),3==t&&(terminal.urlname="sshterminalrelay.ashx"),terminal.debugmode=debugmode,terminal.m.debugmode=debugmode,terminal.options=o,terminal.options={cols:xterm.cols,rows:xterm.rows},o.requireLogin&&(terminal.options.requireLogin=!0),terminal.Start(terminalNode._id),terminal.onStateChanged=onTerminalStateChange,terminal.contype=t,terminal.attemptWebRTC=!1,terminal.onConsoleMessageChange=function(){p12setConsoleMsg(terminal.consoleMessage?formatAgentConsoleMessage(terminal.consoleMessage,terminal.consoleMessageId,terminal.consoleMessageArgs):null,terminal.consoleMessageTimeout)}}Q("connectbutton2").blur()}function termSendKey(e,t){terminal&&!xxdialogMode&&(null!=xterm?("sshterminalrelay.ashx"==terminal.urlname?terminal.socket.send("~"+String.fromCharCode(e)):terminal.sendText?terminal.sendText(String.fromCharCode(e)):terminal.send(String.fromCharCode(e)),xterm.focus()):null!=terminal&&(terminal.m.TermSendKey(e),Q(t).blur()))}function updateTermShortcutKeys(){for(var e="",t=64;t<=95;t++)e+='<div class="menuButton" style="width:70px" onclick="termMenuButton('+t+')">Ctrl +'+String.fromCharCode(t)+"</div>";QH("termButtonMenu",e)}function termMenuButton(e){toggleMenu(!0),"sshterminalrelay.ashx"==terminal.urlname?terminal.socket.send("~"+String.fromCharCode(e-64)):terminal.sendText(String.fromCharCode(e-64))}function setupFiles(){var e=filesNode==currentNode,t=!!(1&(filesNode=currentNode).conn)||3==filesNode.mtype;QE("p13Connect",t),QE("p13Connects",t),QV("p13Connect",null==files&&2==filesNode.mtype),QV("p13Connects",null==files&&null!=filesNode.agent&&3!=filesNode.agent.id&&4!=filesNode.agent.id),QV("p13Disconnect",null!=files),0!=e&&0!=t||!files||(files.Stop(),files=null),p13setActions()}function onFilesStateChange(e,t){setSessionActivity(),QV("p13Connect",0==t&&2==filesNode.mtype),QV("p13Connects",0==t&&null!=filesNode.agent&&3!=filesNode.agent.id&&4!=filesNode.agent.id),QV("p13Disconnect",0!=t);var n=StatusStrs[t];switch(3==t&&(2==files.contype&&(n+=", SFTP"),1==files.webRtcActive&&(n+="，WebRTC")),Q("p13Status").textContent=n,t){case 0:QH("p13files",""),p13filetree=null,p13filetreelocation=[],QH("p13currentpath",""),QE("p13FolderUp",!1),p13setActions(),null!=files&&(files.Stop(),files=null),null!=uploadFile&&(p13uploadFileTransferDone(),uploadFile=null);break;case 3:if(p13filetreelocation=[],p13targetpath="",files){var o=[];try{o=JSON.parse(getstore("_devFilePaths","[]"))}catch(e){}for(var i=0;i<o.length;i++)o[i].n==currentNode._id&&(p13targetpath=o[i].p);p13filetreelocation=p13targetpath.split("/"),files.sendText({action:"ls",reqid:1,path:p13targetpath})}}}function CreateRemoteFiles(e){var t={protocol:5};return t.onFileUpdate=e,t.xxStateChange=function(e){},t.ProcessData=function(e){t.onFileUpdate(e)},t}var autoConnectFilesTimer=null;function autoConnectFiles(e){null==autoConnectFilesTimer?autoConnectFilesTimer=setInterval(connectFiles,100):(clearInterval(autoConnectFilesTimer),autoConnectFilesTimer=null)}function connectFiles(e,t){p13clearConsoleMsg(),files?(files.Stop(),files=null):(files=CreateAgentRedirect(meshserver,CreateRemoteFiles(p13gotFiles),serverPublicNamePort,authCookie,authRelayCookie,domainUrl),2==t&&(files.urlname="sshfilesrelay.ashx"),files.contype=t,files.attemptWebRTC=attemptWebRTC,files.webrtcconfig=webrtcconfiguration,files.onStateChanged=onFilesStateChange,files.onConsoleMessageChange=function(){files.consoleMessage?(Q("p13FilesConsoleMsg").innerHTML+=formatAgentConsoleMessage(files.consoleMessage,files.consoleMessageId,files.consoleMessageArgs),QV("p13FilesConsoleMsg",!0),null!=p13FilesConsoleMsgTimer&&clearTimeout(p13FilesConsoleMsgTimer),files.consoleMessageTimeout&&(p13FilesConsoleMsgTimer=setTimeout(p13clearConsoleMsg,1e3*files.consoleMessageTimeout))):p13clearConsoleMsg()},files.Start(filesNode._id)),p13clipboard=p13clipboardFolder=null,p13clipboardCut=0,p13updateClipview()}var p13sortorder,p13filetree=null,p13targetpath=null,p13filetreelocation=[];function p13gotFiles(e){if(e.length>0&&123!=e.charCodeAt(0))p13gotDownloadBinaryData(e);else{try{e=JSON.parse(decode_utf8(e))}catch(t){e=JSON.parse(e)}if("download"!=e.action){switch(e.action){case"sshauth":sshTunnelAuthDialog(e,p13sshConnectEx);break;case"autherror":return void p13setConsoleMsg("授權錯誤",5e3);case"connectionerror":return void p13setConsoleMsg("連接錯誤",5e3);case"sessionerror":return void p13setConsoleMsg("會話已過期",5e3);case"sessiontimeout":return void p13setConsoleMsg("會話超時",5e3)}if(null!=e.action&&e.action.startsWith("upload"))p13gotUploadData(e);else if(null!=e.path)if(null==e.dir)""!=p13targetpath&&p13folderup();else if(e.path=e.path.replace(/\//g,"\\"),null!=p13filetree&&e.path==p13filetree.path){var t=p13getCheckedNames();p13filetree=e,p13updateFiles(t)}else{for(var n=e.path.replace(/\//g,"\\"),o=p13targetpath.replace(/\//g,"\\");n.length>0&&"\\"==n[0];)n=n.substring(1);for(;o.length>0&&"\\"==o[0];)o=o.substring(1);(n==o||"\\"==e.path&&""==p13targetpath)&&(p13filetree=e,p13updateFiles())}}else p13gotDownloadCommand(e)}}function p13sshConnectEx(e){if(0==e)null!=files&&connectFiles();else{var t=0;if(1==Q("dp2authmethod").value)4194304&features2||(t=Q("dp2keep").checked?1:0),files.socket.send(JSON.stringify({action:"sshauth",username:Q("dp2user").value,password:Q("dp2pass").value,keep:t}));else if(3==Q("dp2authmethod").value)files.socket.send(JSON.stringify({action:"sshkeyauth",keypass:Q("dp2keypass2").value}));else{4194304&features2||1==(t=Q("dp2keep1").checked?1:0)&&(t+=Q("dp2keep2").checked?1:0);var n=new FileReader,o=Q("dp2user").value,i=Q("dp2keypass").value;n.onload=function(e){files.socket.send(JSON.stringify({action:"sshauth",username:o,keypass:i,key:e.target.result,keep:t}))},n.readAsText(Q("dp2key").files[0])}}}function p13getCheckedNames(){for(var e=[],t=document.getElementsByName("fd"),n=0;n<t.length;n++)t[n].checked&&e.push(p13filetree.dir[t[n].value].n);return e}function p13updateFiles(e){var t="",n="",o="<a style=cursor:pointer;color:black onclick=p13folderup(0)>根</a>",i=p13filetree.path.split("\\");for(var a in p13filetreelocation=[],i)""!=i[a]&&p13filetreelocation.push(i[a]);for(var a in p13filetreelocation)o+=" / <a style=cursor:pointer;color:black onclick=p13folderup("+(parseInt(a)+1)+")>"+EscapeHtml(p13filetreelocation[a])+"</a>";var s=p13filetreelocation.join("/"),l=p13sort_files(p13filetree.dir);for(var a in l){var r,d=l[a],u=d.n;r=EscapeHtml(u);var c="";null!=d.s&&(c=getFileSizeStr(d.s));var p="";if(d.t<3){p="<div class=filelist file=999><input file=999 style=float:left name=fd class=fcb type=checkbox onchange=p13setActions() value='"+d.nx+"'>&nbsp;<span style=float:right></span><span title=\""+r+'"><div class=fileIcon'+d.t+'></div><a style=cursor:pointer onclick=p13folderset("'+encodeURIComponent(d.nx)+'")>'+r+"</a></span></div>"}else{var m=r;d.s>0&&(m='<a rel="noreferrer noopener" target="_blank" style=cursor:pointer onclick="p13downloadfile(\''+encodeURIComponent(s+"/"+u)+"','"+encodeURIComponent(u)+"',"+d.s+')">'+r+"</a>"),p="<div class=filelist file=3><input file=3 style=float:left name=fd class=fcb type=checkbox onchange=p13setActions() value='"+d.nx+"'>&nbsp;<span style=float:right;padding-right:4px>"+c+'</span><span title="'+r+'"><div class=fileIcon'+d.t+"></div>"+m+"</span></div>"}d.t<3?t+=p:n+=p}if(QH("p13files",t+n),QH("p13currentpath",o),QE("p13FolderUp",0!=p13filetreelocation.length),null!=e){var g=document.getElementsByName("fd");for(a=0;a<g.length;a++)e.indexOf(p13filetree.dir[g[a].value].n)>=0&&(g[a].checked=!0)}p13setActions()}function p13folderset(e){p13targetpath=joinPaths(p13filetree.path,p13filetree.dir[e].n).split("\\").join("/"),files&&(p13storeCurrentPath(p13targetpath),files.sendText({action:"ls",reqid:1,path:p13targetpath}))}function p13folderup(e){if(null==e)p13filetreelocation.pop();else for(;p13filetreelocation.length>e;)p13filetreelocation.pop();p13targetpath=p13filetreelocation.join("/"),files&&(p13storeCurrentPath(p13targetpath),files.sendText({action:"ls",reqid:1,path:p13targetpath}))}function p13storeCurrentPath(e){var t=[],n=-1;try{t=JSON.parse(getstore("_devFilePaths","[]"))}catch(e){}for(var o=0;o<t.length;o++)t[o].n==currentNode._id&&(n=o);for(n>=0&&t.splice(n,1),t.push({n:currentNode._id,p:e});t.length>40;)t.shift();putstore("_devFilePaths",JSON.stringify(t))}function p13sort_filename(e,t){return e.ln>t.ln?1*p13sortorder:e.ln<t.ln?-1*p13sortorder:0}function p13sort_timestamp(e,t){return e.d>t.d?1*p13sortorder:e.d<t.d?-1*p13sortorder:0}function p13sort_bysize(e,t){return e.s==t.s?p13sort_filename(e,t):(e.s-t.s)*p13sortorder}function p13sort_files(e){var t=[],n=Q("p13sortdropdown").value;for(var o in e)e[o].nx=o,null==e[o].s&&(e[o].s=0),null==e[o].n&&(e[o].n=o),e[o].ln=e[o].n.toLowerCase(),t.push(e[o]);return p13sortorder=1,n>3&&(p13sortorder=-1,n-=3),1==n?t.sort(p13sort_filename):2==n?t.sort(p13sort_bysize):3==n&&t.sort(p13sort_timestamp),t}function p13setActions(){var e=currentNode.agent&&14!=currentNode.agent.id;if(null==p13filetree)QE("p13DeleteFileButton",!1),QE("p13NewFolderButton",!1),QE("p13UploadButton",!1),QE("p13RenameFileButton",!1),QE("p13SelectAllButton",!1),Q("p13SelectAllButton").value="所有",QE("p13RefreshButton",!1),QE("p13CutButton",!1),QE("p13CopyButton",!1),QE("p13PasteButton",!1);else{var t=p13getFileSelCount(),n=p13getFileCount(),o=p13getFileSelCount(!1),i=isWindowsNode(currentNode);QE("p13DeleteFileButton",e&&t>0&&(p13filetreelocation.length>0||0==i)),QE("p13NewFolderButton",e&&(p13filetreelocation.length>0||0==i)),QE("p13UploadButton",e&&(p13filetreelocation.length>0||0==i)),QE("p13RenameFileButton",e&&1==t&&(p13filetreelocation.length>0||0==i)),QE("p13SelectAllButton",n>0),Q("p13SelectAllButton").value=t>0?"沒有":"所有",QE("p13RefreshButton",!0),QE("p13CutButton",e&&t>0&&t==o&&3!=currentNode.mtype&&(p13filetreelocation.length>0||0==i)),QE("p13CopyButton",e&&t>0&&t==o&&3!=currentNode.mtype&&(p13filetreelocation.length>0||0==i)),QE("p13PasteButton",e&&3!=currentNode.mtype&&(p13filetreelocation.length>0||0==i)&&null!=p13clipboard&&p13clipboard.length>0)}1==(null!=files&&0!=files.state)&&2!=files.contype||null==filesNode.agent||3==filesNode.agent.id||4==filesNode.agent.id?QH("filesCustomUpperRight",""):QH("filesCustomUpperRight","<a style=cursor:pointer onclick=cmsshportaction(1,event)>"+format("SSH 端口 {0}",filesNode.sshport?filesNode.sshport:22)+"</a>"),QV("filesActionsBtn",3!=filesNode.mtype)}function p13getFileSelCount(e){for(var t=0,n=document.getElementsByName("fd"),o=0;o<n.length;o++)!n[o].checked||0==e&&"3"!=n[o].attributes.file.value||t++;return t}function p13getFileSelDirCount(){for(var e=0,t=document.getElementsByName("fd"),n=0;n<t.length;n++)t[n].checked&&"999"==t[n].attributes.file.value&&e++;return e}function p13getFileCount(){return document.getElementsByName("fd").length}function p13selectallfile(){for(var e=0==p13getFileSelCount(),t=document.getElementsByName("fd"),n=0;n<t.length;n++)t[n].checked=e;p13setActions()}function p13createfolder(){setDialogMode(2,"新建檔案夾",3,p13createfolderEx,"<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% />"),focusTextBox("p13renameinput"),p13fileNameCheck()}function p13createfolderEx(){files.sendText({action:"mkdir",reqid:1,path:p13filetreelocation.join("/")+"/"+Q("p13renameinput").value}),p13folderup(999)}function p13deletefile(){var e=p13getFileSelCount(),t=p13getFileSelDirCount()>0?"<br /><br /><label><input type=checkbox id=p13recdeleteinput>遞迴刪除</label><br>":"<input type=checkbox id=p13recdeleteinput style='display:none'>";setDialogMode(2,"刪除",3,p13deletefileEx,e>1?format("刪除{0}個所選項目？",e)+t:"刪除所選項目？"+t)}function p13deletefileEx(){for(var e=[],t=document.getElementsByName("fd"),n=0;n<t.length;n++)t[n].checked&&e.push(p13filetree.dir[t[n].value].n);files.sendText({action:"rm",reqid:1,path:p13filetreelocation.join("/"),delfiles:e,rec:Q("p13recdeleteinput").checked}),p13folderup(999)}function p13renamefile(){for(var e,t=document.getElementsByName("fd"),n=0;n<t.length;n++)t[n].checked&&(e=p13filetree.dir[t[n].value].n);setDialogMode(2,"改名",3,p13renamefileEx,'<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% value="'+e+'" />',{action:"rename",path:p13filetreelocation.join("/"),oldname:e}),focusTextBox("p13renameinput"),p13fileNameCheck()}function p13renamefileEx(e,t){t.newname=Q("p13renameinput").value,files.sendText(t),p13folderup(999)}function p13fileNameCheck(e){var t=isFilenameValid(Q("p13renameinput").value);QE("idx_dlgOkButton",t),1==t&&null!=e&&13==e.keyCode&&dialogclose(1)}function p13uploadFile(){setDialogMode(2,"上載檔案",3,p13uploadFileEx,"<input type=file name=files id=p13uploadinput style=width:100% multiple=multiple onchange=\"updateUploadDialogOk('p13uploadinput')\" />"),updateUploadDialogOk("p13uploadinput")}function p13uploadFileEx(){p13doUploadFiles(Q("p13uploadinput").files)}function p13viewfile(){for(var e=document.getElementsByName("fd"),t=0;t<e.length;t++)if(e[t].checked){p13filetree.dir[e[t].value].s<=204800?p13downloadfile(encodeURIComponent(p13filetreelocation.join("/")+"/"+p13filetree.dir[e[t].value].n),encodeURIComponent(p13filetree.dir[e[t].value].n),p13filetree.dir[e[t].value].s,"viewer"):messagebox("檔案編輯器","只能編輯小於200k的檔案。");break}}var downloadFile,uploadFile,p13clipboard=null,p13clipboardFolder=null,p13clipboardCut=0;function p13copyFile(e){var t=document.getElementsByName("fd");p13clipboard=[],p13clipboardCut=e,p13clipboardFolder=p13targetpath;for(var n=0;n<t.length;n++)t[n].checked&&"3"==t[n].attributes.file.value&&p13clipboard.push(p13filetree.dir[t[n].value].n);p13updateClipview()}function p13pasteFile(){var e="";null!=p13clipboard&&p13clipboard.length>0&&(e=0==p13clipboardCut?p13clipboard.length>1?format("確認{0}個條目的副本到此位置？",p13clipboard.length):format("確認將1個副本複製到此位置？"):p13clipboard.length>1?format("確認將{0}個條目移到該位置？",p13clipboard.length):format("確認將1個條目移動到此位置？")),setDialogMode(2,"糊",3,p13pasteFileEx,e)}function p13pasteFileEx(){files.sendText({action:0==p13clipboardCut?"copy":"move",reqid:1,scpath:p13clipboardFolder,dspath:p13targetpath,names:p13clipboard}),p13folderup(999),1==p13clipboardCut&&(p13clipboard=null,p13clipboardFolder=null,p13clipboardCut=0,p13updateClipview())}function p13updateClipview(){var e="";null!=p13clipboard&&p13clipboard.length>0&&(e=0==p13clipboardCut?p13clipboard.length>1?format('保留{0}個項目進行複製, <a href=# onclick="return p13clearClip()" style=cursor:pointer>清除</a>.',p13clipboard.length):format('保存1個項目進行複製, <a href=# onclick="return p13clearClip()" style=cursor:pointer>清除</a>.'):p13clipboard.length>1?format('保存{0}個項目以進行移動, <a href=# onclick="return p13clearClip()" style=cursor:pointer>清除</a>.',p13clipboard.length):format('保存1個項目進行移動, <a href=# onclick="return p13clearClip()" style=cursor:pointer>清除</a>.')),QH("p13bottomstatus",e),p13setActions()}function p13clearClip(){return p13clipboard=null,p13clipboardFolder=null,p13clipboardCut=0,p13updateClipview(),!1}function updateUploadDialogOk(e){QE("idx_dlgOkButton",""!=Q(e).value)}function getFileSelCount(e){for(var t=0,n=document.getElementsByName("fc"),o=0;o<n.length;o++)!n[o].checked||0==e&&"3"!=n[o].attributes.file.value||t++;return t}function getFileCount(){return document.getElementsByName("fc").length}function p13downloadfile(e,t,n){xxdialogMode||downloadFile||!files||(downloadFile={path:decodeURIComponent(e),file:decodeURIComponent(t),size:n,tsize:0,data:"",state:0,id:Math.random()},files.sendText({action:"download",sub:"start",id:downloadFile.id,path:downloadFile.path}),setDialogMode(2,"下載檔案",10,p13downloadFileCancel,"<div>"+EscapeHtml(downloadFile.file)+"</div><br /><progress id=d2progressBar style=width:100% value=0 max="+n+" />"))}function p13downloadFileCancel(){setDialogMode(0),files.sendText({action:"download",sub:"cancel",id:downloadFile.id}),downloadFile=null}function p13gotDownloadCommand(e){null!=downloadFile&&e.id==downloadFile.id&&("start"==e.sub?(downloadFile.state=1,files.sendText({action:"download",sub:"startack",id:downloadFile.id})):"cancel"==e.sub&&(downloadFile=null,setDialogMode(0)))}function p13gotDownloadBinaryData(e){downloadFile&&0!=downloadFile.state&&(e.length>4&&(downloadFile.tsize+=e.length-4,downloadFile.data+=e.substring(4),Q("d2progressBar").value=downloadFile.tsize),1&ReadInt(e,0)?(saveAs(data2blob(downloadFile.data),downloadFile.file),downloadFile=null,setDialogMode(0)):files.sendText({action:"download",sub:"ack",id:downloadFile.id}))}function p13doUploadFiles(e){if(!xxdialogMode){var t=isWindowsNode(currentNode),n=[],o=0;for(var i in p13filetree.dir)t?n.push(p13filetree.dir[i].n.toLowerCase()):n.push(p13filetree.dir[i].n);for(i=0;i<e.length;i++)t?n.indexOf(e[i].name.toLowerCase())>=0&&o++:n.indexOf(e[i].name)>=0&&o++;0==o?p13uploadFileContinue(1,e):setDialogMode(2,"上載檔案",3,p13uploadFileContinue,format(1==o?"上傳將覆蓋1個檔案。繼續？":"上傳將覆蓋{0}個檔案。繼續？",o),e)}}function p13uploadFileContinue(e,t){(uploadFile={}).xpath=p13filetreelocation.join("/"),uploadFile.xfiles=t,uploadFile.xfilePtr=-1,setDialogMode(2,"上載檔案",10,p13uploadFileCancel,"<div id=p13dfileName>正在連線...</div><br /><progress id=d2progressBar style=width:100% value=0 max=0 />"),p13uploadNextFile()}const byteToHex=[];for(var n=0;n<=255;++n){var hexOctet=n.toString(16).padStart(2,"0");byteToHex.push(hexOctet)}function arrayBufferToHex(e){return Array.prototype.map.call(new Uint8Array(e),e=>byteToHex[e]).join("")}function performHash(e,t){window.crypto.subtle.digest("SHA-384",e).then(function(e){t(arrayBufferToHex(e))},function(){t(null)})}function performHashOnFile(e,t){var n=new FileReader;n.onerror=function(e){t(null)},n.onload=function(){window.crypto.subtle.digest("SHA-384",n.result).then(function(e){t(arrayBufferToHex(e))},function(){t(null)})},n.readAsArrayBuffer(e)}function p13uploadNextFile(){if(uploadFile.xfilePtr++,uploadFile.xfiles.length>uploadFile.xfilePtr){uploadFile.xptr=0;var e=uploadFile.xfiles[uploadFile.xfilePtr];if(QH("p13dfileName",EscapeHtml(e.name)),Q("d2progressBar").max=e.size,Q("d2progressBar").value=0,null==e.xdata){uploadFile.xfile=e;var t=null;for(var n in p13filetree.dir)p13filetree.dir[n].n==e.name&&(t=p13filetree.dir[n]);null!=t&&t.s<=uploadFile.xfile.size?performHashOnFile(uploadFile.xfile,function(n){files.sendText(JSON.stringify({action:"uploadhash",reqid:uploadFile.xfilePtr,path:uploadFile.xpath,name:e.name,tag:{h:n.toUpperCase(),s:t.s,skip:t.s==uploadFile.xfile.size}}))}):files.sendText(JSON.stringify({action:"upload",reqid:uploadFile.xfilePtr,path:uploadFile.xpath,name:e.name,size:uploadFile.xfile.size}))}else uploadFile.xdata=e.xdata,files.sendText(JSON.stringify({action:"upload",reqid:uploadFile.xfilePtr,path:uploadFile.xpath,name:e.name,size:uploadFile.xdata.byteLength}))}else p13uploadFileTransferDone()}function p13uploadFileCancel(e,t){null!=uploadFile&&(files.sendText(JSON.stringify({action:"uploadcancel",reqid:uploadFile.xfilePtr})),uploadFile=null),p13uploadFileTransferDone()}function p13uploadFileTransferDone(){uploadFile=null,setDialogMode(0),p13folderup(9999)}function p13gotUploadData(e){if(null!=uploadFile&&parseInt(uploadFile.xfilePtr)==parseInt(e.reqid))switch(e.action){case"uploadstart":uploadFile.xdataPriming=8,p13uploadNextPart(!1);break;case"uploadack":p13uploadNextPart(!1);break;case"uploaddone":uploadFile.xfiles.length>uploadFile.xfilePtr+1?p13uploadNextFile():p13uploadFileTransferDone();break;case"uploaderror":p13uploadFileCancel();break;case"uploadhash":var t=uploadFile.xfiles[uploadFile.xfilePtr];t&&(e.tag.h===e.hash?e.tag.skip?p13uploadNextFile():(uploadFile.xptr=e.tag.s,files.sendText(JSON.stringify({action:"upload",reqid:uploadFile.xfilePtr,path:uploadFile.xpath,name:t.name,size:uploadFile.xfile.size,append:!0}))):files.sendText(JSON.stringify({action:"upload",reqid:uploadFile.xfilePtr,path:uploadFile.xpath,name:t.name,size:uploadFile.xfile.size,append:!1})))}}function p13uploadNextPart(e){if(uploadFile.xdata){var t=uploadFile.xdata,n=uploadFile.xptr;if(n>=t.byteLength)files.sendText(JSON.stringify({action:"uploaddone",reqid:uploadFile.xfilePtr}));else{if((a=uploadFile.xptr+(attemptWebRTC?16384:65536))>t.byteLength){if(1==e)return;a=t.byteLength}var o=new Uint8Array(t.slice(n,a));if(123==o[0]||0==o[0]){var i=new Uint8Array(a-n+1);i.set(o,1),files.send(i)}else files.send(o);uploadFile.xptr=a,Q("d2progressBar").value=a}}else if(uploadFile.xfile){if(null!=uploadFile.xreader)return;if(uploadFile.xptr>=uploadFile.xfile.size)return;var a;if((a=uploadFile.xptr+(attemptWebRTC?16384:65536))>uploadFile.xfile.size){if(1==e)return;a=uploadFile.xfile.size}uploadFile.xreader=new FileReader,uploadFile.xreader.onerror=function(e){console.log(e)},uploadFile.xreader.onload=function(){var e=uploadFile.xreader.result;if(delete uploadFile.xreader,null!=e){var t=new Uint8Array(e);if(123==t[0]||0==t[0]){var n=new Uint8Array(e.byteLength+1);n.set(t,1),files.send(n)}else files.send(t);uploadFile.xptr=a,Q("d2progressBar").value=a,uploadFile.xptr>=uploadFile.xfile.size?files.sendText(JSON.stringify({action:"uploaddone",reqid:uploadFile.xfilePtr})):uploadFile.xdataPriming>0&&(uploadFile.xdataPriming--,p13uploadNextPart(!0))}},uploadFile.xreader.readAsArrayBuffer(uploadFile.xfile.slice(uploadFile.xptr,a))}}var consoleNode,DeviceDetailsHardware=null,DeviceDetailsNetwork=null,DeviceDetailsNodeId=null;function updateDeviceDetails(e,t,n){if(null!=currentNode&&(null==e&&(e=currentNode),currentNode._id==e._id)){DeviceDetailsNodeId!=e._id&&(DeviceDetailsHardware=null,DeviceDetailsNetwork=null,DeviceDetailsNodeId=e._id),null!=t&&(DeviceDetailsHardware=t),null!=n&&(DeviceDetailsNetwork=n),null==(t=DeviceDetailsHardware)&&(t={}),null==(n=DeviceDetailsNetwork)&&(n={});var o=[],i={},a="";if(e.rname&&(a+=addDetailItem("名稱",EscapeHtml(e.rname),i)),t.windows&&t.windows.osinfo&&t.windows.osinfo.Description&&(a+=addDetailItem("描述",EscapeHtml(t.windows.osinfo.Description),i)),e.osdesc&&(a+=addDetailItem("版",EscapeHtml(e.osdesc),i)),t.windows&&t.windows.osinfo){if((f=t.windows.osinfo).BuildRevision&&(a+=addDetailItem("內部版本號",EscapeHtml(f.BuildRevision),i)),f.OSArchitecture&&(f.OSArchitecture.startsWith("32")?a+=addDetailItem("結構","32 位",i):f.OSArchitecture.startsWith("64")?a+=addDetailItem("結構","64 位",i):a+=addDetailItem("結構",EscapeHtml(f.OSArchitecture),i)),f.LastBootUpTime){var s={year:parseInt(f.LastBootUpTime.substring(0,4)),month:parseInt(f.LastBootUpTime.substring(4,6))-1,day:parseInt(f.LastBootUpTime.substring(6,8)),hours:parseInt(f.LastBootUpTime.substring(8,10)),minutes:parseInt(f.LastBootUpTime.substring(10,12)),seconds:parseInt(f.LastBootUpTime.substring(12,14))};a+=addDetailItem("Last Boot Up Time",printDateTime(new Date(s.year,s.month,s.day,s.hours,s.minutes,s.seconds)))}f.Domain&&(a+=addDetailItem(f.PartOfDomain?"域":"工作群組",EscapeHtml(f.Domain),i)),f.DomainState>0&&(a+=addDetailItem("域狀態",domainStates[f.DomainState]?domainStates[f.DomainState]:"未知",i))}if(t.linux&&t.linux.LastBootUpTime){s={year:(l=new Date(t.linux.LastBootUpTime)).getFullYear(),month:l.getMonth(),day:l.getDate(),hours:l.getHours(),minutes:l.getMinutes(),seconds:l.getSeconds()};a+=addDetailItem("Last Boot Up Time",printDateTime(new Date(s.year,s.month,s.day,s.hours,s.minutes,s.seconds)))}if(t.darwin&&t.darwin.LastBootUpTime){var l;s={year:(l=new Date(1e3*t.darwin.LastBootUpTime)).getFullYear(),month:l.getMonth(),day:l.getDate(),hours:l.getHours(),minutes:l.getMinutes(),seconds:l.getSeconds()};a+=addDetailItem("Last Boot Up Time",printDateTime(new Date(s.year,s.month,s.day,s.hours,s.minutes,s.seconds)))}if(e.wsc){var r=[];null!=e.wsc.antiVirus&&("OK"==e.wsc.antiVirus?r.push("視聽 - <span style=color:green>OK</span>"):r.push("視聽 - <span style=color:red>壞的</span>")),null!=e.wsc.autoUpdate&&("OK"==e.wsc.autoUpdate?r.push("更新資料 - <span style=color:green>OK</span>"):r.push("更新資料 - <span style=color:red>壞的</span>")),null!=e.wsc.firewall&&("OK"==e.wsc.firewall?r.push("防火牆 - <span style=color:green>OK</span>"):r.push("防火牆 - <span style=color:red>壞的</span>")),a+=addDetailItem("Windows 安全",r.join(", "))}if(e.defender){r=[];null!=e.defender.RealTimeProtection&&(1==e.defender.RealTimeProtection?r.push("RealTimeProtection - <span style=color:green>On</span>"):r.push("RealTimeProtection - <span style=color:red>離開</span>")),null!=e.defender.TamperProtected&&(1==e.defender.TamperProtected?r.push("TamperProtection - <span style=color:green>On</span>"):r.push("TamperProtection - <span style=color:red>離開</span>")),null!=e.defender.AntivirusSignatureVersion&&r.push("簽名版本 - <span style=color:green>"+EscapeHtml(e.defender.AntivirusSignatureVersion)+"</span>"),r.length>0&&(a+=addDetailItem("Windows Defender",r.join(", ")))}if(e.av&&e.av.length>0){r=[];for(var d in e.av)if(e.av[d].product){var u=EscapeHtml(e.av[d].product);!0!==e.av[d].enabled&&(u+=" - <span style=color:red>已禁用</span>"),!0!==e.av[d].updated&&(u+=" - <span style=color:red>過時的</span>"),1==e.av[d].enabled&&1==e.av[d].updated&&(u+=" - <span style=color:green>OK</span>"),r.push(u)}a+=addDetailItem("防毒軟體",r.join("<br />"))}if(e.users&&e.users.length>0){var c=e.users.map(function(t,n){var o=e.upnusers&&e.upnusers[n],i=2&features3?e.users&&null!=e.users[n]?EscapeHtml(e.users[n]):null:null!=o?EscapeHtml(o):null,a=EscapeHtml(2&features3&&null!=o?o:t);return e.lusers&&e.lusers.indexOf(t)>=0?addKeyLinkConditional(a,i?i+" - 已鎖定":"已鎖定",!0):i?"<span style=cursor:default title='"+i+"'>"+a+"</span>":a}).join(", ");a+=addDetailItem((e.users.length,"活躍用戶"),c)}if(e.idletime&&-1!=e.idletime&&(a+=addDetailItem("空閒時間",printTimer(e.idletime))),""!=a&&o.push({name:"操作系統",html:a,img:"software"}),e.agent){a="";if(null!=e.agent&&null!=e.agent.id&&null!=e.agent.ver){var p="";p=e.agent.id<=agentsStr.length?agentsStr[e.agent.id]:agentsStr[0],0!=e.agent.ver&&(p+=" v"+e.agent.ver),14==e.agent.id&&(p=e.agent.core),a+=addDetailItem("Mesh Agent",p)}if(e.firstconnect&&(a+=addDetailItem("首次代理連接",printDateTime(new Date(e.firstconnect)))),1&e.conn?a+=addDetailItem("上次代理連接","現在已連接"):e.lastconnect&&(a+=addDetailItem("上次代理連接",printDateTime(new Date(e.lastconnect)))),e.lastaddr){var m=e.lastaddr.split(":");m.length>2?a+=addDetailItem("上次代理地址",e.lastaddr):isPrivateIP(e.lastaddr)?a+=addDetailItem("上次代理地址",m[0]):a+=addDetailItem("上次代理地址",'<a href="https://iplocation.com/?ip='+m[0]+'" rel="noreferrer noopener" target="MeshIPLoopup">'+m[0]+"</a>")}if(null!=t.agentvers&&t.agentvers.compileTime)try{var g=Date.parse(t.agentvers.compileTime);a+=addDetailItem("編譯時間",printDateTime(new Date(g)))}catch(e){}null!=t.time&&(a+=addDetailItem("最後詳細信息更新",printDateTime(new Date(t.time)))),""!=a&&o.push({name:"Mesh Agent",html:a,img:"meshagent"})}if(t.mobile){a="";t.mobile.brand&&t.mobile.model&&(a+=addDetailItem("模型",EscapeHtml(t.mobile.brand+", "+t.mobile.model),i)),t.mobile.device&&(a+=addDetailItem("裝置",EscapeHtml(t.mobile.device),i)),t.mobile.bootloader&&(a+=addDetailItem("引導加載程序",EscapeHtml(t.mobile.bootloader),i)),t.mobile.id&&(a+=addDetailItem("識別符",EscapeHtml(t.mobile.id),i)),t.mobile.host&&(a+=addDetailItem("主機名",EscapeHtml(t.mobile.host),i)),t.mobile.androidapi&&t.mobile.androidrelease&&(a+=addDetailItem("Android Version",EscapeHtml(t.mobile.androidrelease+", API Level "+t.mobile.androidapi),i)),""!=a&&o.push({name:"移動設備",html:a,img:"mobile"})}if(null!=n.netif2){a="";for(var d in a+="<table style=width:100%>",n.netif2){var f=n.netif2[d];if(!(0==Array.isArray(f)||f.length<1||null==f[0]||"string"==typeof f[0].mac&&f[0].mac.startsWith("00:00:00:00"))){a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+EscapeHtml(d+(f[0].fqdn?", "+f[0].fqdn:""))+"</b></div>",f.desc&&(a+=addDetailItem("描述",EscapeHtml(f.desc).split("(R)").join("&reg;"))),"string"==typeof f[0].mac&&(f[0].gatewaymac?a+=addDetailItem("MAC層",format("MAC：{0}，網關：{1}",EscapeHtml(f[0].mac),EscapeHtml(f[0].gatewaymac))):a+=addDetailItem("MAC層",format("MAC：{0}",EscapeHtml(f[0].mac)))),"number"==typeof f[0].speed&&0x8000000000000000!=f[0].speed&&f[0].speed>0&&(a+=addDetailItem("介面速度",format("{0}",getNetworkSpeed(f[0].speed))));for(var h=0;h<f.length;h++){var v=f[h],k=[];v.address&&k.push(format("IP：{0}",EscapeHtml(v.address))),v.netmask&&k.push(format("掩碼：{0}",EscapeHtml(v.netmask))),v.gateway&&k.push(format("網關：{0}",EscapeHtml(v.gateway))),k.length>0&&("IPv4"==v.family&&(a+=addDetailItem("IPv4層",k.join("，"))),"IPv6"==v.family&&(a+=addDetailItem("IPv6層",k.join("，"))))}a+="</div></td></tr>"}}t.network&&t.network.dns&&(a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+=addDetailItem("<b>DNS Servers</b>",t.network.dns.join("，")),a+="</div></td></tr>"),""!=(a+="</table>")&&o.push({name:"網路",html:a,img:"networking"})}if(null!=e.intelamt){a="";a+=addDetailItem("版",e.intelamt.ver?"v"+EscapeHtml(e.intelamt.ver):"<i>未知</i>",i),a+=addDetailItem("識別符",e.intelamt.uuid?EscapeHtml(e.intelamt.uuid):"<i>未知</i>",i);var y={0:nobreak("未啟動（預）"),1:nobreak("未啟動（輸入）"),2:nobreak("已啟動")},x="";2==e.intelamt.state&&e.intelamt.flags&&(2&e.intelamt.flags?x=", 客戶端控制模式（CCM）":4&e.intelamt.flags&&(x=", 管理員控制模式（ACM）")),a+=addDetailItem("配置狀態",(e.intelamt.state?y[e.intelamt.state]:"<i>未知</i>")+x,i),a+=addDetailItem("安全",1==e.intelamt.tls?"已使用TLS保安":"未設置TLS",i),""!=(a+=addDetailItem("管理員憑證",null==e.intelamt.user||""==e.intelamt.user||null!=e.intelamt.warn&&9&e.intelamt.warn?"未知":"已知的",i))&&("number"==typeof e.intelamt.sku&&16&e.intelamt.sku?o.push({name:"英特爾&reg; 標準可管理性（英特爾&reg; SM）",html:a,img:"amt"}):o.push({name:"Intel &reg; Active Management Technology（Intel&reg; AMT）",html:a,img:"amt"}))}if(t.identifiers){a="";var b=t.identifiers;if(b.bios_vendor&&(a+=addDetailItem("供應商",EscapeHtml(b.bios_vendor),i)),b.bios_version&&(a+=addDetailItem("版",EscapeHtml(b.bios_version),i)),b.bios_serial&&(a+=addDetailItem("序列號",EscapeHtml(b.bios_serial),i)),b.bios_mode&&(a+=addDetailItem("Mode",EscapeHtml(b.bios_mode),i)),""!=a&&o.push({name:"的BIOS",html:a,img:"chip"}),a="",b.board_vendor&&(a+=addDetailItem("供應商",EscapeHtml(b.board_vendor),i)),b.board_name&&(a+=addDetailItem("名稱",EscapeHtml(b.board_name),i)),b.board_serial&&""!=b.board_serial&&(a+=addDetailItem("序列號",EscapeHtml(b.board_serial),i)),b.board_version&&(a+=addDetailItem("版",EscapeHtml(b.board_version),i)),b.product_uuid&&(a+=addDetailItem("識別符",EscapeHtml(b.product_uuid),i)),b.cpu_name&&(a+=addDetailItem("CPU",EscapeHtml(b.cpu_name).split("(TM)").join("&trade;").split("(R)").join("&reg;"),i)),b.gpu_name)for(var d in b.gpu_name)a+=addDetailItem("GPU",EscapeHtml(b.gpu_name[d]).split("(TM)").join("&trade;").split("(R)").join("&reg;"),i);""!=a&&o.push({name:"母板",html:a,img:"motherboard"}),a="",b.chassis_manufacturer&&(a+=addDetailItem("製造商",EscapeHtml(b.chassis_manufacturer),i)),b.product_name&&(a+=addDetailItem("產品名稱",EscapeHtml(b.product_name),i)),b.chassis_serial&&(a+=addDetailItem("序列號",EscapeHtml(b.chassis_serial),i)),b.chassis_assettag&&(a+=addDetailItem("資產標籤",EscapeHtml(b.chassis_assettag),i)),""!=a&&o.push({name:"系統",html:a,img:"system"})}if(t.tpm){a="";var w=t.tpm;w.SpecVersion&&(a+=addDetailItem("SpecVersion",parseFloat(EscapeHtml(w.SpecVersion)).toFixed(1),i)),w.ManufacturerId&&(a+=addDetailItem("識別符",EscapeHtml(w.ManufacturerId),i)),w.ManufacturerVersion&&(a+=addDetailItem("版",EscapeHtml(w.ManufacturerVersion),i)),null!=w.IsActivated&&(a+=addDetailItem("已啟動",w.IsActivated?"Yes":"No",i)),null!=w.IsEnabled&&(a+=addDetailItem("已啟用",w.IsEnabled?"Yes":"No",i)),null!=w.IsOwned&&(a+=addDetailItem("擁有",w.IsOwned?"Yes":"No",i)),""!=a&&o.push({name:"TPM",html:a,img:"tpm"})}if(t.battery){a="";for(var d in a+="<table style=width:100%>",t.battery){var S=t.battery[d];a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+EscapeHtml(S.DeviceName?S.DeviceName:"未知")+"</b></div>",S.CycleCount&&(a+=addDetailItem("循環計數",EscapeHtml(S.CycleCount),i)),S.FullChargedCapacity&&(a+=addDetailItem("滿電容量",format("{0} mWh",S.FullChargedCapacity),i)),S.EstimatedRuntime&&(a+=addDetailItem("預計運行時間",format("{0} 分鐘",Math.floor(S.EstimatedRuntime/60)),i)),S.Chemistry&&(a+=addDetailItem("化學",EscapeHtml(S.Chemistry),i)),S.DesignedCapacity&&(a+=addDetailItem("設計容量",format("{0} mWh",S.DesignedCapacity),i)),S.ManufactureDate&&(a+=addDetailItem("生產日期",EscapeHtml(S.ManufactureDate),i)),S.ManufactureName&&(a+=addDetailItem("製造商名稱",EscapeHtml(S.ManufactureName),i)),S.SerialNumber&&(a+=addDetailItem("序號",EscapeHtml(S.SerialNumber),i)),S.ChargeRate&&(a+=addDetailItem("收費率",format("{0} mW",S.ChargeRate),i)),null!=S.Charging&&(a+=addDetailItem("收費",S.Charging?"Yes":"No",i)),S.DischargeRate&&(a+=addDetailItem("出院率",format("{0} mW",S.DischargeRate),i)),null!=S.Discharging&&(a+=addDetailItem("出院",S.Discharging?"Yes":"No",i)),S.RemainingCapacity&&(a+=addDetailItem("剩餘容量",format("{0} mWh",S.RemainingCapacity),i)),S.Voltage&&(a+=addDetailItem("電壓",format("{0} V",S.Voltage/1e3),i)),S.Health&&(a+=addDetailItem("健康",format("{0} %",S.Health),i)),S.BatteryCharge&&(a+=addDetailItem("電池充電",format("{0} %",S.BatteryCharge),i)),a+="</div>"}""!=(a+="</table>")&&o.push({name:"電池",html:a,img:"battery"})}if(t.windows&&t.windows.memory&&t.windows.memory.length>0){a="";for(var d in t.windows.memory.sort(function(e,t){return e.BankLabel>t.BankLabel?1:e.BankLabel<t.BankLabel?-1:0}),a+="<table style=width:100%>",t.windows.memory){f=t.windows.memory[d];a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+EscapeHtml(f.BankLabel?f.BankLabel:f.DeviceLocator?f.DeviceLocator:"Unknown")+"</b></div>",f.Capacity&&f.Speed?a+=addDetailItem("容量/速度",format("{0} Mb，{1} Mhz",f.Capacity/1024/1024,f.Speed),i):f.Capacity&&(a+=addDetailItem("容量",format("{0} Mb",f.Capacity/1024/1024),i)),f.PartNumber&&(a+=addDetailItem("零件號",EscapeHtml(f.Manufacturer&&"Undefined"!=f.Manufacturer?f.Manufacturer+", ":"")+EscapeHtml(f.PartNumber),i)),a+="</div>"}""!=(a+="</table>")&&o.push({name:"記憶體",html:a,img:"ram"})}if(t.linux&&t.linux.memory&&t.linux.memory.Memory_Device.length>0){a="";for(var d in t.linux.memory.Memory_Device.sort(function(e,t){return e.Locator>t.Locator?1:e.Locator<t.Locator?-1:0}),a+="<table style=width:100%>",t.linux.memory.Memory_Device){(f=t.linux.memory.Memory_Device[d]).Size&&"No Module Installed"==f.Size||(a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+EscapeHtml(f.Locator?f.Locator:"Unknown")+"</b></div>",f.Size&&f.Speed?a+=addDetailItem("容量/速度",format("{0}, {1}",f.Size,f.Speed),i):f.Size&&(a+=addDetailItem("容量",format("{0}",f.Size),i)),f.PartNumber&&(a+=addDetailItem("零件號",EscapeHtml(f.Manufacturer&&"Undefined"!=f.Manufacturer?f.Manufacturer+", ":"")+EscapeHtml(f.PartNumber),i)),a+="</div>")}""!=(a+="</table>")&&o.push({name:"記憶體",html:a,img:"ram"})}if(t.darwin&&t.darwin.memory&&t.darwin.memory.length>0){a="";for(var d in a+="<table style=width:100%>",t.darwin.memory){(f=t.darwin.memory[d]).Size&&"No Module Installed"==f.Size||(a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+EscapeHtml(f.DeviceLocator?f.DeviceLocator:"Unknown")+"</b></div>",f.Size&&f.Speed?a+=addDetailItem("容量/速度",format("{0}, {1}",f.Size,f.Speed),i):f.Size&&(a+=addDetailItem("容量",format("{0}",f.Size),i)),f.PartNumber&&(a+=addDetailItem("零件號",EscapeHtml(f.Manufacturer&&""!=f.Manufacturer?f.Manufacturer+", ":"")+EscapeHtml(f.PartNumber),i)),a+="</div>")}""!=(a+="</table>")&&o.push({name:"記憶體",html:a,img:"ram"})}if(t.identifiers&&b.storage_devices){a="";for(var d in b.storage_devices.sort(function(e,t){return e.Caption>t.Caption?1:e.Caption<t.Caption?-1:0}),a+="<table style=width:100%>",b.storage_devices){if((f=b.storage_devices[d]).Size){if(a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+EscapeHtml(f.Caption)+"</b></div>",f.Model&&f.Model!=f.Caption&&(a+=addDetailItem("模型",EscapeHtml(f.Model),i)),f.Size&&("string"==typeof f.Size&&parseInt(f.Size)==f.Size&&(f.Size=parseInt(f.Size)),"number"==typeof f.Size&&(a+=addDetailItem("容量",format("{0} Mb",Math.floor(f.Size/1024/1024)),i)),"string"==typeof f.Size&&(a+=addDetailItem("容量",EscapeHtml(f.Size),i))),t.windows&&t.windows.drives&&f.Model){const e=t.windows.drives.find(e=>e.Model===f.Model);e&&(a+=addDetailItem("狀態",EscapeHtml(e.Status),i))}a+="</div>"}}""!=(a+="</table>")&&o.push({name:"儲存",html:a,img:"storage"})}if(t.windows&&t.windows.volumes){a="";for(var d in t.windows.volumes){if(a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+d+":"+(null==(f=t.windows.volumes[d]).name||""==f.name?"":" - "+EscapeHtml(f.name))+"</b></div>",f.size){var D=["Bytes","KB","MB","GB","TB"],Q=0===(h=parseInt(Math.floor(Math.log(Math.abs(f.size))/Math.log(1024)),10))?`${f.size} ${D[h]}`:`${(f.size/1024**h).toFixed(2)} ${D[h]}`;a+=addDetailItem("容量",EscapeHtml(Q),i)}if(f.sizeremaining){D=["Bytes","KB","MB","GB","TB"],Q=0===(h=parseInt(Math.floor(Math.log(Math.abs(f.sizeremaining))/Math.log(1024)),10))?`${f.sizeremaining} ${D[h]}`:`${(f.sizeremaining/1024**h).toFixed(2)} ${D[h]}`;a+=addDetailItem("剩餘容量",EscapeHtml(Q),i)}if(f.type)a+=addDetailItem("File System",(""!=(C=1==f.removable?"Removable":1==f.cdrom?"CD-ROM":"")?C+" / ":"")+("Unknown"==f.type?"未知":EscapeHtml(f.type)),i);if(f.protectionStatus||f.volumeStatus){var M=[];f.protectionStatus&&M.push("已啟用"),f.volumeStatus&&"FullyDecrypted"==f.volumeStatus&&M.push("Fully Decrypted"),f.volumeStatus&&"EncryptionInProgress"==f.volumeStatus&&M.push("Encryption In Progress"),f.volumeStatus&&"FullyEncrypted"==f.volumeStatus&&M.push("Fully Encrypted"),M=M.join(" - "),f.recoveryPassword&&(M+=addKeyLink("",'deviceDetailsShowBitlockerInfo("'+encodeURIComponentEx(d)+'","'+encodeURIComponentEx(f.identifier)+'","'+encodeURIComponentEx(f.recoveryPassword)+'")')),a+=addDetailItem("BitLocker",M,i)}a+="</div>"}""!=a&&o.push({name:"Storage Volumes",html:"<table style=width:100%>"+a+"</table>",img:"storage"})}if(t.linux&&t.linux.volumes){a="";for(var d in t.linux.volumes){if(!(f=t.linux.volumes[d]).mount_point.startsWith("/var/lib/docker/overlay2")){if(a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+f.mount_point+"</b></div>",f.size){D=["KB","MB","GB","TB"],Q=0===(h=parseInt(Math.floor(Math.log(Math.abs(f.size))/Math.log(1024)),10))?`${f.size} ${D[h]}`:`${(f.size/1024**h).toFixed(2)} ${D[h]}`;a+=addDetailItem("容量",EscapeHtml(Q),i)}if(f.available){if(0==Math.abs(f.available))Q="0 KB";else D=["KB","MB","GB","TB"],Q=0===(h=parseInt(Math.floor(Math.log(Math.abs(f.available))/Math.log(1024)),10))?`${f.available} ${D[h]}`:`${(f.available/1024**h).toFixed(2)} ${D[h]}`;a+=addDetailItem("剩餘容量",EscapeHtml(Q),i)}if(f.type)a+=addDetailItem("File System",(""!=(C=1==f.removable?"Removable":1==f.cdrom?"CD-ROM":"")?C+" / ":"")+("Unknown"==f.type?"未知":EscapeHtml(f.type)),i);a+="</div>"}}""!=a&&o.push({name:"Storage Volumes",html:"<table style=width:100%>"+a+"</table>",img:"storage"})}if(t.darwin&&t.darwin.volumes){a="";for(var d in t.darwin.volumes){if(!(f=t.darwin.volumes[d]).mount_point.startsWith("/var/lib/docker/overlay2")){var C;if(a+="<tr><td><div class=style10 style=border-radius:5px;padding:8px>",a+="<div style=margin-bottom:3px><b>"+f.mount_point+"</b></div>",f.size&&(a+=addDetailItem("容量",EscapeHtml(f.size),i)),f.available&&(a+=addDetailItem("剩餘容量",EscapeHtml(f.available),i)),f.type)a+=addDetailItem("File System",(""!=(C=1==f.removable?"Removable":1==f.cdrom?"CD-ROM":"")?C+" / ":"")+("Unknown"==f.type?"未知":EscapeHtml(f.type)),i);a+="</div>"}}""!=a&&o.push({name:"Storage Volumes",html:"<table style=width:100%>"+a+"</table>",img:"storage"})}a="";for(var d in o)null==o[d].img?a+="<div class=DevSt style=margin-bottom:3px;margin-left:4px><b>"+o[d].name+"</b></div><div style=margin-bottom:10px;margin-left:4px>"+o[d].html+"</div>":(a+="<table style=width:100%><tr>",a+="<td style=width:32px;vertical-align:top><img src=images/details/"+o[d].img+'32.png srcset="images/details/'+o[d].img+'64.png 2x" border=0 width=32 /></td>',a+="<td><div class=DevSt style=margin-bottom:3px;margin-left:4px><b>"+o[d].name+"</b></div><div style=margin-bottom:10px;margin-left:4px>"+o[d].html+"</div></td>",a+="</tr></table>");""==a?QH("p10detailshtml","沒有此裝置的訊息。"):QH("p10detailshtml",a)}}function deviceDetailsShowBitlockerInfo(e,t,n){if(xxdialogMode)return!1;var o="<div><p>識別符</p><p style=user-select:text;font-weight:bold>"+(t?decodeURIComponent(t):"未知")+"</p>";o+="<p>Recovery Password</p><p style=user-select:text;font-weight:bold>"+(n?decodeURIComponent(n):"未知")+"</p></div>",setDialogMode(2,decodeURIComponent(e)+": BitLocker Information",1,null,o,"")}function insertTextAtCursor(e,t){if(document.selection)e.focus(),sel=document.selection.createRange(),sel.text=t;else if(e.selectionStart||"0"==e.selectionStart){var n=e.selectionStart,o=e.selectionEnd;e.value=e.value.substring(0,n)+t+e.value.substring(o,e.value.length),e.setSelectionRange(o+1,o+1)}else e.value+=myValue}var consoleServerText="";function setupConsole(){var e=consoleNode==currentNode;meshes[(consoleNode=currentNode).meshid];if(16&GetNodeRights(currentNode)){null==consoleNode.consoleText&&(consoleNode.consoleText=""),0==e&&(QH("p15agentConsoleText",consoleNode.consoleText),Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight);1&consoleNode.conn||consoleNode.conn;var t=1&consoleNode.conn?"代理在線":"代理離線";16&consoleNode.conn&&(t+="，MQTT在線"),QH("p15statetext",t),QE("p15uploadCore",!!(1&consoleNode.conn)),QV("p15outputselecttd",!!(16&consoleNode.conn)||1==currentNode.pmt&&!!(2&features2)),QV("p15outputselect2",!!(16&consoleNode.conn)),QV("p15outputselect3",1==currentNode.pmt&&!!(2&features2));var n=Q("p15outputselect").value;16&consoleNode.conn||2!=n||(n=1,Q("p15outputselect").value=1),1==currentNode.pmt&&2&features2||3!=n||(n=1,Q("p15outputselect").value=1);var o=!1;1&consoleNode.conn&&1==n&&(o=!0),16&consoleNode.conn&&2==n&&(o=!0),1==currentNode.pmt&&2&features2&&3==n&&(o=!0),QE("p15consoleText",o)}else QH("p15statetext","拒絕存取"),QE("p15consoleText",!1),QE("p15uploadCore",!1),QV("p15outputselecttd",!1);QV("devListToolbarViewIcons3",!!(1&consoleNode.conn))}function p15consoleClear(){QH("p15agentConsoleText",""),Q("id_p15consoleClear").blur(),consoleNode.consoleText=""}var currentMesh,consoleHistory=[];function p15consoleSend(e){if(!e||13==e.keyCode){var t=Q("p15consoleText").value,n="<div style=color:green>&gt; "+EscapeHtml(t)+"<br/></div>";if(16&consoleNode.conn&&2==Q("p15outputselect").value?(n="<div style=color:orange>MQTT&gt; "+EscapeHtml(t)+"<br/></div>",consoleNode.consoleText+=n,meshserver.send({action:"sendmqttmsg",topic:"console",nodeids:[consoleNode._id],msg:t})):1==consoleNode.pmt&&3==Q("p15outputselect").value&&2&features2?(n="<div style=color:violet>推&gt; "+EscapeHtml(t)+"<br/></div>",consoleNode.consoleText+=n,meshserver.send({action:"pushconsole",nodeid:consoleNode._id,console:t})):1&consoleNode.conn&&(consoleNode.consoleText+=n,meshserver.send({action:"msg",type:"console",nodeid:consoleNode._id,value:t})),Q("p15agentConsoleText").innerHTML+=n,Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight,Q("p15consoleText").value="",t.length>0){var o=consoleHistory.indexOf(t);o>=0&&consoleHistory.splice(o,1),consoleHistory.unshift(t),consoleHistory.splice(10)}}}function p15consoleReceive(e,t,n){"serverconsole"===e?(t="<div>"+EscapeHtml(t)+"</div>",consoleServerText+=t,"server"==consoleNode&&(Q("p15agentConsoleText").innerHTML+=t,Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight)):(t="MQTT"==n?"<div style=color:red>MQTT&gt; "+EscapeHtml(t)+"<br/></div>":"<div>"+EscapeHtml(t)+"</div>",null==e.consoleText?e.consoleText=t:e.consoleText+=t,consoleNode==e&&(Q("p15agentConsoleText").innerHTML+=t,Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight))}function p15downloadConsoleText(){saveAs(new Blob([Q("p15agentConsoleText").innerText],{type:"application/octet-stream"}),"console.txt")}function p15uploadCore(e){if(!xxdialogMode)if(1==e.shiftKey)meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"default"});else if(1==e.altKey)meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"clear"});else if(1==e.ctrlKey)p15uploadCore2();else{setDialogMode(2,"執行代理指令",3,p15uploadCoreEx,addHtmlValue("指令","<select id=d3coreMode style=width:230px><option value=1>上載默認伺服器核心</option><option value=2>清除核心</option><option value=3>上載核心檔案</option><option value=4>軟斷開代理</option><option value=5>強行斷開代理</option><option value=6>上傳恢復核心</option><option value=7>上傳小核心</option><option value=8>Restart agent service</option><option value=9>強制代理更新</option></select>"))}}function p15uploadCoreEx(){1==Q("d3coreMode").value?meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"default"}):2==Q("d3coreMode").value?meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"clear"}):3==Q("d3coreMode").value?p15uploadCore2():4==Q("d3coreMode").value?meshserver.send({action:"agentdisconnect",nodeid:consoleNode._id,disconnectMode:1}):5==Q("d3coreMode").value?meshserver.send({action:"agentdisconnect",nodeid:consoleNode._id,disconnectMode:2}):6==Q("d3coreMode").value?meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"recovery"}):7==Q("d3coreMode").value?meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"tiny"}):8==Q("d3coreMode").value?meshserver.send({action:"msg",type:"console",nodeid:consoleNode._id,value:"service restart"}):9==Q("d3coreMode").value&&meshserver.send({action:"updateAgents",nodeids:[consoleNode._id]})}function p15uploadCore2(){xxdialogMode||(Q("d3localmodeform").action="uploadmeshcorefile.ashx",Q("d3auth").value=authCookie,Q("d3attrib").value=currentNode._id,setDialogMode(4,"上載mesh agent核心",3,p15uploadCoreEx2),d3init())}function p15uploadCoreEx2(){if(1==Q("d3uploadMode").value)Q("d3submit").click();else{var e=d3getFileSel();1==e.length&&meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"custom",path:d3filetreelocation.join("/")+"/"+e[0]})}}function p20updateMesh(){if(null!=currentMesh){QH("p20meshName",EscapeHtml(currentMesh.name));var e=format("未知＃{0}",currentMesh.mtype),t=GetMeshRights(currentMesh);1==currentMesh.mtype&&(e="僅限Intel&reg; AMT，無代理"),2==currentMesh.mtype&&(e="使用軟體代理進行管理"),3==currentMesh.mtype&&(e=null==currentMesh.relayid?"本地設備，無代理":"沒有代理設備通過代理中繼"),4==currentMesh.mtype&&(e=null==currentMesh.relayid?"IP-KVM 設備":"通過代理中繼的 IP-KVM 設備",1==currentMesh.kvm.model&&(e+=", Raritan KX III"));var n="";if(n+=addHtmlValue("名稱",addLinkConditional(EscapeHtml(currentMesh.name),"p20editmesh(1)",!!(1&t))),n+=addHtmlValue("描述",addLinkConditional(currentMesh.desc&&""!=currentMesh.desc?EscapeHtml(currentMesh.desc):"<i>沒有</i>","p20editmesh(2)",!!(1&t))),n+=addHtmlValue("類型",e),(3==currentMesh.mtype||4==currentMesh.mtype)&&null!=currentMesh.relayid){var o="<i>未知</i>",i=getNodeFromId(currentMesh.relayid);null!=i&&(o=EscapeHtml(i.name)),n+=addHtmlValue("繼電器裝置",addLinkConditional(o,"p20editmeshrelay()",!!(1&t)))}4==currentMesh.mtype&&(n+=addHtmlValue("主機名",currentMesh.kvm.host),n+=addHtmlValue("用戶名",currentMesh.kvm.user)),n+='<br><input type=button value="筆記" onclick=showNotes(false,"'+encodeURIComponent(currentMesh._id)+'") />',n+="<br style=clear:both><br>";var a=currentMesh.links[userinfo._id];a&&2&a.rights&&(n+="<div style=margin-bottom:6px;float:left;margin-right:10px><a onclick=p20showAddMeshUserDialog() style=cursor:pointer><img src=images/icon-addnew.png border=0 height=12 width=12> 新增用戶</a></div>"),navigator.userAgent.toLowerCase().indexOf("android")>=0&&(n+="<div style=margin-bottom:6px;float:left;margin-right:10px><a onclick=p20installAndroidDialog() style=cursor:pointer><img src=images/icon-addnew.png border=0 height=12 width=12> 在此設備上安裝</a></div>"),n+='<table style="color:black;background-color:#EEE;border-color:#AAA;border-width:1px;border-style:solid;border-collapse:collapse" border=0 cellpadding=2 cellspacing=0 width=100%><tbody><tr style=background-color:#AAAAAA;font-weight:bold><th scope=col style=text-align:left;width:430px>用戶授權</th></tr>';var s=1,l=[];for(var r in currentMesh.links){var d=r.split("/")[2];currentMesh.links[r].name&&(d=currentMesh.links[r].name),r==userinfo._id&&(d=userinfo.name),null!=usergroups&&null!=usergroups[r]&&(d=usergroups[r].name),l.push({id:r,name:d,rights:currentMesh.links[r].rights})}for(var r in l.sort(function(e,t){return e.name>t.name?1:e.name<t.name?-1:0}),l){var u="",c="部分權限",p=l[r].rights,m=2;4294967295==p?c="完整管理員":0==p&&(c="沒有權利"),r!=userinfo._id&&(4294967295==t||2&t)&&(u='<a onclick=p20deleteUser(event,"'+encodeURIComponent(l[r].id)+'") style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'),l[r].id.startsWith("ugrp/")&&(m=4),n+='<tr onclick=p20viewuser("'+encodeURIComponent(l[r].id)+'") style=height:32px;cursor:pointer'+(s%2==0?";background-color:#DDD":"")+"><td>",n+="<div style=float:right>"+u+"</div><div style=float:right;padding-right:4px>"+c+"</div><div class=m"+m+"></div><div>&nbsp;"+EscapeHtml(decodeURIComponent(l[r].name))+"<div></div></div>",n+="</td></tr>",++s}n+="</tbody></table>",4294967295==t&&(n+="<div style=font-size:small;text-align:right;margin-top:6px><span><a onclick=p20showDeleteMeshDialog() style=cursor:pointer>刪除群組</a></span></div>"),QH("p20info",n)}}function p20showDeleteMeshDialog(){if(xxdialogMode)return!1;var e=format("你確定要刪除群{0}嗎？刪除裝置群還將刪除該群中有關裝置的所有訊息。",EscapeHtml(currentMesh.name))+"<br /><br />";return setDialogMode(2,"刪除群組",3,p20showDeleteMeshDialogEx,e+="<label><input id=p20check type=checkbox onchange=p20validateDeleteMeshDialog() />確認</label>"),p20validateDeleteMeshDialog(),!1}function p20validateDeleteMeshDialog(){QE("idx_dlgOkButton",Q("p20check").checked)}function p20showDeleteMeshDialogEx(e,t){meshserver.send({action:"deletemesh",meshid:currentMesh._id,meshname:currentMesh.name})}function p20editmeshrelay(){if(!xxdialogMode){var e=[];if(!(2&features))for(var t in nodes){var n=nodes[t];2==n.mtype&&null!=n.agent&&4294967295==GetNodeRights(n)&&e.push(n)}if(e.sort(nameSort),0==e.length)setDialogMode(2,"編輯裝置群",1,null,"沒有可用的中繼設備。");else{var o=[];for(var t in e)o.push('<option value="'+e[t]._id+'"'+(currentMesh.relayid==e[t]._id?" selected":"")+">"+EscapeHtml(e[t].name)+"</option>");setDialogMode(2,"編輯裝置群",3,p20editmeshrelayEx,addHtmlValue("繼電器裝置","<div style=width:170px><select id=d2devrelay style=width:100%>"+o.join("")+"</select></div>"))}}}function p20editmeshrelayEx(){meshserver.send({action:"editmesh",meshid:currentMesh._id,relayid:Q("d2devrelay").value})}function p20editmesh(e){if(!xxdialogMode){var t=addHtmlValue("名稱","<input id=dp20meshname style=width:170px maxlength=32 onchange=p20editmeshValidate() onkeyup=p20editmeshValidate() />");setDialogMode(2,"編輯裝置群",3,p20editmeshEx,t+=addHtmlValue("描述","<input id=dp20meshdesc style=width:170px maxlength=1024 onkeyup=p20editmeshValidate() />")),Q("dp20meshname").value=currentMesh.name,currentMesh.desc&&(Q("dp20meshdesc").value=currentMesh.desc),p20editmeshValidate(),2==e?Q("dp20meshdesc").focus():Q("dp20meshname").focus()}}function p20editmeshEx(){meshserver.send({action:"editmesh",meshid:currentMesh._id,meshname:Q("dp20meshname").value,desc:Q("dp20meshdesc").value})}function p20editmeshValidate(){QE("idx_dlgOkButton",Q("dp20meshname").value.length>0)}function p20installAndroidDialog(){if(!xxdialogMode){var e="<div style=text-align:center><p>在您的 Android 設備上安裝 MeshCentral Agent。安裝後，單擊配對鏈接將您的設備連接到此服務器。</p>";e+='<p><a rel="noreferrer noopener" target=_blank href="https://play.google.com/store/apps/details?id=com.meshcentral.agent2"><img style=cursor:pointer src="images/google-play-140.png" width=140 srcset="images/google-play-280.png 2x" /></a></p>',e+='<p><a rel="noreferrer noopener" target=_blank href="https://www.amazon.co.uk/gp/product/B097Z4Q7SK/"><img style=cursor:pointer src="images/amazon-appstore-140.png"  width=140 srcset="images/amazon-appstore-280.png 2x" /></a></p>',e+='<p><a rel="noreferrer noopener" target=_blank href="meshagents?id=14'+(urlargs.key?"&key="+urlargs.key:"")+'" title="APK version of the MeshAgent">Android APK</a></p>',setDialogMode(2,"安卓安裝",1,null,e+='<p><a href="'+serverinfo.magenturl+","+serverinfo.agentCertHash+","+currentMesh._id.split("/")[2]+'"><b>設備配對鏈接</b></a></p></div>')}}function p20showAddMeshUserDialog(){if(!xxdialogMode){var e=addHtmlValue("User ID","<input id=dp20username style=width:170px maxlength=256 onchange=p20validateAddMeshUserDialog() onkeyup=p20validateAddMeshUserDialog() />");e+='<div style="border:2px groove gray;background-color:white;max-height:120px;overflow-y:scroll">',e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20fulladmin>完整管理員</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20editmesh>編輯裝置群</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20manageusers>管理裝置群用戶</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20managecomputers>管理裝置群電腦</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remotecontrol>遙控</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remoteview style=margin-left:12px>僅遠程查看</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remotelimitedinput style=margin-left:12px>僅有限輸入</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20noterminal style=margin-left:12px>不能訪問終端</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20nofiles style=margin-left:12px>不能存取檔案</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20noamt style=margin-left:12px>沒有Intel&reg; AMT</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20meshagentconsole>網格代理控制台</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20meshserverfiles>伺服器檔案</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20wakedevices>喚醒裝置</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20editnotes>編輯裝置筆記</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20limitevents>只顯示自己的事件</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20chatnotify>聊天並通知</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20uninstall>卸載代理</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20commands>遠程命令</label><br>",e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20resetoff>重置/關閉電源</label><br>",setDialogMode(2,"將用戶新增到裝置群",3,p20showAddMeshUserDialogEx,e+="</div>"),p20validateAddMeshUserDialog(),Q("dp20username").focus()}}function p20validateAddMeshUserDialog(){var e=GetMeshRights(currentMesh),t=!Q("p20fulladmin").checked;QE("p20fulladmin",4294967295==e),QE("p20editmesh",t&&4294967295==e),QE("p20manageusers",t),QE("p20managecomputers",t),QE("p20remotecontrol",t),QE("p20meshagentconsole",t),QE("p20meshserverfiles",t),QE("p20wakedevices",t),QE("p20editnotes",t),QE("p20limitevents",t),QE("p20remoteview",t&&Q("p20remotecontrol").checked),QE("p20remotelimitedinput",t&&Q("p20remotecontrol").checked&&!Q("p20remoteview").checked),QE("p20noterminal",t&&Q("p20remotecontrol").checked),QE("p20nofiles",t&&Q("p20remotecontrol").checked),QE("p20noamt",t&&Q("p20remotecontrol").checked),QE("p20chatnotify",t),QE("p20uninstall",t),QE("p20commands",t),QE("p20resetoff",t)}function p20showAddMeshUserDialogEx(){var e=0;1==Q("p20fulladmin").checked?e=4294967295:(1==Q("p20editmesh").checked&&(e+=1),1==Q("p20manageusers").checked&&(e+=2),1==Q("p20managecomputers").checked&&(e+=4),1==Q("p20remotecontrol").checked&&(e+=8),1==Q("p20meshagentconsole").checked&&(e+=16),1==Q("p20meshserverfiles").checked&&(e+=32),1==Q("p20wakedevices").checked&&(e+=64),1==Q("p20editnotes").checked&&(e+=128),1==Q("p20remoteview").checked&&(e+=256),1==Q("p20noterminal").checked&&(e+=512),1==Q("p20nofiles").checked&&(e+=1024),1==Q("p20noamt").checked&&(e+=2048),1==Q("p20remotelimitedinput").checked&&(e+=4096),1==Q("p20limitevents").checked&&(e+=8192),1==Q("p20chatnotify").checked&&(e+=16384),1==Q("p20uninstall").checked&&(e+=32768),1==Q("p20commands").checked&&(e+=131072),1==Q("p20resetoff").checked&&(e+=262144));var t=Q("dp20username").value.split(","),n=[];for(var o in t)n.push(t[o].trim());meshserver.send({action:"addmeshuser",meshid:currentMesh._id,meshname:currentMesh.name,usernames:n,meshadmin:e})}function p20viewuser(e){if(!xxdialogMode){e=decodeURIComponent(e);var t=[],n=GetMeshRights(currentMesh),o=GetMeshRights(currentMesh,e);4294967295==o?t.push("完整管理員"):(1&o&&t.push("編輯裝置群"),2&o&&t.push("管理裝置群用戶"),4&o&&t.push("管理裝置群電腦"),8&o&&t.push("遙控"),16&o&&t.push("代理控制台"),32&o&&t.push("伺服器檔案"),64&o&&t.push("喚醒裝置"),128&o&&t.push("編輯筆記"),256&o&&t.push("僅遠程查看"),512&o&&t.push("沒有終端"),1024&o&&t.push("沒有檔案"),2048&o&&t.push("沒有Intel&reg; AMT"),8&o&&4096&o&&!(256&o)&&t.push("有限輸入"),8192&o&&t.push("僅自我事件"),16384&o&&t.push("聊天並通知"),32768&o&&t.push("卸載"),131072&o&&t.push("指令"),262144&o&&t.push("重置/關閉")),0==t.length&&t.push("沒有權利");var i=1,a=e.split("/")[2];currentMesh.links[e].name&&(a=currentMesh.links[e].name);var s=addHtmlValue("用戶名",EscapeHtml(a));a!=e.split("/")[2]&&(s+=addHtmlValue("用戶識別碼",EscapeHtml(e.split("/")[2]))),s+=addHtmlValue("權限",t.join("，")),userinfo._id!=e&&(4294967295==n||2&n&&4294967295!=o)&&(i+=4),setDialogMode(2,"裝置群用戶",i,p20viewuserEx,s,e)}}function p20viewuserEx(e,t){if(2==e){var n=t.split("/")[2];users&&users[t]&&(n=users[t].name),usergroups&&usergroups[t]&&(n=usergroups[t].name),userinfo._id==t&&(n=userinfo.name),setDialogMode(2,"遠程網格用戶",3,p20viewuserEx2,format("確認刪除用戶{0}？",n),t)}}function p20deleteUser(e,t){haltEvent(e),p20viewuserEx(2,decodeURIComponent(t))}function p20viewuserEx2(e,t){meshserver.send({action:"removemeshuser",meshid:currentMesh._id,meshname:currentMesh.name,userid:t})}var notifications=[];function clickNotificationIcon(e){1==e?QV("notifiyBox",!0):0==e?QV("notifiyBox",!1):QV("notifiyBox","none"==QS("notifiyBox").display),drawNotifications()}function setNotificationCount(e){parseInt(Q("notificationCount").innerHTML)!=e&&(QH("notificationCount2",e),QV("notificationCount",e>0))}function drawNotifications(){var e=getstore("notifications",0),t="";if(0==notifications.length)t="<div style=margin:5px>目前沒有任何通知</div>";else for(var n in notifications){var o=notifications[n],i="",a=new Date(o.time),s=0;if(null!=o.title&&(i="<b>"+EscapeHtml(o.title)+"</b>: "),null!=o.nodeid){var l=getNodeFromId(o.nodeid);null!=l&&(s=l.icon,i=16&e?"<b>"+EscapeHtml(meshes[l.meshid].name)+" / "+EscapeHtml(l.name)+"</b>: ":"<b>"+EscapeHtml(l.name)+"</b>: ")}t+='<div title="'+format("發生在{0}",printDateTime(a))+'" id="notifyx'+o.id+'" class=notification style="cursor:pointer;border-top:1px solid '+(""==t?"transparent":"orange")+'">',s&&(t+="<div class=j"+s+' onclick="notificationSelected('+o.id+')" style=margin:5px;float:left></div>'),t+='<div onclick="notificationDelete('+o.id+')" class=unselectable title="清除此通知" style=margin:5px;float:right;color:orange><b>X</b></div><div onclick="notificationSelected('+o.id+')" style=margin:5px>'+i+EscapeHtml(o.text)+"</div><div style=margin-left:5px;margin-bottom:5px;color:gray;font-size:10px>"+printDateTime(a)+"</div></div>"}var r="";notifications.length>1&&(r='<div id="notifyRemoveAll" onclick="deleteAllNotifications()" style="cursor:pointer;border-top:1px solid orange;margin:5px;color:orange;text-align:right;padding-right:3px">全部清除</div>'),QH("notifiyBox",'<div class=customScroll style="max-height:170px;overflow-y:auto;margin:5px">'+t+r+"</div>")}function notificationSelected(e,t){var n=-1;for(var o in notifications)notifications[o].id==e&&(n=o);-1!=n&&(notificationSelectedEx(notifications[n],e),t&&notifications[n]&&(notifications[n].notification&&(notifications[n].notification.close(),delete notifications[n].notification),notificationDelete(e)))}function notificationSelectedEx(e,t){null!=e.nodeid?"desktop"==e.tag?gotoDevice(e.nodeid,12):"terminal"==e.tag?gotoDevice(e.nodeid,11):"files"==e.tag?gotoDevice(e.nodeid,13):"intelamt"==e.tag?gotoDevice(e.nodeid,14):"console"==e.tag?gotoDevice(e.nodeid,15):gotoDevice(e.nodeid,10):"backupcodes"!=e.tag||xxdialogMode?null!=e.tag&&e.tag.startsWith("meshmessenger/")?(safeNewWindow("/messenger?id="+e.tag+"&title="+encodeURIComponentEx(e.username),e.tag.split("/")[2]),notificationDelete(t)):null!=e.url&&(safeNewWindow(e.url),notificationDelete(t)):(account_manageOtp(0),notificationDelete(t))}function notificationDelete(e){var t=-1,n=Q("notifyx"+e);if(null!=n){for(var o in notifications)notifications[o].id==e&&(t=o);if(-1!=t&&(meshserver.send({action:"intersession",subaction:"removeNotify",id:e}),notifications[t].notification&&(notifications[t].notification.close(),delete notifications[t].notification),notifications.splice(t,1),n.parentNode.removeChild(n),setNotificationCount(notifications.length),0==notifications.length&&QV("notifiyBox",!1),1==notifications.length&&QV("notifyRemoveAll",!1),notifications.length>0&&0==t)){var i=notifications[0];QS("notifyx"+i.id)["border-top"]="1px solid transparent"}}}function addNotification(e){if("number"==typeof e.titleid)try{e.title=[null,"新賬戶","服務器限制","安全警告","帳號設定","裝置群","邀請碼"][e.titleid]}catch(e){}if("number"==typeof e.msgid)try{e.text=[null,"沒有權限","無效的用戶名","無效的密碼","不合規電郵","無效域","無效的網站權限","用戶已存在","此模式下無法添加用戶","驗證異常","達到帳戶限制。","聊天請求，點擊這裡接受。","自上次登錄以來，此帳戶有 {0} 次登錄嘗試失敗。","更改電子郵件地址失敗，另一個帳戶已在使用：{0}。","電郵已發送。","未找到用戶 {0}。","未找到用戶 {0}。","錯誤，無法更改為以前使用的密碼。","錯誤，無法更改為常用密碼。","錯誤，密碼未更改。","密碼已更改。","當前密碼不正確。",'錯誤，邀請碼 "{0}" 已在使用中。',"短信網關未啟用","沒有用戶管理權限","短信無效","沒有此用戶的電話號碼","短信成功發送。","短信錯誤","短信錯誤：{0}",'不允許使用電子郵件域 "{0}"。只允許 ({1})'][e.msgid],Array.isArray(e.args)&&(e.text=format(e.text,e.args[0],e.args[1],e.args[2],e.args[3],e.args[4],e.args[5]))}catch(e){}null==e.time&&(e.time=Date.now()),null==e.id&&(e.id=Math.random()),notifications.unshift(e),setNotificationCount(notifications.length),clickNotificationIcon(!0);var t=getstore("notifications",0);1&t&&Q("chimes").play();var n=null;if(Notification&&"granted"==Notification.permission){var o=e.text.split("&reg;").join("").split("<b>").join("").split("</b>").join("").split("<br />").join("\r\n");if(e.nodeid){var i=getNodeFromId(e.nodeid);i&&(n=16&t?new Notification(decodeURIComponent("{{{extitle}}}")+" - "+meshes[i.meshid].name+" - "+i.name,{tag:e.tag,body:o,icon:"/images/notify/icons128-"+i.icon+".png"}):new Notification(decodeURIComponent("{{{extitle}}}")+" - "+i.name,{tag:e.tag,body:o,icon:"/images/notify/icons128-"+i.icon+".png"}))}else{null==e.icon&&(e.icon=0);var a=e.title;a=null==a?"":" - "+e.title,n=new Notification(decodeURIComponent("{{{extitle}}}")+a,{tag:e.tag,body:o,icon:"/images/notify/icons128-"+e.icon+".png"})}n.id=e.id,n.xtag=e.tag,n.url=e.url,n.nodeid=e.nodeid,n.username=e.username,n.onclick=function(e){notificationSelected(e.target.id,!0)},e.notification=n}if("number"==typeof e.maxtime&&e.maxtime>0){var s=function e(){notificationDelete(e.xid)};s.xid=e.id,setTimeout(s,1e3*e.maxtime)}}function deleteAllNotifications(){notifications=[],setNotificationCount(0),drawNotifications(),QV("notifiyBox",!1)}var xxdialogMode,xxdialogFunc,xxdialogButtons,xxdialogTag,xxcurrentView=-1;function go(e){if(setSessionActivity(),!xxdialogMode&&xxcurrentView!=e){updateFooterMenu(),setDialogMode(0);for(var t=0;t<32;t++)QV("p"+t,t==e);xxcurrentView=e,updateCurrentUrl()}}function updateCurrentUrl(){if(!(268435456&features)&&xxcurrentView>0){var e="";for(var t in xxcurrentView>=10&&xxcurrentView<=19?null!=currentNode&&(e="?viewmode="+xxcurrentView+"&gotonode="+currentNode._id.split("/")[2]+(currentDevicePanel>0?"&panel="+currentDevicePanel:"")):xxcurrentView>=20&&xxcurrentView<=29?null!=currentMesh&&(e="?viewmode="+xxcurrentView+"&gotomesh="+currentMesh._id.split("/")[2]):xxcurrentView>1&&(e="?viewmode="+xxcurrentView),urlargs)e+=(""==e?"?":"&")+t+"="+urlargs[t];try{window.history.replaceState({},document.title,window.location.pathname+e)}catch(e){}}}function setDialogMode(e,t,n,o,i,a){setSessionActivity(),xxdialogMode=e,xxdialogFunc=o,xxdialogButtons=n,xxdialogTag=a,QE("idx_dlgOkButton",!0),QV("idx_dlgOkButton",1&n),QV("idx_dlgCancelButton",2&n),QV("id_dialogclose",2&n||8&n),QV("idx_dlgDeleteButton",4&n),QV("idx_dlgButtonBar",7&n),t&&QH("id_dialogtitle",t);for(var s=1;s<24;s++)QV("dialog"+s,s==e);QV("dialog",e),i&&(2==e?QH("id_dialogOptions",i):QH("id_dialogMessage",i))}function dialogclose(e){setSessionActivity();var t=xxdialogFunc,n=xxdialogButtons,o=xxdialogTag;setDialogMode(),(8&n||e)&&t&&t(e,o)}function removeUserRights(e,t){if(t!=userinfo._id||null==userinfo.removeRights)return e;var n=0,o=0;return 8&userinfo.removeRights&&(o+=8),65536&userinfo.removeRights&&(n+=65536),256&userinfo.removeRights&&(n+=256),512&userinfo.removeRights&&(n+=512),1024&userinfo.removeRights&&(n+=1024),16&userinfo.removeRights&&(o+=16),32768&userinfo.removeRights&&(o+=32768),131072&userinfo.removeRights&&(o+=131072),64&userinfo.removeRights&&(o+=64),262144&userinfo.removeRights&&(o+=262144),4294967295!=e?(e|=n,e&=4294967295-o):(e=2015471,e|=n,e&=4294967295-o),e}function GetMeshRights(e,t){if(null==e)return 0;if(null==t&&(t=userinfo._id),"string"==typeof e&&(e=meshes[e]),null==e||null==e.links)return 0;if(serverinfo.manageAllDeviceGroups&&t==userinfo._id)return removeUserRights(4294967295,t);var n=0,o=e.links[t];if(null!=o){if(4294967295==o.rights)return removeUserRights(4294967295,t);n=o.rights}var i=null;if(t==userinfo._id?i=userinfo:null!=users&&(i=users[t]),null!=i)for(var a in i.links)if(a.startsWith("ugrp/")&&null!=(o=e.links[a])){if(4294967295==o.rights)return removeUserRights(4294967295,t);n|=o.rights}return removeUserRights(n,t)}function IsMeshViewable(e,t){if(null==e)return!1;if(null==t&&(t=userinfo._id),"string"==typeof e&&(e=meshes[e]),null==e||null==e.links)return!1;if(null!=e.links[t])return!0;if(serverinfo.manageAllDeviceGroups&&t==userinfo._id)return!0;var n=null;if(t==userinfo._id?n=userinfo:null!=users&&(n=users[t]),null!=n)for(var o in n.links)if(o.startsWith("ugrp/")&&null!=e.links[o])return!0;return!1}function GetNodeRights(e,t){if(null==e)return 0;if(null==t&&(t=userinfo._id),"string"==typeof e&&null==(e=getNodeFromId(e)))return 0;var n=GetMeshRights(e.meshid,t);if(4294967295==n)return removeUserRights(n,t);if(null!=e.links&&null!=e.links[t]&&(n|=e.links[t].rights),null!=e.links&&null!=userinfo.links)for(var o in e.links)o.startsWith("ugrp/")&&null!=userinfo.links[o]&&null!=e.links[o].rights&&(n|=e.links[o].rights);return removeUserRights(n,t)}function IsNodeViewable(e,t){if(null==e)return!1;if(null==t&&(t=userinfo._id),"string"==typeof e&&null==(e=getNodeFromId(e)))return!1;if(IsMeshViewable(e.meshid,t))return!0;if(null!=e.links&&null!=e.links[t])return!0;if(null!=e.links&&null!=userinfo.links)for(var n in e.links)if(n.startsWith("ugrp/")&&null!=userinfo.links[n]&&null!=e.links[n].rights)return!0;return!1}function nameSort(e,t){var n=e.name.toLowerCase(),o=t.name.toLowerCase();return sortCollator.compare(n,o)}function getNodeAmtVersion(e){if(null==e||null==e.intelamt||"string"!=typeof e.intelamt.ver)return 0;var t=e.intelamt.ver.split(".");return t.length<2?0:parseInt(t[0])+parseInt(t[1])/100}function putstore(e,t){try{if("undefined"==typeof localStorage||localStorage.getItem(e)==t)return;null==t?localStorage.removeItem(e):localStorage.setItem(e,t)}catch(e){}if("_"!=e[0]){for(var n={},o=0,i=localStorage.length;o<i;++o){var a=localStorage.key(o);"_"!=a[0]&&(n[a]=localStorage.getItem(a))}meshserver.send({action:"userWebState",state:JSON.stringify(n)})}}function getstore(e,t){try{if("undefined"==typeof localStorage)return t;var n=localStorage.getItem(e);return null==n||null==n?t:n}catch(e){return t}}function center(){xtermfit&&xtermfit.fit(),onDevicesScroll(),QS("dialog").left=(getDocWidth()-300)/2+"px",deskAdjust(),null!=currentNode&&drawDeviceTimeline()}function messagebox(e,t){QH("id_dialogMessage",t),setDialogMode(1,e,1)}function statusbox(e,t){QH("id_dialogMessage",t),setDialogMode(1,e)}function getDocWidth(){return window.innerWidth?window.innerWidth:document.documentElement&&document.documentElement.clientWidth&&0!=document.documentElement.clientWidth?document.documentElement.clientWidth:document.getElementsByTagName("body")[0].clientWidth}function haltEvent(e){return e.preventDefault&&e.preventDefault(),e.stopPropagation&&e.stopPropagation(),!1}function haltReturn(e){13==e.keyCode&&haltEvent(e)}function validateEmail(e){return/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)}function reload(){window.location.href=window.location.href}function getNodeFromId(e){for(var t in nodes)if(nodes[t]._id==e)return nodes[t];return null}function addHtmlValue(e,t){return"<table><td style=width:120px>"+e+"<td><b>"+t+"</b></table>"}function addHtmlValue2(e,t){return"<div><div style=display:inline-block;float:right>"+t+"</div><div style=display:inline-block>"+e+"</div></div>"}function addHtmlValue4(e,t){return"<table style=width:100%><td style=width:120px>"+e+"<td style=text-align:right><b>"+t+"</b></table>"}function addLink(e,t){return"<a style=cursor:pointer;text-decoration:none onclick='"+t+"'>&diams; "+e+"</a>"}function addLinkConditional(e,t,n){return n?addLink(e,t):e}function addKeyLink(e,t){return"<span tabindex=0 style=cursor:pointer;text-decoration:none onclick="+t+" onkeypress=\"if (event.key=='Enter') { "+t+' } ">'+e+" <img class=hoverButton src=images/key16.png></span>"}function addKeyLinkConditional(e,t,n){return n?"<span title='"+t+"'>"+e+" <img class=hoverButton src=images/key16.png></span>":e}function passwordcheck(e){return/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()]).{8,}/.test(e)}function getFileSizeStr(e){return"number"!=typeof e&&(e=0),1==e?"1個位元組":format("{0} bytes",e)}function focusTextBox(e){setTimeout(function(){Q(e).selectionStart=Q(e).selectionEnd=65535,Q(e).focus()},0)}isFilenameValid=function(){var e=/^[^\\/:\*\?"<>\|]+$/,t=/^\./,n=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i;return function(o){return e.test(o)&&!t.test(o)&&!n.test(o)&&"."!=o[0]}}();function printDate(e){return e.toLocaleDateString(args.locale)}function printTime(e){return e.toLocaleTimeString(args.locale)}function printDateTime(e){return e.toLocaleString(args.locale)}function printTimer(e){return zeroPad(Math.floor(e/3600),2)+":"+zeroPad(Math.floor(e/60)%60,2)+":"+zeroPad(e%60,2)}function format(e){var t=Array.prototype.slice.call(arguments,1);return e.replace(/{(\d+)}/g,function(e,n){return void 0!==t[n]?t[n]:e})}function nobreak(e){return e.split(" ").join("&nbsp;")}function getUserName(e){var t=e.split("/"),n=t[0]+"/"+t[1]+"/"+t[2],o="";if(4==t.length&&t[3].startsWith("guest:")&&(o=" - "+decode_utf8(atob(t[3].substring(6)))),users&&null!=users[n])return null!=users[n].realname?users[n].realname+o:users[n].name+o;if(currentNode&&currentNode.links&&currentNode.links[e]&&null!=currentNode.links[e].name)return currentNode.links[e].name+o;if(e==userinfo._id)return userinfo.name+o;if(nodes)for(var i in nodes)if(nodes[i].links)for(var a in nodes[i].links)if(nodes[i].links[a].name&&a==e)return nodes[i].links[a].name+o;if(meshes)for(var i in meshes)if(meshes[i].links)for(var a in meshes[i].links)if(meshes[i].links[a].name&&a==e)return meshes[i].links[a].name+o;return t[2]+o}function addDetailItem(e,t,n){return"<table style=width:100%><td>"+nobreak(e)+"<td style=text-align:right>"+t+"</table>"}function isPrivateIP(e){return e.startsWith("10.")||e.startsWith("172.16.")||e.startsWith("192.168.")}function encodeURIComponentEx(e){return encodeURIComponent(e).replace(/'/g,"%27")}function safeNewWindow(e,t){var n=window.open(e,t,"noopener,noreferrer");n&&(n.opener=null)}function isWindowsNode(e){return 2==e.mtype&&null!=e.agent&&null!=e.agent.id&&[1,2,3,4,21,22,34,42,43].indexOf(e.agent.id)>=0}</script>