-
Notifications
You must be signed in to change notification settings - Fork 0
/
angular-filemanager.min.js
6 lines (6 loc) · 177 KB
/
angular-filemanager.min.js
1
2
3
4
5
6
!function(e,n,i){"use strict";n.module("FileManagerApp",["pascalprecht.translate","ngFileUpload"]),i(e.document).on("shown.bs.modal",".modal",function(){e.setTimeout(function(){i("[autofocus]",this).focus()}.bind(this),100)}),i(e.document).on("click",function(){i("#context-menu").hide()}),i(e.document).on("contextmenu",'.main-navigation .table-files tr.item-list:has("td"), .item-list',function(n){var t=i("#context-menu");n.pageX>=e.innerWidth-t.width()&&(n.pageX-=t.width()),n.pageY>=e.innerHeight-t.height()&&(n.pageY-=t.height()),t.hide().css({left:n.pageX,top:n.pageY}).appendTo("body").show(),n.preventDefault()}),Array.prototype.find||(Array.prototype.find=function(e){if(null==this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var n,i=Object(this),t=i.length>>>0,r=arguments[1],a=0;a<t;a++)if(n=i[a],e.call(r,n,a,i))return n})}(window,angular,jQuery),function(e,n){"use strict";e.module("FileManagerApp").controller("FileManagerCtrl",["$scope","$rootScope","$window","$translate","$interval","fileManagerConfig","item","fileNavigator","apiMiddleware","cogradient",function(e,i,t,r,a,s,o,l,d,c){function p(){for(var e=navigator.userAgent,n=new Array("Android","iPhone","SymbianOS","Windows Phone","iPad","iPod"),i=!0,t=0;t<n.length;t++)if(e.indexOf(n[t])>0){i=!1;break}return i}var m=t.localStorage;e.config=s,e.reverse=!1,e.predicate=["model.type","model.name"],e.order=function(n){e.reverse=e.predicate[1]===n&&!e.reverse,e.predicate[1]=n},e.query="",e.fileNavigator=new l,e.apiMiddleware=new d,e.cogradient=new c,e.uploadFileList=[],e.viewTemplate=m.getItem("viewTemplate")||"main-icons.html",e.fileList=[],e.temps=[],e.historyTask=[],e.isPc=p(),e.selectIndex=void 0,e.isShowStatus=!1,e.$watch("temps",function(){e.singleSelection()?e.temp=e.singleSelection():(e.temp=new o({rights:644}),e.temp.multiple=!0),e.temp.revert()}),e.fileNavigator.onRefresh=function(){e.temps=[],e.query="",e.selectIndex=void 0,i.selectedModalPath=e.fileNavigator.currentPath},e.setTemplate=function(n){m.setItem("viewTemplate",n),e.viewTemplate=n},e.changeLanguage=function(e){return e?(m.setItem("language",e),r.use(e)):void r.use(m.getItem("language")||s.defaultLang)},e.isSelected=function(n){return e.temps.indexOf(n)!==-1},e.showContextMenuInMobile=function(i){i.stopPropagation();var t=n("#context-menu"),r=n(".main-navigation .main-item")[e.selectIndex],a=r.getBoundingClientRect();t.hide().css({left:a.left+30,top:a.top+20}).appendTo("body").show()},e.clickContainer=function(){n("#context-menu").hide()},e.selectOrUnselect=function(n,i,t){var r=e.temps.indexOf(n),a=i&&3==i.which;if(i&&i.target.hasAttribute("prevent"))return void(e.temps=[]);if(!(!n||a&&e.isSelected(n))){if(i&&i.shiftKey&&!a){var s=e.fileList,o=s.indexOf(n),l=e.temps[0],d=s.indexOf(l),c=void 0;if(l&&s.indexOf(l)<o){for(e.temps=[];d<=o;)c=s[d],!e.isSelected(c)&&e.temps.push(c),d++;return}if(l&&s.indexOf(l)>o){for(e.temps=[];d>=o;)c=s[d],!e.isSelected(c)&&e.temps.push(c),d--;return}}if(i&&!a&&(i.ctrlKey||i.metaKey))return void(e.isSelected(n)?e.temps.splice(r,1):e.temps.push(n));a||e.isPc||(e.selectIndex=t),e.temps=[n]}},e.singleSelection=function(){return 1===e.temps.length&&e.temps[0]},e.totalSelecteds=function(){return{total:e.temps.length}},e.selectionHas=function(n){return e.temps.find(function(e){return e&&e.model.type===n})},e.prepareNewFolder=function(){var n=new o(null,e.fileNavigator.currentPath);return e.temps=[n],n},e.smartClick=function(n){var i=e.config.allowedActions.pickFiles;if(n.isFolder())return e.fileNavigator.folderClick(n);if("function"==typeof e.config.pickCallback&&i){var t=e.config.pickCallback(n.model);if(t===!0)return}return n.isImage()?e.config.previewImagesInModal?e.openImagePreview(n):e.apiMiddleware.download(n,!0):n.isVideo()?e.config.previewVideosInModal?e.openVideoPreview(n):e.apiMiddleware.download(n,!0):n.isEditable()?e.openEditItem(n):void 0},e.openImagePreview=function(){var n=e.singleSelection();e.apiMiddleware.apiHandler.inprocess=!0,e.modal("imagepreview",null,!0).find("#imagepreview-target").attr("src",e.apiMiddleware.getUrl(n)).unbind("load error").on("load error",function(){e.apiMiddleware.apiHandler.inprocess=!1,e.$apply()})},e.openVideoPreview=function(){var n=e.singleSelection();e.apiMiddleware.apiHandler.inprocess=!0;var i=e.apiMiddleware.getUrl(n),t=i.lastIndexOf("."),r=i.length,a=i.substring(t+1,r),s=a.toLocaleLowerCase();if("mp4"==s)e.modal("videopreview",null,!0).find("#videopreview-target").attr("controls","controls").attr("autoplay","autoplay").attr("preload","auto").attr("src",i).unbind("load error").on("load error",function(){e.apiMiddleware.apiHandler.inprocess=!1,e.$apply()});else{var o="/files";i=i.slice(o.length),/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)?window.open("vlc://"+window.location.href+e.apiMiddleware.getUrl(n).slice(1)):(i="/res-video?path="+i+"&transcode=chromecast",e.modal("videopreview",null,!0).find("#videopreview-target").attr("controls","controls").attr("autoplay","autoplay").attr("preload","auto").attr("src",i).unbind("load error").on("load error",function(){e.apiMiddleware.apiHandler.inprocess=!1,e.$apply()}))}},e.openEditItem=function(){var n=e.singleSelection();e.apiMiddleware.getContent(n).then(function(e){n.tempModel.content=n.model.content=e.result}),e.modal("edit")},e.modal=function(i,t,r){var a=n("#"+i);return a.modal(t?"hide":"show"),e.apiMiddleware.apiHandler.error="",e.apiMiddleware.apiHandler.asyncSuccess=!1,!r||a},e.modalWithPathSelector=function(n){return i.selectedModalPath=e.fileNavigator.currentPath,e.modal(n)},e.isInThisPath=function(n){var i=e.fileNavigator.currentPath.join("/")+"/";return i.indexOf(n+"/")!==-1},e.isRootPath=function(){return!(!e.fileNavigator.currentPath||0!=e.fileNavigator.currentPath.length)},e.edit=function(){e.apiMiddleware.edit(e.singleSelection()).then(function(){e.modal("edit",!0)})},e.changePermissions=function(){e.apiMiddleware.changePermissions(e.temps,e.temp).then(function(){e.fileNavigator.refresh(),e.modal("changepermissions",!0)})},e.download=function(){var n=e.singleSelection();if(!e.selectionHas("dir"))return n?e.apiMiddleware.download(n):e.apiMiddleware.downloadMultiple(e.temps)},e.copy=function(){var n=e.singleSelection();if(n){var t=n.tempModel.name.trim(),a=e.fileNavigator.fileNameExists(t);if(a&&u(n))return e.apiMiddleware.apiHandler.error=r.instant("error_invalid_filename"),!1;if(!t)return e.apiMiddleware.apiHandler.error=r.instant("error_invalid_filename"),!1}e.apiMiddleware.copy(e.temps,i.selectedModalPath).then(function(){e.fileNavigator.refresh(),e.modal("copy",!0)})},e.compress=function(){var n=e.temp.tempModel.name.trim(),t=e.fileNavigator.fileNameExists(n);return t&&u(e.temp)?(e.apiMiddleware.apiHandler.error=r.instant("error_invalid_filename"),!1):n?void e.apiMiddleware.compress(e.temps,n,i.selectedModalPath).then(function(){return e.fileNavigator.refresh(),e.config.compressAsync?void(e.apiMiddleware.apiHandler.asyncSuccess=!0):e.modal("compress",!0)},function(){e.apiMiddleware.apiHandler.asyncSuccess=!1}):(e.apiMiddleware.apiHandler.error=r.instant("error_invalid_filename"),!1)},e.extract=function(){var n=e.temp,t=e.temp.tempModel.name.trim(),a=e.fileNavigator.fileNameExists(t);return a&&u(e.temp)?(e.apiMiddleware.apiHandler.error=r.instant("error_invalid_filename"),!1):t?void e.apiMiddleware.extract(n,t,i.selectedModalPath).then(function(){return e.fileNavigator.refresh(),e.config.extractAsync?void(e.apiMiddleware.apiHandler.asyncSuccess=!0):e.modal("extract",!0)},function(){e.apiMiddleware.apiHandler.asyncSuccess=!1}):(e.apiMiddleware.apiHandler.error=r.instant("error_invalid_filename"),!1)},e.remove=function(){e.apiMiddleware.remove(e.temps).then(function(){e.fileNavigator.refresh(),e.modal("remove",!0)})},e.move=function(){var n=e.singleSelection()||e.temps[0];return n&&u(n)?(e.apiMiddleware.apiHandler.error=r.instant("error_cannot_move_same_path"),!1):void e.apiMiddleware.move(e.temps,i.selectedModalPath).then(function(){e.fileNavigator.refresh(),e.modal("move",!0)})},e.rsync=function(){var n=e.singleSelection()||e.temps[0];return n&&u(n)?(e.apiMiddleware.apiHandler.error=r.instant("error_cannot_move_same_path"),!1):void e.apiMiddleware.rsync(e.temps,i.selectedModalPath).then(function(){e.fileNavigator.refresh(),e.modal("rsync",!0)})},e.rename=function(){var n=e.singleSelection(),i=n.tempModel.name,t=n.tempModel.path.join("")===n.model.path.join("");return!i||t&&e.fileNavigator.fileNameExists(i)?(e.apiMiddleware.apiHandler.error=r.instant("error_invalid_filename"),!1):void e.apiMiddleware.rename(n).then(function(){e.fileNavigator.refresh(),e.modal("rename",!0)})},e.createFolder=function(){var n=e.singleSelection(),i=n.tempModel.name;return!i||e.fileNavigator.fileNameExists(i)?e.apiMiddleware.apiHandler.error=r.instant("error_invalid_filename"):void e.apiMiddleware.createFolder(n).then(function(){e.fileNavigator.refresh(),e.modal("newfolder",!0)})},e.addForUpload=function(n){e.uploadFileList=e.uploadFileList.concat(n),e.modal("uploadfile")},e.removeFromUpload=function(n){e.uploadFileList.splice(n,1)},e.uploadFiles=function(){e.apiMiddleware.upload(e.uploadFileList,e.fileNavigator.currentPath).then(function(){e.fileNavigator.refresh(),e.uploadFileList=[],e.modal("uploadfile",!0)},function(n){var i=n.result&&n.result.error||r.instant("error_uploading_files");e.apiMiddleware.apiHandler.error=i})};var u=function(e){var n=i.selectedModalPath.join(""),t=e&&e.model.path.join("");return t===n},g=function(e){var n=t.location.search.substr(1).split("&").filter(function(n){return e===n.split("=")[0]});return n[0]&&n[0].split("=")[1]||void 0};e.changeLanguage(g("lang")),e.isWindows="Windows"===g("server"),e.fileNavigator.deviceList=JSON.parse(localStorage.getItem("deviceList")),e.fileNavigator.getCurrentDevices(),e.showSysteminfo=function(){"block"==n("#progress").css("display")&&n("#progress").toggle(),"block"==n("#sync-history").css("display")&&n("#sync-history").toggle(),n("#systeminfo").toggle(),"block"==n("#systeminfo").css("display")&&e.getSys()},e.sysReconfig=function(){window.location.href="/static/config.html"},e.getSys=function(){n.get("/api/routerInfo",function(e){e.result&&(e=e.result),n("#wtcp").text(e.natTcpExternalAddr),n("#wudp").text(e.natUdpExternalAddr),n("#ntcp").text(e.natTcpLocalAddr),n("#nattype").text(e.natType),n("#routerid").html('<a target="_blank" href="http://www.ddnsto.com:5000/desktop.html?ksdev='+e.routerId+'">'+e.routerId+"</a>"),n("#sharePath").text(e.sharePath),n("#userToken").text(e.userToken),n("#version").text(e.version);for(var i="",t=0;t<e.routers.length;t++)e.routers[t].routerId!=e.routerId&&(i+='<ul><li class="info">设备编号:'+e.routers[t].routerId+"</li>",i+='<li class="info">设备名称:'+e.routers[t].name+"</li>",i+='<li class="info">本地设备:'+e.routers[t].useLan+"</li>",i+='<li class="info">P2P类型:'+e.routers[t].p2pType+"</li>",i+='<li class="info">是否直连:'+e.routers[t].useDirect+"</li>",i+='<li class="info">正在连接:'+e.routers[t].isConnect+"</li></ul>");n("#dlist").html(i)}),n.get("/static/version.json",function(e){n("#newversion").text(e.version)}),n.get("/api/createShare",function(e){"string"==typeof e.result&&n("#shareKey").text(e.result)})},e.showProgress=function(){"block"==n("#systeminfo").css("display")&&n("#systeminfo").toggle(),"block"==n("#sync-history").css("display")&&n("#sync-history").toggle(),n("#progress").toggle(),e.cogradient.refreshHistory()},e.showStatus=function(){"block"==n("#progress").css("display")&&n("#progress").toggle(),"block"==n("#systeminfo").css("display")&&n("#systeminfo").toggle(),n("#sync-history").toggle(),e.cogradient.getCurrentDevice(),e.cogradient.refreshList(),"block"==n(".list-history").css("display")?e.timer=a(function(){e.cogradient.refreshList()},5e3):a.cancel(e.timer)},e.selectHistoryList=function(i){"list-history"==i?(e.cogradient.refreshHistory(),a.cancel(e.timer)):(e.timer=a(function(){e.cogradient.refreshList()},5e3),e.cogradient.refreshList()),n(".list-history").toggle(),n(".history-list").toggle()},e.cancelTask=function(n,i){var t=confirm("是否取消同步?");1==t&&e.cogradient.cancelTask(n,i)},e.showDetail=function(n){for(var i=e.cogradient.deviceLists,t=0,r=i.length;t<r;t++)i[t].routerId==n?(i[t].hidden=!i[t].hidden,0==i[t].hidden&&e.cogradient.refreshList(n)):i[t].hidden=!0},e.reSynchro=function(n){var i=n.toPath.split("/");i.splice(i.length-1);var t={action:"rsync",items:["/"+n.fromRouter+n.fromPath],newPath:"/"+n.toRouter+i.join("/")},r=confirm("是否再次同步?");1==r&&(e.cogradient.reloadFile(t),e.showStatus())}}])}(angular,jQuery),function(e){"use strict";e.module("FileManagerApp").controller("ModalFileManagerCtrl",["$scope","$rootScope","fileNavigator",function(e,n,i){e.reverse=!1,e.predicate=["model.type","model.name"],e.fileNavigator=new i,n.selectedModalPath=[],e.order=function(n){e.reverse=e.predicate[1]===n&&!e.reverse,e.predicate[1]=n},e.select=function(i){n.selectedModalPath=i.model.fullPath().split("/").filter(Boolean),e.modal("selector",!0)},e.selectCurrent=function(){n.selectedModalPath=e.fileNavigator.currentPath,e.modal("selector",!0)},e.selectedFilesAreChildOfPath=function(n){var i=n.model.fullPath();return e.temps.find(function(e){var n=e.model.fullPath();if(i==n)return!0})},n.openNavigator=function(n){e.fileNavigator.currentPath=n,e.fileNavigator.refresh(),e.modal("selector")},n.getSelectedPath=function(){var i=n.selectedModalPath.filter(Boolean),t="/"+i.join("/");return e.singleSelection()&&!e.singleSelection().isFolder()&&(t+="/"+e.singleSelection().tempModel.name),t.replace(/\/\//,"/")}}])}(angular),function(e){"use strict";var n=e.module("FileManagerApp");n.directive("angularFilemanager",["$parse","fileManagerConfig",function(e,n){return{restrict:"EA",templateUrl:n.tplPath+"/main.html"}}]),n.directive("ngFile",["$parse",function(e){return{restrict:"A",link:function(n,i,t){var r=e(t.ngFile),a=r.assign;i.bind("change",function(){n.$apply(function(){a(n,i[0].files)})})}}}]),n.directive("ngRightClick",["$parse",function(e){return function(n,i,t){var r=e(t.ngRightClick);i.bind("contextmenu",function(e){n.$apply(function(){e.preventDefault(),r(n,{$event:e})})})}}])}(angular),function(e){"use strict";e.module("FileManagerApp").service("chmod",function(){var e=function(e){if(this.owner=this.getRwxObj(),this.group=this.getRwxObj(),this.others=this.getRwxObj(),e){var n=isNaN(e)?this.convertfromCode(e):this.convertfromOctal(e);if(!n)return this.owner=0,this.group=0,void(this.others=0);this.owner=n.owner,this.group=n.group,this.others=n.others}};return e.prototype.toOctal=function(e,n){var i=[];return["owner","group","others"].forEach(function(e,n){i[n]=this[e].read&&this.octalValues.read||0,i[n]+=this[e].write&&this.octalValues.write||0,i[n]+=this[e].exec&&this.octalValues.exec||0}.bind(this)),(e||"")+i.join("")+(n||"")},e.prototype.toCode=function(e,n){var i=[];return["owner","group","others"].forEach(function(e,n){i[n]=this[e].read&&this.codeValues.read||"-",i[n]+=this[e].write&&this.codeValues.write||"-",i[n]+=this[e].exec&&this.codeValues.exec||"-"}.bind(this)),(e||"")+i.join("")+(n||"")},e.prototype.getRwxObj=function(){return{read:!1,write:!1,exec:!1}},e.prototype.octalValues={read:4,write:2,exec:1},e.prototype.codeValues={read:"r",write:"w",exec:"x"},e.prototype.convertfromCode=function(e){if(e=(""+e).replace(/\s/g,""),e=10===e.length?e.substr(1):e,/^[-rwxts]{9}$/.test(e)){var n=[],i=e.match(/.{1,3}/g);for(var t in i){var r=this.getRwxObj();r.read=/r/.test(i[t]),r.write=/w/.test(i[t]),r.exec=/x|t/.test(i[t]),n.push(r)}return{owner:n[0],group:n[1],others:n[2]}}},e.prototype.convertfromOctal=function(e){if(e=(""+e).replace(/\s/g,""),e=4===e.length?e.substr(1):e,/^[0-7]{3}$/.test(e)){var n=[],i=e.match(/.{1}/g);for(var t in i){var r=this.getRwxObj();r.read=/[4567]/.test(i[t]),r.write=/[2367]/.test(i[t]),r.exec=/[1357]/.test(i[t]),n.push(r)}return{owner:n[0],group:n[1],others:n[2]}}},e})}(angular),function(e){"use strict";e.module("FileManagerApp").factory("item",["fileManagerConfig","chmod",function(n,i){var t=function(n,t){function r(e){var n=(e||"").toString().split(/[- :]/);return new Date(n[0],n[1]-1,n[2],n[3],n[4],n[5])}var a={key:"",name:n&&n.name||"",path:t||[],type:n&&n.type||"file",size:n&&parseInt(n.size||0),date:r(n&&n.date),perms:new i(n&&n.rights),content:n&&n.content||"",recursive:!1,fullPath:function(){var e=this.path.filter(Boolean);return("/"+e.join("/")+"/"+this.name).replace(/\/\//,"/")}};this.error="",this.processing=!1,this.model=e.copy(a),this.tempModel=e.copy(a)};return t.prototype.update=function(){e.extend(this.model,e.copy(this.tempModel))},t.prototype.revert=function(){e.extend(this.tempModel,e.copy(this.model)),this.error=""},t.prototype.isFolder=function(){return"dir"===this.model.type},t.prototype.isEditable=function(){return!this.isFolder()&&n.isEditableFilePattern.test(this.model.name)},t.prototype.isImage=function(){return n.isImageFilePattern.test(this.model.name)},t.prototype.isVideo=function(){return n.isVidoeFilePattern.test(this.model.name)},t.prototype.isCompressible=function(){return this.isFolder()},t.prototype.isExtractable=function(){return!this.isFolder()&&n.isExtractableFilePattern.test(this.model.name)},t.prototype.isSelectable=function(){return this.isFolder()&&n.allowedActions.pickFolders||!this.isFolder()&&n.allowedActions.pickFiles},t}])}(angular),function(e){"use strict";var n=e.module("FileManagerApp");n.filter("strLimit",["$filter",function(e){return function(n,i,t){return n.length<=i?n:e("limitTo")(n,i)+(t||"...")}}]),n.filter("fileExtension",["$filter",function(e){return function(n){return/\./.test(n)&&e("strLimit")(n.split(".").pop(),3,"..")||""}}]),n.filter("formatDate",["$filter",function(){return function(e){return e instanceof Date?e.toISOString().substring(0,19).replace("T"," "):(e.toLocaleString||e.toString).apply(e)}}]),n.filter("humanReadableFileSize",["$filter","fileManagerConfig",function(e,n){var i=[" kB"," MB"," GB"," TB","PB","EB","ZB","YB"],t=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"];return function(e){var r=-1,a=e;do a/=1024,r++;while(a>1024);var s=n.useBinarySizePrefixes?t[r]:i[r];return Math.max(a,.1).toFixed(1)+" "+s}}]),n.filter("formatName",["$filter",function(){return function(e){var n=e.split("/");return n[n.length-1]}}]),n.filter("formatKB",["$filter",function(){return function(e){return parseInt(e/1024*8)}}])}(angular),function(e){"use strict";e.module("FileManagerApp").provider("fileManagerConfig",function(){var n={appName:"angular-filemanager v1.5",defaultLang:"zh_cn",listUrl:"bridges/php/handler.php",uploadUrl:"bridges/php/handler.php",renameUrl:"bridges/php/handler.php",copyUrl:"bridges/php/handler.php",moveUrl:"bridges/php/handler.php",rsyncUrl:"api/bisync/rsyncCompat",removeUrl:"bridges/php/handler.php",editUrl:"bridges/php/handler.php",getContentUrl:"bridges/php/handler.php",createFolderUrl:"bridges/php/handler.php",downloadFileUrl:"bridges/php/handler.php",downloadMultipleUrl:"bridges/php/handler.php",compressUrl:"bridges/php/handler.php",extractUrl:"bridges/php/handler.php",permissionsUrl:"bridges/php/handler.php",historyTaskUrl:"api/historyTask",listTaskUrl:"api/listTask",routerInfoUrl:"api/routerInfo",cancelTaskUrl:"api/cancelTask",reloadFileUrl:"bridges/php/handler.php",setConfigUrl:"api/config",basePath:"/",searchForm:!0,sidebar:!0,breadcrumb:!0,allowedActions:{upload:!0,rename:!0,move:!0,rsync:!0,copy:!0,edit:!0,changePermissions:!0,compress:!0,compressChooseName:!0,extract:!0,download:!0,downloadMultiple:!0,preview:!0,remove:!0,createFolder:!0,pickFiles:!1,pickFolders:!1},multipleDownloadFileName:"angular-filemanager.zip",filterFileExtensions:[],showExtensionIcons:!0,showSizeForDirectories:!1,useBinarySizePrefixes:!1,downloadFilesByAjax:!0,previewImagesInModal:!0,previewVideosInModal:!0,enablePermissionsRecursive:!0,compressAsync:!1,extractAsync:!1,pickCallback:null,isEditableFilePattern:/\.(txt|diff?|patch|svg|asc|cnf|cfg|conf|html?|.html|cfm|cgi|aspx?|ini|pl|py|md|css|cs|js|jsp|log|htaccess|htpasswd|gitignore|gitattributes|env|json|atom|eml|rss|markdown|sql|xml|xslt?|sh|rb|as|bat|cmd|cob|for|ftn|frm|frx|inc|lisp|scm|coffee|php[3-6]?|java|c|cbl|go|h|scala|vb|tmpl|lock|go|yml|yaml|tsv|lst)$/i,isImageFilePattern:/\.(jpe?g|gif|bmp|png|svg|tiff?)$/i,isVidoeFilePattern:/\.(mp4|mkv|ogg|mp3|rmvb|rm|mpg)$/i,isExtractableFilePattern:/\.(gz|tar|rar|g?zip)$/i,tplPath:"src/templates"};return{$get:function(){return n},set:function(i){e.extend(n,i)}}})}(angular),function(e){"use strict";e.module("FileManagerApp").config(["$translateProvider",function(e){e.useSanitizeValueStrategy(null),e.translations("en",{filemanager:"File Manager",language:"Language",english:"English",spanish:"Spanish",portuguese:"Portuguese",french:"French",german:"German",hebrew:"Hebrew",italian:"Italian",slovak:"Slovak",chinese_tw:"Traditional Chinese",chinese_cn:"Simple Chinese",russian:"Russian",ukrainian:"Ukrainian",turkish:"Turkish",persian:"Persian",polish:"Polish",dutch:"Dutch",confirm:"Confirm",cancel:"Cancel",close:"Close",upload_files:"Upload files",files_will_uploaded_to:"Files will be uploaded to",select_files:"Select files",uploading:"Uploading",permissions:"Permissions",select_destination_folder:"Select the destination folder",source:"Source",destination:"Destination",copy_file:"Copy file",sure_to_delete:"Are you sure to delete",change_name_move:"Change name / move",enter_new_name_for:"Enter new name for",extract_item:"Extract item",extraction_started:"Extraction started in a background process",compression_started:"Compression started in a background process",enter_folder_name_for_extraction:"Enter the folder name for the extraction of",enter_file_name_for_compression:"Enter the file name for the compression of",toggle_fullscreen:"Toggle fullscreen",edit_file:"Edit file",file_content:"File content",loading:"Loading",search:"Search",create_folder:"Create folder",create:"Create",folder_name:"Folder name",upload:"Upload",change_permissions:"Change permissions",change:"Change",details:"Details",icons:"Icons",list:"List",name:"Name",size:"Size",actions:"Actions",date:"Date",selection:"Selection",no_files_in_folder:"No files in this folder",no_folders_in_folder:"This folder not contains children folders",select_this:"Select this",go_back:"Go back",wait:"Wait",move:"Move",rsync:"Bidirection Rsync",download:"Download",view_item:"View item",remove:"Delete",edit:"Edit",copy:"Copy",rename:"Rename",extract:"Extract",compress:"Compress",error_invalid_filename:"Invalid filename or already exists, specify another name",error_modifying:"An error occurred modifying the file",error_deleting:"An error occurred deleting the file or folder",error_renaming:"An error occurred renaming the file",error_copying:"An error occurred copying the file",error_compressing:"An error occurred compressing the file or folder",error_extracting:"An error occurred extracting the file",error_creating_folder:"An error occurred creating the folder",error_getting_content:"An error occurred getting the content of the file",error_changing_perms:"An error occurred changing the permissions of the file",error_uploading_files:"An error occurred uploading files",sure_to_start_compression_with:"Are you sure to compress",owner:"Owner",group:"Group",others:"Others",read:"Read",write:"Write",exec:"Exec",original:"Original",changes:"Changes",recursive:"Recursive",preview:"Item preview",open:"Open",these_elements:"these {{total}} elements",new_folder:"New folder",download_as_zip:"Download as ZIP"}),e.translations("nl",{filemanager:"Bestand beheerder",language:"Taal",english:"Engels",spanish:"Spaans",portuguese:"Portugees",french:"Frans",german:"Duits",hebrew:"Hebrews",slovak:"Slowakije",chinese:"Chinees",russian:"Russisch",ukrainian:"Oekraïens",turkish:"Turks",persian:"Perzisch",confirm:"Bevestigen",cancel:"Annuleren",close:"Sluiten",upload_files:"Bestanden uploaden",files_will_uploaded_to:"Bestanden worden geüpload naar",select_files:"Selecteer bestanden",uploading:"Uploaden",permissions:"Rechten",select_destination_folder:"Selecteer de map van bestemming",source:"Bron",destination:"Doel",copy_file:"Kopieer bestand",sure_to_delete:"Weet je zeker dat je wilt verwijderen",change_name_move:"Hernoemen / verplaatsen",enter_new_name_for:"Typ een nieuwe naam voor",extract_item:"Uitpakken",extraction_started:"Uitpakken gestart als achtergrond proces",compression_started:"Inpakken gestart als achtergrond proces",enter_folder_name_for_extraction:"Typ een map naar voor het uitpakken van",enter_file_name_for_compression:"Typ een bestandsnaam voor het inpakken van",toggle_fullscreen:"Volledigscherm",edit_file:"Bewerk bestand",file_content:"Bestandsinhoud",loading:"Laden",search:"Zoeken",create_folder:"Maak map",create:"Maak",folder_name:"Map naam",upload:"Uploaden",change_permissions:"Rechten aanpassen",change:"Aanpassen",details:"Details",icons:"Iconen",list:"Lijst",name:"Naam",size:"Grootte",actions:"Acties",date:"Datum",no_files_in_folder:"Geen bestanden in deze map",no_folders_in_folder:"Deze map bevat geen submappen",select_this:"Selecteer dit",go_back:"Ga terug",wait:"Wacht",move:"Verplaats",rsync:"Bidirection Rsync",download:"Download",view_item:"Bekijk item",remove:"Verwijderen",edit:"Bewerken",copy:"Kopiëren",rename:"Hernoemen",extract:"Uitpakken",compress:"Inpakken",error_invalid_filename:"Ongeldige bestandsnaam of bestand al aanwezig, kies een andere naam",error_modifying:"Er is een fout opgetreden met het bewerken van het bestand",error_deleting:"Er is een fout opgetreden tijdens het verwijderen van de bestand of map",error_renaming:"Er is een fout opgetreden tijdens het hernoemen van het bestand",error_copying:"Er is een fout opgetreden tijdens het kopiëren van het bestand",error_compressing:"Er is een fout opgetreden tijdens het inpakken van het bestand of map",error_extracting:"Er is een fout opgetreden tijdens het uitpakken van het bestand",error_creating_folder:"Er is een fout opgetreden tijdens het maken van de map",error_getting_content:"Er is een fout opgetreden tijdens het ophalen van de inhoud van het bestand",error_changing_perms:"Er is een fout opgetreden tijdens het aanpassen van de rechten van het bestand",error_uploading_files:"Er is een fout opgetreden tijdens het uploaden van de bestanden",sure_to_start_compression_with:"Weet je zeker dat je dit wilt inpakken",owner:"Eigenaar",group:"Groep",others:"Andere",read:"Lees",write:"Schrijf",exec:"Uitvoeren",original:"Origineel",changes:"Aanpassingen",recursive:"Recursieve",preview:"Item bekijken",open:"Openen",these_elements:"Deze {{total}} elementen",new_folder:"Nieuwe map",download_as_zip:"Download als ZIP"}),e.translations("he",{filemanager:"מנהל קבצים",language:"שפה",english:"אנגלית",spanish:"ספרדית",portuguese:"פורטוגזית",french:"צרפתית",german:"גרמנית",hebrew:"עברי",italian:"איטלקי",slovak:"סלובקי",chinese_tw:"סינית מסורתית",chinese_cn:"סינית פשוטה",russian:"רוּסִי",ukrainian:"אוקראיני",turkish:"טורקי",persian:"פַּרסִית",polish:"פולני",confirm:"אשר",cancel:"בטל",close:"סגור",upload_files:"העלה קבצים",files_will_uploaded_to:"הקבצים יעלו ל",select_files:"בחר קבצים",uploading:"מעלה",permissions:"הרשאות",select_destination_folder:"בחר תיקיית יעד",source:"מקור",destination:"יעד",copy_file:"העתק קובץ",sure_to_delete:"האם אתה בטוח שברצונך למחוק",change_name_move:"שנה שם / הזז",enter_new_name_for:"הקלד שם חדש עבור",extract_item:"חלץ פריט",extraction_started:"תהליך החילוץ מתבצע ברקע",compression_started:"תהליך הכיווץ מתבצע ברקע",enter_folder_name_for_extraction:"הקלד שם תיקייה לחילוץ עבור",enter_file_name_for_compression:"הזן את שם הקובץ עבור הדחיסה של",toggle_fullscreen:"הפעל/בטל מסך מלא",edit_file:"ערוך קובץ",file_content:"תוכן הקובץ",loading:"טוען",search:"חפש",create_folder:"צור תיקייה",create:"צור",folder_name:"שם תיקייה",upload:"העלה",change_permissions:"שנה הרשאות",change:"שנה",details:"פרטים",icons:"סמלים",list:"רשימה",name:"שם",size:"גודל",actions:"פעולות",date:"תאריך",selection:"בְּחִירָה",no_files_in_folder:"אין קבצים בתיקייה זו",no_folders_in_folder:"התיקייה הזו אינה כוללת תתי תיקיות",select_this:"בחר את זה",go_back:"חזור אחורה",wait:"חכה",move:"הזז",rsync:"Bidirection Rsync",download:"הורד",view_item:"הצג פריט",remove:"מחק",edit:"ערוך",copy:"העתק",rename:"שנה שם",extract:"חלץ",compress:"כווץ",error_invalid_filename:"שם קובץ אינו תקין או קיים, ציין שם קובץ אחר",error_modifying:"התרחשה שגיאה בעת שינוי הקובץ",error_deleting:"התרחשה שגיאה בעת מחיקת הקובץ או התיקייה",error_renaming:"התרחשה שגיאה בעת שינוי שם הקובץ",error_copying:"התרחשה שגיאה בעת העתקת הקובץ",error_compressing:"התרחשה שגיאה בעת כיווץ הקובץ או התיקייה",error_extracting:"התרחשה שגיאה בעת חילוץ הקובץ או התיקייה",error_creating_folder:"התרחשה שגיאה בעת יצירת התיקייה",error_getting_content:"התרחשה שגיאה בעת בקשת תוכן הקובץ",error_changing_perms:"התרחשה שגיאה בעת שינוי הרשאות הקובץ",error_uploading_files:"התרחשה שגיאה בעת העלאת הקבצים",sure_to_start_compression_with:"האם אתה בטוח שברצונך לכווץ",owner:"בעלים",group:"קבוצה",others:"אחרים",read:"קריאה",write:"כתיבה",exec:"הרצה",original:"מקורי",changes:"שינויים",recursive:"רקורסיה",preview:"הצגת פריט",open:"פתח",new_folder:"תיקיה חדשה",download_as_zip:"להוריד כמו"}),e.translations("pt",{filemanager:"Gerenciador de arquivos",language:"Língua",english:"Inglês",spanish:"Espanhol",portuguese:"Portugues",french:"Francês",german:"Alemão",hebrew:"Hebraico",italian:"Italiano",slovak:"Eslovaco",chinese_tw:"Tradicional Chinesa",chinese_cn:"Chinês Simplificado",russian:"Russo",ukrainian:"Ucraniano",turkish:"Turco",persian:"Persa",polish:"Polonês",confirm:"Confirmar",cancel:"Cancelar",close:"Fechar",upload_files:"Carregar arquivos",files_will_uploaded_to:"Os arquivos serão enviados para",select_files:"Selecione os arquivos",uploading:"Carregar",permissions:"Autorizações",select_destination_folder:"Selecione a pasta de destino",source:"Origem",destination:"Destino",copy_file:"Copiar arquivo",sure_to_delete:"Tem certeza de que deseja apagar",change_name_move:"Renomear / mudança",enter_new_name_for:"Digite o novo nome para",extract_item:"Extrair arquivo",extraction_started:"A extração começou em um processo em segundo plano",compression_started:"A compressão começou em um processo em segundo plano",enter_folder_name_for_extraction:"Digite o nome da pasta para a extração de",enter_file_name_for_compression:"Digite o nome do arquivo para a compressão de",toggle_fullscreen:"Ativar/desativar tela cheia",edit_file:"Editar arquivo",file_content:"Conteúdo do arquivo",loading:"Carregando",search:"Localizar",create_folder:"Criar Pasta",create:"Criar",folder_name:"Nome da pasta",upload:"Fazer",change_permissions:"Alterar permissões",change:"Alterar",details:"Detalhes",icons:"Icones",list:"Lista",name:"Nome",size:"Tamanho",actions:"Ações",date:"Data",selection:"Seleção",no_files_in_folder:"Não há arquivos nesta pasta",no_folders_in_folder:"Esta pasta não contém subpastas",select_this:"Selecione esta",go_back:"Voltar",wait:"Espere",move:"Mover",rsync:"Bidirection Rsync",download:"Baixar",view_item:"Veja o arquivo",remove:"Excluir",edit:"Editar",copy:"Copiar",rename:"Renomear",extract:"Extrair",compress:"Comprimir",error_invalid_filename:"Nome do arquivo inválido ou nome de arquivo já existe, especifique outro nome",error_modifying:"Ocorreu um erro ao modificar o arquivo",error_deleting:"Ocorreu um erro ao excluir o arquivo ou pasta",error_renaming:"Ocorreu um erro ao mudar o nome do arquivo",error_copying:"Ocorreu um erro ao copiar o arquivo",error_compressing:"Ocorreu um erro ao comprimir o arquivo ou pasta",error_extracting:"Ocorreu um erro ao extrair o arquivo",error_creating_folder:"Ocorreu um erro ao criar a pasta",error_getting_content:"Ocorreu um erro ao obter o conteúdo do arquivo",error_changing_perms:"Ocorreu um erro ao alterar as permissões do arquivo",error_uploading_files:"Ocorreu um erro upload de arquivos",sure_to_start_compression_with:"Tem certeza que deseja comprimir",owner:"Proprietário",group:"Grupo",others:"Outros",read:"Leitura",write:"Escrita ",exec:"Execução",
original:"Original",changes:"Mudanças",recursive:"Recursiva",preview:"Visualização",open:"Abrir",these_elements:"estes {{total}} elements",new_folder:"Nova pasta",download_as_zip:"Download como ZIP"}),e.translations("es",{filemanager:"Administrador de archivos",language:"Idioma",english:"Ingles",spanish:"Español",portuguese:"Portugues",french:"Francés",german:"Alemán",hebrew:"Hebreo",italian:"Italiano",slovak:"Eslovaco",chinese_tw:"Tradicional China",chinese_cn:"Chino Simplificado",russian:"Ruso",ukrainian:"Ucraniano",turkish:"Turco",persian:"Persa",polish:"Polaco",confirm:"Confirmar",cancel:"Cancelar",close:"Cerrar",upload_files:"Subir archivos",files_will_uploaded_to:"Los archivos seran subidos a",select_files:"Seleccione los archivos",uploading:"Subiendo",permissions:"Permisos",select_destination_folder:"Seleccione la carpeta de destino",source:"Origen",destination:"Destino",copy_file:"Copiar archivo",sure_to_delete:"Esta seguro que desea eliminar",change_name_move:"Renombrar / mover",enter_new_name_for:"Ingrese el nuevo nombre para",extract_item:"Extraer archivo",extraction_started:"La extraccion ha comenzado en un proceso de segundo plano",compression_started:"La compresion ha comenzado en un proceso de segundo plano",enter_folder_name_for_extraction:"Ingrese el nombre de la carpeta para la extraccion de",enter_file_name_for_compression:"Ingrese el nombre del archivo para la compresion de",toggle_fullscreen:"Activar/Desactivar pantalla completa",edit_file:"Editar archivo",file_content:"Contenido del archivo",loading:"Cargando",search:"Buscar",create_folder:"Crear carpeta",create:"Crear",folder_name:"Nombre de la carpeta",upload:"Subir",change_permissions:"Cambiar permisos",change:"Cambiar",details:"Detalles",icons:"Iconos",list:"Lista",name:"Nombre",size:"Tamaño",actions:"Acciones",date:"Fecha",selection:"Selección",no_files_in_folder:"No hay archivos en esta carpeta",no_folders_in_folder:"Esta carpeta no contiene sub-carpetas",select_this:"Seleccionar esta",go_back:"Volver",wait:"Espere",move:"Mover",rsync:"Bidirection Rsync",download:"Descargar",view_item:"Ver archivo",remove:"Eliminar",edit:"Editar",copy:"Copiar",rename:"Renombrar",extract:"Extraer",compress:"Comprimir",error_invalid_filename:"El nombre del archivo es invalido o ya existe",error_modifying:"Ocurrio un error al intentar modificar el archivo",error_deleting:"Ocurrio un error al intentar eliminar el archivo",error_renaming:"Ocurrio un error al intentar renombrar el archivo",error_copying:"Ocurrio un error al intentar copiar el archivo",error_compressing:"Ocurrio un error al intentar comprimir el archivo",error_extracting:"Ocurrio un error al intentar extraer el archivo",error_creating_folder:"Ocurrio un error al intentar crear la carpeta",error_getting_content:"Ocurrio un error al obtener el contenido del archivo",error_changing_perms:"Ocurrio un error al cambiar los permisos del archivo",error_uploading_files:"Ocurrio un error al subir archivos",sure_to_start_compression_with:"Esta seguro que desea comprimir",owner:"Propietario",group:"Grupo",others:"Otros",read:"Lectura",write:"Escritura",exec:"Ejecucion",original:"Original",changes:"Cambios",recursive:"Recursivo",preview:"Vista previa",open:"Abrir",these_elements:"estos {{total}} elementos",new_folder:"Nueva carpeta",download_as_zip:"Descargar como ZIP"}),e.translations("fr",{filemanager:"Gestionnaire de fichier",language:"Langue",english:"Anglais",spanish:"Espagnol",portuguese:"Portugais",french:"Français",german:"Allemand",hebrew:"Hébreu",italian:"Italien",slovak:"Slovaque",chinese_tw:"Traditionnelle Chinoise",chinese_cn:"Chinois Simplifié",russian:"Russe",ukrainian:"Ukrainien",turkish:"Turc",persian:"Persan",polish:"Polonais",confirm:"Confirmer",cancel:"Annuler",close:"Fermer",upload_files:"Télécharger des fichiers",files_will_uploaded_to:"Les fichiers seront uploadé dans",select_files:"Sélectionnez les fichiers",uploading:"Upload en cours",permissions:"Permissions",select_destination_folder:"Sélectionné le dossier de destination",source:"Source",destination:"Destination",copy_file:"Copier le fichier",sure_to_delete:"Êtes-vous sûr de vouloir supprimer",change_name_move:"Renommer / Déplacer",enter_new_name_for:"Entrer le nouveau nom pour",extract_item:"Extraires les éléments",extraction_started:"L'extraction a démarré en tâche de fond",compression_started:"La compression a démarré en tâche de fond",enter_folder_name_for_extraction:"Entrer le nom du dossier pour l'extraction de",enter_file_name_for_compression:"Entrez le nom de fichier pour la compression de",toggle_fullscreen:"Basculer en plein écran",edit_file:"Éditer le fichier",file_content:"Contenu du fichier",loading:"Chargement en cours",search:"Recherche",create_folder:"Créer un dossier",create:"Créer",folder_name:"Nom du dossier",upload:"Upload",change_permissions:"Changer les permissions",change:"Changer",details:"Details",icons:"Icons",list:"Liste",name:"Nom",size:"Taille",actions:"Actions",date:"Date",selection:"Sélection",no_files_in_folder:"Aucun fichier dans ce dossier",no_folders_in_folder:"Ce dossier ne contiens pas de dossier",select_this:"Sélectionner",go_back:"Retour",wait:"Patienter",move:"Déplacer",rsync:"Bidirection Rsync",download:"Télécharger",view_item:"Voir l'élément",remove:"Supprimer",edit:"Éditer",copy:"Copier",rename:"Renommer",extract:"Extraire",compress:"Compresser",error_invalid_filename:"Nom de fichier invalide ou déjà existant, merci de spécifier un autre nom",error_modifying:"Une erreur est survenue pendant la modification du fichier",error_deleting:"Une erreur est survenue pendant la suppression du fichier ou du dossier",error_renaming:"Une erreur est survenue pendant le renommage du fichier",error_copying:"Une erreur est survenue pendant la copie du fichier",error_compressing:"Une erreur est survenue pendant la compression du fichier ou du dossier",error_extracting:"Une erreur est survenue pendant l'extraction du fichier",error_creating_folder:"Une erreur est survenue pendant la création du dossier",error_getting_content:"Une erreur est survenue pendant la récupération du contenu du fichier",error_changing_perms:"Une erreur est survenue pendant le changement des permissions du fichier",error_uploading_files:"Une erreur est survenue pendant l'upload des fichiers",sure_to_start_compression_with:"Êtes-vous sûre de vouloir compresser",owner:"Propriétaire",group:"Groupe",others:"Autres",read:"Lecture",write:"Écriture",exec:"Éxécution",original:"Original",changes:"Modifications",recursive:"Récursif",preview:"Aperçu",open:"Ouvrir",these_elements:"ces {{total}} éléments",new_folder:"Nouveau dossier",download_as_zip:"Télécharger comme ZIP"}),e.translations("de",{filemanager:"Dateimanager",language:"Sprache",english:"Englisch",spanish:"Spanisch",portuguese:"Portugiesisch",french:"Französisch",german:"Deutsch",hebrew:"Hebräisch",italian:"Italienisch",slovak:"Slowakisch",chinese_tw:"Traditionelles Chinesisch",chinese_cn:"Vereinfachtes Chinesisch",russian:"Russisch",ukrainian:"Ukrainisch",turkish:"Türkisch",persian:"Persisch",polish:"Polnisch",confirm:"Bestätigen",cancel:"Abbrechen",close:"Schließen",upload_files:"Hochladen von Dateien",files_will_uploaded_to:"Dateien werden hochgeladen nach",select_files:"Wählen Sie die Dateien",uploading:"Lade hoch",permissions:"Berechtigungen",select_destination_folder:"Wählen Sie einen Zielordner",source:"Quelle",destination:"Ziel",copy_file:"Datei kopieren",sure_to_delete:"Sind Sie sicher, dass Sie die Datei löschen möchten?",change_name_move:"Namen ändern / verschieben",enter_new_name_for:"Geben Sie den neuen Namen ein für",extract_item:"Archiv entpacken",extraction_started:"Entpacken hat im Hintergrund begonnen",compression_started:"Komprimierung hat im Hintergrund begonnen",enter_folder_name_for_extraction:"Geben Sie den Verzeichnisnamen für die Entpackung an von",enter_file_name_for_compression:"Geben Sie den Dateinamen für die Kompression an von",toggle_fullscreen:"Vollbild umschalten",edit_file:"Datei bearbeiten",file_content:"Dateiinhalt",loading:"Lade",search:"Suche",create_folder:"Ordner erstellen",create:"Erstellen",folder_name:"Verzeichnisname",upload:"Hochladen",change_permissions:"Berechtigungen ändern",change:"Ändern",details:"Details",icons:"Symbolansicht",list:"Listenansicht",name:"Name",size:"Größe",actions:"Aktionen",date:"Datum",selection:"Auswahl",no_files_in_folder:"Keine Dateien in diesem Ordner",no_folders_in_folder:"Dieser Ordner enthält keine Unterordner",select_this:"Auswählen",go_back:"Zurück",wait:"Warte",move:"Verschieben",rsync:"Bidirection Rsync",download:"Herunterladen",view_item:"Datei ansehen",remove:"Löschen",edit:"Bearbeiten",copy:"Kopieren",rename:"Umbenennen",extract:"Entpacken",compress:"Komprimieren",error_invalid_filename:"Ungültiger Dateiname oder existiert bereits",error_modifying:"Beim Bearbeiten der Datei ist ein Fehler aufgetreten",error_deleting:"Beim Löschen der Datei oder des Ordners ist ein Fehler aufgetreten",error_renaming:"Beim Umbennenen der Datei ist ein Fehler aufgetreten",error_copying:"Beim Kopieren der Datei ist ein Fehler aufgetreten",error_compressing:"Beim Komprimieren der Datei oder des Ordners ist ein Fehler aufgetreten",error_extracting:"Beim Entpacken der Datei ist ein Fehler aufgetreten",error_creating_folder:"Beim Erstellen des Ordners ist ein Fehler aufgetreten",error_getting_content:"Beim Laden des Dateiinhalts ist ein Fehler aufgetreten",error_changing_perms:"Beim Ändern der Dateiberechtigungen ist ein Fehler aufgetreten",error_uploading_files:"Beim Hochladen der Dateien ist ein Fehler aufgetreten",sure_to_start_compression_with:"Möchten Sie die Datei wirklich komprimieren?",owner:"Besitzer",group:"Gruppe",others:"Andere",read:"Lesen",write:"Schreiben",exec:"Ausführen",original:"Original",changes:"Änderungen",recursive:"Rekursiv",preview:"Dateivorschau",open:"Öffnen",these_elements:"diese {{total}} elemente",new_folder:"Neuer ordner",download_as_zip:"Download als ZIP"}),e.translations("sk",{filemanager:"Správca súborov",language:"Jazyk",english:"Angličtina",spanish:"Španielčina",portuguese:"Portugalčina",french:"Francúzština",german:"Nemčina",hebrew:"Hebrejčina",italian:"Italština",slovak:"Slovenčina",chinese_tw:"Tradičná Čínska",chinese_cn:"Zjednodušená Čínština",russian:"Ruský",ukrainian:"Ukrajinský",turkish:"Turecký",persian:"Perzský",polish:"Poľský",confirm:"Potvrdiť",cancel:"Zrušiť",close:"Zavrieť",upload_files:"Nahrávať súbory",files_will_uploaded_to:"Súbory budú nahrané do",select_files:"Vybrať súbory",uploading:"Nahrávanie",permissions:"Oprávnenia",select_destination_folder:"Vyberte cieľový príečinok",source:"Zdroj",destination:"Cieľ",copy_file:"Kopírovať súbor",sure_to_delete:"Ste si istý, že chcete vymazať",change_name_move:"Premenovať / Premiestniť",enter_new_name_for:"Zadajte nové meno pre",extract_item:"Rozbaliť položku",extraction_started:"Rozbaľovanie začalo v procese na pozadí",compression_started:"Kompresia začala v procese na pzoadí",enter_folder_name_for_extraction:"Zadajte názov priečinka na rozbalenie",enter_file_name_for_compression:"Zadajte názov súboru pre kompresiu",toggle_fullscreen:"Prepnúť režim na celú obrazovku",edit_file:"Upraviť súbor",file_content:"Obsah súboru",loading:"Načítavanie",search:"Hľadať",create_folder:"Vytvoriť priečinok",create:"Vytvoriť",folder_name:"Názov priećinka",upload:"Nahrať",change_permissions:"Zmeniť oprávnenia",change:"Zmeniť",details:"Podrobnosti",icons:"Ikony",list:"Zoznam",name:"Meno",size:"Veľkosť",actions:"Akcie",date:"Dátum",selection:"Výber",no_files_in_folder:"V tom to priečinku nie sú žiadne súbory",no_folders_in_folder:"Tento priečinok neobsahuje žiadne ďalšie priećinky",select_this:"Vybrať tento",go_back:"Ísť späť",wait:"Počkajte",move:"Presunúť",rsync:"Bidirection Rsync",download:"Stiahnuť",view_item:"Zobraziť položku",remove:"Vymazať",edit:"Upraviť",copy:"Kopírovať",rename:"Premenovať",extract:"Rozbaliť",compress:"Komprimovať",error_invalid_filename:"Neplatné alebo duplicitné meno súboru, vyberte iné meno",error_modifying:"Vyskytla sa chyba pri upravovaní súboru",error_deleting:"Vyskytla sa chyba pri mazaní súboru alebo priečinku",error_renaming:"Vyskytla sa chyba pri premenovaní súboru",error_copying:"Vyskytla sa chyba pri kopírovaní súboru",error_compressing:"Vyskytla sa chyba pri komprimovaní súboru alebo priečinka",error_extracting:"Vyskytla sa chyba pri rozbaľovaní súboru",error_creating_folder:"Vyskytla sa chyba pri vytváraní priečinku",error_getting_content:"Vyskytla sa chyba pri získavaní obsahu súboru",error_changing_perms:"Vyskytla sa chyba pri zmene oprávnení súboru",error_uploading_files:"Vyskytla sa chyba pri nahrávaní súborov",sure_to_start_compression_with:"Ste si istý, že chcete komprimovať",owner:"Vlastník",group:"Skupina",others:"Ostatní",read:"Čítanie",write:"Zapisovanie",exec:"Spúštanie",original:"Originál",changes:"Zmeny",recursive:"Rekurzívne",preview:"Náhľad položky",open:"Otvoriť",these_elements:"týchto {{total}} prvkov",new_folder:"Nový priečinok",download_as_zip:"Stiahnuť ako ZIP"}),e.translations("zh_cn",{filemanager:"文档管理器",language:"语言",english:"英语",spanish:"西班牙语",portuguese:"葡萄牙语",french:"法语",german:"德语",hebrew:"希伯来语",italian:"意大利",slovak:"斯洛伐克语",chinese_tw:"正体中文",chinese_cn:"简体中文",russian:"俄語",ukrainian:"烏克蘭",turkish:"土耳其",persian:"波斯語",polish:"波兰语",confirm:"确定",cancel:"取消",close:"关闭",upload_files:"上传文件",files_will_uploaded_to:"文件将上传到",select_files:"选择文件",uploading:"上传中",permissions:"权限",select_destination_folder:"选择目标文件",source:"源自",destination:"目的地",copy_file:"复制文件",sure_to_delete:"确定要删除?",change_name_move:"改名或移动?",enter_new_name_for:"输入新的名称",extract_item:"解压",extraction_started:"解压已经在后台开始",compression_started:"压缩已经在后台开始",enter_folder_name_for_extraction:"输入解压的目标文件夹",enter_file_name_for_compression:"输入要压缩的文件名",toggle_fullscreen:"切换全屏",edit_file:"编辑文件",file_content:"文件内容",loading:"加载中",search:"搜索",create_folder:"创建文件夹",create:"创建",folder_name:"文件夹名称",upload:"上传",change_permissions:"修改权限",change:"修改",details:"详细信息",icons:"图标",list:"列表",name:"名称",size:"尺寸",actions:"操作",date:"日期",selection:"选择",no_files_in_folder:"此文件夹没有文件",no_folders_in_folder:"此文件夹不包含子文件夹",select_this:"选择此文件",go_back:"后退",wait:"等待",move:"移动",rsync:"双向同步",download:"下载",view_item:"预览",remove:"删除",edit:"编辑",copy:"复制",rename:"重命名",extract:"解压",compress:"压缩",error_invalid_filename:"非法文件名或文件已经存在, 请指定其它名称",error_modifying:"修改文件出错",error_deleting:"删除文件或文件夹出错",error_renaming:"重命名文件出错",error_copying:"复制文件出错",error_compressing:"压缩文件或文件夹出错",error_extracting:"解压文件出错",error_creating_folder:"创建文件夹出错",error_getting_content:"获取文件内容出错",error_changing_perms:"修改文件权限出错",error_uploading_files:"上传文件出错",sure_to_start_compression_with:"确定要压缩?",owner:"拥有者",group:"群组",others:"其他",read:"读取",write:"写入",exec:"执行",original:"原始",changes:"变化",recursive:"递归",preview:"成员预览",open:"打开",these_elements:"共 {{total}} 个",new_folder:"新文件夹",download_as_zip:"下载的ZIP"}),e.translations("zh_tw",{filemanager:"檔案管理員",language:"語言",english:"英語",spanish:"西班牙語",portuguese:"葡萄牙語",french:"法語",german:"德語",hebrew:"希伯來語",italian:"意大利",slovak:"斯洛伐克語",chinese_tw:"正體中文",chinese_cn:"簡體中文",russian:"俄語",ukrainian:"烏克蘭",turkish:"土耳其",persian:"波斯語",polish:"波蘭語",confirm:"確定",cancel:"取消",close:"關閉",upload_files:"上傳檔案",files_will_uploaded_to:"檔案將上傳到",select_files:"選擇檔案",uploading:"上傳中",permissions:"權限",select_destination_folder:"選擇目標檔案",source:"來自",destination:"目的地",copy_file:"複製檔案",sure_to_delete:"確定要刪除?",change_name_move:"更名或移動?",enter_new_name_for:"輸入新的名稱",extract_item:"解壓",extraction_started:"解壓已經在後台開始",compression_started:"壓縮已經在後台開始",enter_folder_name_for_extraction:"輸入解壓的目標資料匣",enter_file_name_for_compression:"輸入要壓縮的檔名",toggle_fullscreen:"切換全螢幕",edit_file:"編輯檔案",file_content:"檔案內容",loading:"載入中",search:"尋找",create_folder:"建立資料匣",create:"建立",folder_name:"資料匣名稱",upload:"上傳",change_permissions:"修改權限",change:"修改",details:"詳細內容",icons:"圖示",list:"列表",name:"名稱",size:"大小",actions:"操作",date:"日期",selection:"選擇",no_files_in_folder:"此資料匣沒有文件",no_folders_in_folder:"此資料匣不包含子資料匣",select_this:"選擇此資料匣",go_back:"後退",wait:"等待",move:"移動",download:"下載",view_item:"檢視",remove:"刪除",edit:"存檔",copy:"複製",rename:"更改名稱",extract:"解壓",compress:"壓縮",error_invalid_filename:"非法檔名或檔案已經存在, 請指定其它檔名",error_modifying:"修改檔案出錯",error_deleting:"刪除檔案或資料夾出錯",error_renaming:"更改名稱發生出錯",error_copying:"複製檔案出錯",error_compressing:"壓縮檔案或資料匣出錯",error_extracting:"解壓檔案出錯",error_creating_folder:"建立資料匣出錯",error_getting_content:"獲取檔案內容出錯",error_changing_perms:"修改檔案權限出錯",error_uploading_files:"上傳檔案出錯",sure_to_start_compression_with:"確定要壓縮?",owner:"擁有者",group:"群組",others:"其他",read:"讀取",write:"寫入",exec:"執行",original:"現行",changes:"變更為",recursive:"包含所有子資料匣",preview:"預覽",open:"開啟",these_elements:"共 {{total}} 個",new_folder:"新資料匣",download_as_zip:"以ZIP下載"}),e.translations("ru",{filemanager:"Файловый менеджер",language:"Язык",english:"Английский",spanish:"Испанский",portuguese:"Португальский",french:"Французкий",german:"Немецкий",hebrew:"Хинди",italian:"итальянский",slovak:"Словацкий",chinese_tw:"Традиционный Китайский",chinese_cn:"Упрощенный Китайский",russian:"русский",ukrainian:"украинец",turkish:"турецкий",persian:"персидский",polish:"Польский",confirm:"Подьвердить",cancel:"Отменить",close:"Закрыть",upload_files:"Загрузка файлов",files_will_uploaded_to:"Файлы будут загружены в: ",select_files:"Выберите файлы",uploading:"Загрузка",permissions:"Разрешения",select_destination_folder:"Выберите папку назначения",source:"Источкик",destination:"Цель",copy_file:"Скопировать файл",sure_to_delete:"Действительно удалить?",change_name_move:"Переименовать / переместить",enter_new_name_for:"Новое имя для",extract_item:"Извлечь",extraction_started:"Извлечение начато",compression_started:"Сжатие начато",enter_folder_name_for_extraction:"Извлечь в укананную папку",enter_file_name_for_compression:"Введите имя архива",toggle_fullscreen:"На весь экран",edit_file:"Редактировать",file_content:"Содержимое файла",loading:"Загрузка",search:"Поиск",create_folder:"Создать папку",create:"Создать",folder_name:"Имя папки",upload:"Загрузить",change_permissions:"Изменить разрешения",change:"Изменить",details:"Свойства",icons:"Иконки",list:"Список",name:"Имя",size:"Размер",actions:"Действия",date:"Дата",selection:"выбор",no_files_in_folder:"Пустая папка",no_folders_in_folder:"Пустая папка",select_this:"Выбрать",go_back:"Назад",wait:"Подождите",move:"Переместить",download:"Скачать",view_item:"Отобразить содержимое",remove:"Удалить",edit:"Редактировать",copy:"Скопировать",rename:"Переименовать",extract:"Извлечь",compress:"Сжать",error_invalid_filename:"Имя неверное или уже существует, выберите другое",error_modifying:"Произошла ошибка при модифицировании файла",error_deleting:"Произошла ошибка при удалении",error_renaming:"Произошла ошибка при переименовании файла",error_copying:"Произошла ошибка при копировании файла",error_compressing:"Произошла ошибка при сжатии",error_extracting:"Произошла ошибка при извлечении",error_creating_folder:"Произошла ошибка при создании папки",error_getting_content:"Произошла ошибка при получении содержимого",error_changing_perms:"Произошла ошибка при изменении разрешений",error_uploading_files:"Произошла ошибка при загрузке",sure_to_start_compression_with:"Действительно сжать",owner:"Владелец",group:"Группа",others:"Другие",read:"Чтение",write:"Запись",exec:"Выполнение",original:"По-умолчанию",changes:"Изменения",recursive:"Рекурсивно",preview:"Просмотр",open:"Открыть",these_elements:"всего {{total}} елементов",new_folder:"Новая папка",download_as_zip:"Download as ZIP"}),e.translations("ua",{filemanager:"Файловий менеджер",language:"Мова",english:"Англійська",spanish:"Іспанська",portuguese:"Португальська",french:"Французька",german:"Німецька",hebrew:"Хінді",italian:"італійський",slovak:"Словацька",chinese_tw:"традиційний Китайський",chinese_cn:"Cпрощена Китайська",russian:"російський",ukrainian:"український",turkish:"турецька",persian:"перський",polish:"Польська",confirm:"Підтвердити",cancel:"Відмінити",close:"Закрити",upload_files:"Завантаження файлів",files_will_uploaded_to:"Файли будуть завантажені у: ",select_files:"Виберіть файли",uploading:"Завантаження",permissions:"Дозволи",select_destination_folder:"Виберіть папку призначення",source:"Джерело",destination:"Ціль",copy_file:"Скопіювати файл",sure_to_delete:"Дійсно удалить?",change_name_move:"Перейменувати / перемістити",enter_new_name_for:"Нове ім'я для",extract_item:"Извлечь",extraction_started:"Извлечение начато",compression_started:"Архівацію почато",enter_folder_name_for_extraction:"Извлечь в укананную папку",enter_file_name_for_compression:"Введите имя архива",toggle_fullscreen:"На весь экран",edit_file:"Редагувати",file_content:"Вміст файлу",loading:"Завантаження",search:"Пошук",create_folder:"Створити папку",create:"Створити",folder_name:"Ім'я папки",upload:"Завантижити",change_permissions:"Змінити дозволи",change:"Редагувати",details:"Властивості",icons:"Іконки",list:"Список",name:"Ім'я",size:"Розмір",actions:"Дії",date:"Дата",selection:"вибір",no_files_in_folder:"Пуста папка",no_folders_in_folder:"Пуста папка",select_this:"Выбрати",go_back:"Назад",wait:"Зачекайте",move:"Перемістити",download:"Скачати",view_item:"Показати вміст",remove:"Видалити",edit:"Редагувати",copy:"Копіювати",rename:"Переіменувати",extract:"Розархівувати",compress:"Архівувати",error_invalid_filename:"Ім'я певірне або вже існує, виберіть інше",error_modifying:"Виникла помилка при редагуванні файлу",error_deleting:"Виникла помилка при видаленні",error_renaming:"Виникла помилка при зміні імені файлу",error_copying:"Виникла помилка при коміюванні файлу",error_compressing:"Виникла помилка при стисненні",error_extracting:"Виникла помилка при розархівації",error_creating_folder:"Виникла помилка при створенні папки",error_getting_content:"Виникла помилка при отриманні вмісту",error_changing_perms:"Виникла помилка при зміні дозволів",error_uploading_files:"Виникла помилка при завантаженні",sure_to_start_compression_with:"Дійсно стиснути",owner:"Власник",group:"Група",others:"Інші",read:"Читання",write:"Запис",exec:"Виконання",original:"За замовчуванням",changes:"Зміни",recursive:"Рекурсивно",preview:"Перегляд",open:"Відкрити",these_elements:"усього {{total}} елементів",new_folder:"Нова папка",download_as_zip:"Download as ZIP"}),e.translations("tr",{filemanager:"Dosya Yöneticisi",language:"Dil",english:"İngilizce",spanish:"İspanyolca",portuguese:"Portekizce",french:"Fransızca",german:"Almanca",hebrew:"İbranice",italian:"İtalyanca",slovak:"Slovakça",chinese_tw:"Geleneksel Çin",chinese_cn:"Basitleştirilmiş Çince",russian:"Rusça",ukrainian:"Ukraynaca",turkish:"Türkçe",persian:"Farsça",polish:"Lehçe",confirm:"Onayla",cancel:"İptal Et",close:"Kapat",upload_files:"Dosya yükle",files_will_uploaded_to:"Dosyalar yüklenecektir.",select_files:"Dosya Seç",uploading:"Yükleniyor",permissions:"İzinler",select_destination_folder:"Hedef klasör seçin",source:"Kaynak",destination:"Hedef",copy_file:"Dosyayı kopyala",sure_to_delete:"Silmek istediğinden emin misin",change_name_move:"İsmini değiştir / taşı",enter_new_name_for:"Yeni ad girin",extract_item:"Dosya çıkar",extraction_started:"Çıkarma işlemi arkaplanda devam ediyor",compression_started:"Sıkıştırma işlemi arkaplanda başladı",enter_folder_name_for_extraction:"Çıkarılması için klasör adı girin",enter_file_name_for_compression:"Sıkıştırılması için dosya adı girin",toggle_fullscreen:"Tam ekran moduna geç",edit_file:"Dosyayı düzenle",file_content:"Dosya içeriği",loading:"Yükleniyor",search:"Ara",create_folder:"Klasör oluştur",create:"Oluştur",folder_name:"Klasör adı",upload:"Yükle",change_permissions:"İzinleri değiştir",change:"Değiştir",details:"Detaylar",icons:"simgeler",list:"Liste",name:"Adı",size:"Boyutu",actions:"İşlemler",date:"Tarih",selection:"Seçim",no_files_in_folder:"Klasörde hiç dosya yok",no_folders_in_folder:"Bu klasör alt klasör içermez",select_this:"Bunu seç",go_back:"Geri git",wait:"Bekle",move:"Taşı",download:"İndir",view_item:"Dosyayı görüntüle",remove:"Sil",edit:"Düzenle",copy:"Kopyala",rename:"Yeniden Adlandır",extract:"Çıkart",compress:"Sıkıştır",error_invalid_filename:"Geçersiz dosya adı, bu dosya adına sahip dosya mevcut",error_modifying:"Dosya düzenlenirken bir hata oluştu",error_deleting:"Klasör veya dosya silinirken bir hata oluştu",error_renaming:"Dosya yeniden adlandırılırken bir hata oluştu",error_copying:"Dosya kopyalanırken bir hata oluştu",error_compressing:"Dosya veya klasör sıkıştırılırken bir hata oluştu",error_extracting:"Çıkartılırken bir hata oluştu",error_creating_folder:"Klasör oluşturulurken bir hata oluştu",error_getting_content:"Dosya detayları alınırken bir hata oluştu",error_changing_perms:"Dosyanın izini değiştirilirken bir hata oluştu",error_uploading_files:"Dosyalar yüklenirken bir hata oluştu",sure_to_start_compression_with:"Sıkıştırmak istediğinden emin misin",owner:"Sahip",group:"Grup",others:"Diğerleri",read:"Okuma",write:"Yazma",exec:"Gerçekleştir",original:"Orjinal",changes:"Değişiklikler",recursive:"Yinemeli",preview:"Dosyayı önizle",open:"Aç",these_elements:"{{total}} eleman",new_folder:"Yeni Klasör",download_as_zip:"ZIP olarak indir"}),e.translations("fa",{filemanager:"مدیریت فایل ها",language:"زبان",english:"انگلیسی",spanish:"اسپانیایی",portuguese:"پرتغالی",french:"فرانسه",german:"آلمانی",hebrew:"عبری",italian:"ایتالیایی",slovak:"اسلواک",chinese_tw:"چینی سنتی",chinese_cn:"چینی ساده شده",russian:"روسی",ukrainian:"اوکراینی",turkish:"ترکی",persian:"فارسی",polish:"لهستانی",confirm:"تایید",cancel:"رد",close:"بستن",upload_files:"آپلود فایل",files_will_uploaded_to:"فایل ها آپلود می شوند به",select_files:"انتخاب فایل ها",uploading:"در حال آپلود",permissions:"مجوز ها",select_destination_folder:"پوشه مقصد را انتخاب کنید",source:"مبدا",destination:"مقصد",copy_file:"کپی فایل",sure_to_delete:"مطمين هستید می خواهید حذف کنید؟",change_name_move:"تغییر نام و جابجایی",enter_new_name_for:"نام جدیدی وارد کنید برای",extract_item:"خارج کردن از حالت فشرده",extraction_started:"یک پروسه در پس زمینه شروع به خارج کردن از حالت فشرده کرد",compression_started:"یک پروسه در پس زمینه شروع به فشرده سازی کرد",enter_folder_name_for_extraction:"نام پوشه مقصد برای خارج کردن از حالت فشرده را وارد کنید",enter_file_name_for_compression:"نام پوشه مقصد برای فشرده سازی را وارد کنید",toggle_fullscreen:"تعویض حالت تمام صفحه",edit_file:"ویرایش",file_content:"محتویات",loading:"در حال بارگذاری",search:"جستجو",create_folder:"پوشه جدید",create:"ساختن",folder_name:"نام پوشه",upload:"آپلود",change_permissions:"تغییر مجوز ها",change:"تغییر",details:"جزییات",icons:"آیکون ها",list:"لیست",name:"نام",size:"سایز",actions:"اعمال",date:"تاریخ",selection:"انتخاب",no_files_in_folder:"هیچ فایلی در این پوشه نیست",no_folders_in_folder:"هیچ پوشه ای داخل این پوشه قرار ندارد",select_this:"انتخاب",go_back:"بازگشت",wait:"منتظر بمانید",move:"جابجایی",download:"دانلود",view_item:"مشاهده این مورد",remove:"حذف",edit:"ویرایش",copy:"کپی",rename:"تغییر نام",extract:"خروج از حالت فشرده",compress:"فشرده سازی",error_invalid_filename:"نام فایل مورد درست نیست و یا قبلا استفاده شده است، لطفا نام دیگری وارد کنید",error_modifying:"در هنگام تغییر فایل خطایی پیش آمد",error_deleting:"در هنگام حذف فایل خطایی پیش آمد",error_renaming:"در هنگام تغییر نام فایل خطایی پیش آمد",error_copying:"در هنگام کپی کردن فایل خطایی پیش آمد",error_compressing:"در هنگام فشرده سازی فایل خطایی پیش آمد",error_extracting:"در هنگام خارک کردن فایل از حالت فشرده خطایی پیش آمد",error_creating_folder:"در هنگام ساخت پوشه خطایی پیش امد",error_getting_content:"در هنگام بارگذاری محتویات فایل خطایی رخ داد",error_changing_perms:"در هنگام تغییر مجوز های فایل خطایی رخ داد",error_uploading_files:"در آپلود فایل خطایی رخ داد",sure_to_start_compression_with:"مطمئن هستید فشرده سازی انجام شد؟",owner:"مالک فایل",group:"گروه",others:"دیگران",read:"خواندن",write:"نوشتن",exec:"اجرا کردن",original:"اصلی",changes:"تغییرات",recursive:"بازگشتی",preview:"پیش نمایش",open:"باز کردن",these_elements:"تعداد {{total}} مورد",new_folder:"پوشه جدید",download_as_zip:"به عنوان فایل فشرده دانلود شود"}),e.translations("pl",{filemanager:"Menadżer plików",language:"Język",english:"Angielski",spanish:"Hiszpański",portuguese:"Portugalski",french:"Francuski",german:"Niemiecki",hebrew:"Hebrajski",italian:"Włoski",slovak:"Słowacki",chinese_tw:"Tradycyjny Chiński",chinese_cn:"Chiński Uproszczony",russian:"Rosyjski",ukrainian:"Ukraiński",turkish:"Turecki",persian:"Perski",polish:"Polski",confirm:"Potwierdź",cancel:"Anuluj",close:"Zamknij",upload_files:"Wgraj pliki",files_will_uploaded_to:"Pliki będą umieszczone w katalogu",select_files:"Wybierz pliki",uploading:"Ładowanie",permissions:"Uprawnienia",select_destination_folder:"Wybierz folder docelowy",source:"Źródło",destination:"Cel",copy_file:"Kopiuj plik",sure_to_delete:"Jesteś pewien, że chcesz skasować",change_name_move:"Zmień nazwę / przenieś",enter_new_name_for:"Wpisz nową nazwę dla",extract_item:"Rozpakuj element",extraction_started:"Rozpakowywanie rozpoczęło się w tle",compression_started:"Kompresowanie rozpoczęło się w tle",enter_folder_name_for_extraction:"Wpisz nazwę folderu do rozpakowania",enter_file_name_for_compression:"Wpisz nazwę folderu do skompresowania",toggle_fullscreen:"Tryb pełnoekranowy",edit_file:"Edytuj plik",file_content:"Zawartość pliku",loading:"Ładowanie",search:"Szukaj",create_folder:"Stwórz folder",create:"Utwórz",folder_name:"Nazwa folderu",upload:"Wgraj",change_permissions:"Zmień uprawnienia",change:"Zmień",details:"Szczegóły",icons:"Ikony",list:"Lista",name:"Nazwa",size:"Rozmiar",actions:"Akcje",date:"Data",selection:"Zaznaczone",no_files_in_folder:"Brak plików w tym folderze",no_folders_in_folder:"Ten folder nie zawiera podfolderów",select_this:"Wybierz ten",go_back:"W górę",wait:"Wait",move:"Przenieś",download:"Pobierz",view_item:"Wyświetl",remove:"Usuń",edit:"Edycja",copy:"Kopiuj",rename:"Zmień nazwę",extract:"Rozpakuj",compress:"Skompresuj",error_invalid_filename:"Błędna nazwa pliku lub plik o takiej nazwie już istnieje, proszę użyć innej nazwy",error_modifying:"Wystąpił błąd podczas modyfikowania pliku",error_deleting:"Wystąpił błąd podczas usuwania pliku lub folderu",error_renaming:"Wystąpił błąd podczas zmiany nazwy pliku",error_copying:"Wystąpił błąd podczas kopiowania pliku",error_compressing:"Wystąpił błąd podczas kompresowania pliku lub folderu",error_extracting:"Wystąpił błąd podczas rozpakowywania pliku",error_creating_folder:"Wystąpił błąd podczas tworzenia nowego folderu",error_getting_content:"Wystąpił błąd podczas pobierania zawartości pliku",error_changing_perms:"Wystąpił błąd podczas zmiany uprawnień pliku",error_uploading_files:"Wystąpił błąd podczas wgrywania plików",sure_to_start_compression_with:"Jesteś pewien, że chcesz skompresować",owner:"Właściciel",group:"Grupa",others:"Inni",read:"Odczyt",write:"Zapis",exec:"Wykonywanie",original:"Oryginał",changes:"Zmiany",recursive:"Rekursywnie",preview:"Podgląd elementu",open:"Otwórz",these_elements:"te {{total}} elementy?",new_folder:"Nowy folder",download_as_zip:"Pobierz jako ZIP"}),e.translations("it",{filemanager:"Gestore File",language:"Lingua",english:"Inglese",spanish:"Spagnolo",portuguese:"Portoghese",french:"Francese",german:"Tedesco",hebrew:"Ebraico",slovak:"Slovacco",chinese_tw:"Cinese Tradizionale",chinese_cn:"Cinese",russian:"Russo",ukrainian:"Ucraino",turkish:"Turco",persian:"Persiano",polish:"Polacco",confirm:"Conferma",cancel:"Annulla",close:"Chiudi",upload_files:"Carica files",files_will_uploaded_to:"I files saranno caricati in",select_files:"Seleziona i files",uploading:"Trasferimento",permissions:"Permessi",select_destination_folder:"Select carterlla di destinazione",source:"Sorgente",destination:"Destinazione",copy_file:"Copia file",sure_to_delete:"Sicuro di voler eliminare",change_name_move:"Rinomina / sposta",enter_new_name_for:"Inserisci nuovo nome per",extract_item:"Estrai elemento",extraction_started:"Decompressione avviata da un processo in background",compression_started:"Compressione avviata da un processo in background",enter_folder_name_for_extraction:"Inserisci nome cartella per l'estrazione di",
enter_file_name_for_compression:"Inserisci nome file per la compressione di",toggle_fullscreen:"Passa a schermo intero",edit_file:"Modifica file",file_content:"Contenuto del file",loading:"Caricamento",search:"Cerca",create_folder:"Crea cartella",create:"Crea",folder_name:"Nome cartella",upload:"Upload",change_permissions:"Modifica permessi",change:"Modifica",details:"Dettagli",icons:"Icone",list:"Lista",name:"Nome",size:"Dimensione",actions:"Azioni",date:"Data",selection:"Selezione",no_files_in_folder:"Nessun file nella cartella",no_folders_in_folder:"Questa cartella non contiene altre cartelle",select_this:"Seleziona questo",go_back:"Indietro",wait:"Attendere",move:"Sposta",download:"Scarica",view_item:"Visualizza elemento",remove:"Elimina",edit:"Modifica",copy:"Copia",rename:"Rinomina",extract:"Estrai",compress:"Comprimi",error_invalid_filename:"Nome file non valido o già esistente, specificarne un'altro",error_modifying:"Errore durante la modifica del file",error_deleting:"Errore durante l'eliminazione del file o della cartella",error_renaming:"Errore durante la rinomina del file",error_copying:"Errore durante la copia del file",error_compressing:"Errore durante la compressione del file o della cartella",error_extracting:"Errore durante l'estrazione del file",error_creating_folder:"Errore nella creazione della cartella",error_getting_content:"Errore nel recupero del contenuto del file",error_changing_perms:"Errore durante la modifica dei permessi del file",error_uploading_files:"Errore durante il trasferimento dei files",sure_to_start_compression_with:"Sicuro di voler comprimere",owner:"Proprietario",group:"Gruppo",others:"Altri",read:"Lettura",write:"Scrittura",exec:"Esecuzione",original:"Originario",changes:"Cambiamenti",recursive:"Ricorsivo",preview:"Anteprima",open:"Apri",these_elements:"questi {{total}} elementi",new_folder:"Nuova cartella",download_as_zip:"Scarica come file ZIP"})}])}(angular),function(e,n){"use strict";e.module("FileManagerApp").service("apiHandler",["$http","$q","$window","$translate","Upload",function(e,i,t,r,a){e.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var s=function(){this.inprocess=!1,this.asyncSuccess=!1,this.error=""};return s.prototype.deferredHandler=function(e,n,i,t){return e&&"object"==typeof e||(this.error="Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s",i)),404==i&&(this.error="Error 404 - Backend bridge is not working, please check the ajax response."),e.result&&e.result.error&&(this.error=e.result.error),!this.error&&e.error&&(this.error=e.error),!this.error&&t&&(this.error=t),this.error?n.reject(e):n.resolve(e)},s.prototype.historyTask=function(n,t){var r=this,a=t||r.deferredHandler,s=i.defer();return r.inprocess=!0,r.error="",e.get(n).success(function(e,n){a(e,s,n)}).error(function(e,n){a(e,s,n,"Unknown error listing, check the response")})["finally"](function(){r.inprocess=!1}),s.promise},s.prototype.listTask=function(n,t,r){for(var a,s=this,o=r||s.deferredHandler,l=JSON.parse(localStorage.getItem("deviceList")),d=0,c=l.length;d<c;d++)if(l[d].isCurrentDevice){a=l[d].routerId;break}var p=t||a,m=i.defer();return s.inprocess=!0,s.error="",e.get(n+"/"+p).success(function(e,n){o(e,m,n)}).error(function(e,n){o(e,m,n,"Unknown error listing, check the response")})["finally"](function(){s.inprocess=!1}),m.promise},s.prototype.getRouterInfo=function(n,t){var r=this,a=t||r.deferredHandler,s=i.defer();return r.inprocess=!0,r.error="",e.get(n).success(function(e,n){a(e,s,n)}).error(function(e,n){a(e,s,n,"Unknown error listing, check the response")})["finally"](function(){r.inprocess=!1}),s.promise},s.prototype.cancelTask=function(n,t,r,a){var s=this,o=a||s.deferredHandler,l=i.defer(),d={routerId:n,jobKey:t};return s.inprocess=!0,s.error="",e.post(r,d).success(function(e,n){o(e,l,n)}).error(function(e,n){o(e,l,n,"Unknown error listing, check the response")})["finally"](function(){s.inprocess=!1}),l.promise},s.prototype.uploadFile=function(n,t,r){var a=this,s=r||a.deferredHandler,o=i.defer();return a.inprocess=!0,a.error="",e.post(n,t).success(function(e,n){s(e,o,n)}).error(function(e,n){s(e,o,n,"Unknown error listing, check the response")})["finally"](function(){a.inprocess=!1}),o.promise},s.prototype.setConfigs=function(n,t,r){var a=this,s=r||a.deferredHandler,o=i.defer();return a.inprocess=!0,a.error="",e.post(n,t).success(function(e,n){s(e,o,n)}).error(function(e,n){s(e,o,n,"Unknown error listing, check the response")})["finally"](function(){a.inprocess=!1}),o.promise},s.prototype.list=function(n,t,r,a){var s=this,o=r||s.deferredHandler,l=i.defer(),d={action:"list",path:t,fileExtensions:a&&a.length?a:void 0};return s.inprocess=!0,s.error="",e.post(n,d).success(function(e,n){o(e,l,n)}).error(function(e,n){o(e,l,n,"Unknown error listing, check the response")})["finally"](function(){s.inprocess=!1}),l.promise},s.prototype.copy=function(n,t,a,s){var o=this,l=i.defer(),d={action:"copy",items:t,newPath:a};return s&&1===t.length&&(d.singleFilename=s),o.inprocess=!0,o.error="",e.post(n,d).success(function(e,n){o.deferredHandler(e,l,n)}).error(function(e,n){o.deferredHandler(e,l,n,r.instant("error_copying"))})["finally"](function(){o.inprocess=!1}),l.promise},s.prototype.move=function(n,t,a){var s=this,o=i.defer(),l={action:"move",items:t,newPath:a};return s.inprocess=!0,s.error="",e.post(n,l).success(function(e,n){s.deferredHandler(e,o,n)}).error(function(e,n){s.deferredHandler(e,o,n,r.instant("error_moving"))})["finally"](function(){s.inprocess=!1}),o.promise},s.prototype.rsync=function(n,t,a){var s=this,o=i.defer(),l={action:"bisync",items:t,newPath:a};return s.inprocess=!0,s.error="",e.post(n,l).success(function(e,n){s.deferredHandler(e,o,n)}).error(function(e,n){s.deferredHandler(e,o,n,r.instant("error_moving"))})["finally"](function(){s.inprocess=!1}),o.promise},s.prototype.remove=function(n,t){var a=this,s=i.defer(),o={action:"remove",items:t};return a.inprocess=!0,a.error="",e.post(n,o).success(function(e,n){a.deferredHandler(e,s,n)}).error(function(e,n){a.deferredHandler(e,s,n,r.instant("error_deleting"))})["finally"](function(){a.inprocess=!1}),s.promise},s.prototype.upload=function(e,n,t){var r=this,s=i.defer();r.inprocess=!0,r.progress=0,r.error="";for(var o={destination:n},l=0;l<t.length;l++)o["file-"+l]=t[l];return t&&t.length&&a.upload({url:e,data:o}).then(function(e){r.deferredHandler(e.data,s,e.status)},function(e){r.deferredHandler(e.data,s,e.status,"Unknown error uploading files")},function(e){r.progress=Math.min(100,parseInt(100*e.loaded/e.total))-1})["finally"](function(){r.inprocess=!1,r.progress=0}),s.promise},s.prototype.getContent=function(n,t){var a=this,s=i.defer(),o={action:"getContent",item:t};return a.inprocess=!0,a.error="",e.post(n,o).success(function(e,n){a.deferredHandler(e,s,n)}).error(function(e,n){a.deferredHandler(e,s,n,r.instant("error_getting_content"))})["finally"](function(){a.inprocess=!1}),s.promise},s.prototype.edit=function(n,t,a){var s=this,o=i.defer(),l={action:"edit",item:t,content:a};return s.inprocess=!0,s.error="",e.post(n,l).success(function(e,n){s.deferredHandler(e,o,n)}).error(function(e,n){s.deferredHandler(e,o,n,r.instant("error_modifying"))})["finally"](function(){s.inprocess=!1}),o.promise},s.prototype.rename=function(n,t,a){var s=this,o=i.defer(),l={action:"rename",item:t,newItemPath:a};return s.inprocess=!0,s.error="",e.post(n,l).success(function(e,n){s.deferredHandler(e,o,n)}).error(function(e,n){s.deferredHandler(e,o,n,r.instant("error_renaming"))})["finally"](function(){s.inprocess=!1}),o.promise},s.prototype.getUrl=function(e,n){return e+n},s.prototype.download=function(n,a,s,o,l){var d=this,c=this.getUrl(n,a);if(!o||l||!t.saveAs)return!t.saveAs&&t.console.log("Your browser dont support ajax download, downloading by default"),!!t.open(c,"_blank","");var p=i.defer();return d.inprocess=!0,e.get(c).success(function(e){var n=new t.Blob([e]);p.resolve(e),t.saveAs(n,s)}).error(function(e,n){d.deferredHandler(e,p,n,r.instant("error_downloading"))})["finally"](function(){d.inprocess=!1}),p.promise},s.prototype.downloadMultiple=function(a,s,o,l,d){var c=this,p=i.defer(),m={action:"downloadMultiple",items:s,toFilename:o},u=[a,n.param(m)].join("?");return l&&!d&&t.saveAs?(c.inprocess=!0,e.get(a).success(function(e){var n=new t.Blob([e]);p.resolve(e),t.saveAs(n,o)}).error(function(e,n){c.deferredHandler(e,p,n,r.instant("error_downloading"))})["finally"](function(){c.inprocess=!1}),p.promise):(!t.saveAs&&t.console.log("Your browser dont support ajax download, downloading by default"),!!t.open(u,"_blank",""))},s.prototype.compress=function(n,t,a,s){var o=this,l=i.defer(),d={action:"compress",items:t,destination:s,compressedFilename:a};return o.inprocess=!0,o.error="",e.post(n,d).success(function(e,n){o.deferredHandler(e,l,n)}).error(function(e,n){o.deferredHandler(e,l,n,r.instant("error_compressing"))})["finally"](function(){o.inprocess=!1}),l.promise},s.prototype.extract=function(n,t,a,s){var o=this,l=i.defer(),d={action:"extract",item:t,destination:s,folderName:a};return o.inprocess=!0,o.error="",e.post(n,d).success(function(e,n){o.deferredHandler(e,l,n)}).error(function(e,n){o.deferredHandler(e,l,n,r.instant("error_extracting"))})["finally"](function(){o.inprocess=!1}),l.promise},s.prototype.changePermissions=function(n,t,a,s,o){var l=this,d=i.defer(),c={action:"changePermissions",items:t,perms:a,permsCode:s,recursive:!!o};return l.inprocess=!0,l.error="",e.post(n,c).success(function(e,n){l.deferredHandler(e,d,n)}).error(function(e,n){l.deferredHandler(e,d,n,r.instant("error_changing_perms"))})["finally"](function(){l.inprocess=!1}),d.promise},s.prototype.createFolder=function(n,t){var a=this,s=i.defer(),o={action:"createFolder",newPath:t};return a.inprocess=!0,a.error="",e.post(n,o).success(function(e,n){a.deferredHandler(e,s,n)}).error(function(e,n){a.deferredHandler(e,s,n,r.instant("error_creating_folder"))})["finally"](function(){a.inprocess=!1}),s.promise},s}])}(angular,jQuery),function(e){"use strict";e.module("FileManagerApp").service("apiMiddleware",["$window","fileManagerConfig","apiHandler",function(e,n,i){var t=function(){this.apiHandler=new i};return t.prototype.getPath=function(e){return"/"+e.join("/")},t.prototype.getFileList=function(e){return(e||[]).map(function(e){return e&&e.model.fullPath()})},t.prototype.getFilePath=function(e){return e&&e.model.fullPath()},t.prototype.list=function(e,i){return this.apiHandler.list(n.listUrl,this.getPath(e),i)},t.prototype.historyTask=function(e){return this.apiHandler.historyTask(n.historyTaskUrl,e)},t.prototype.listTask=function(e,i){return this.apiHandler.listTask(n.listTaskUrl,e,i)},t.prototype.cancelTask=function(e,i,t){return this.apiHandler.cancelTask(e,i,n.cancelTaskUrl,t)},t.prototype.getRouterInfo=function(e){return this.apiHandler.getRouterInfo(n.routerInfoUrl,e)},t.prototype.uploadFile=function(e,i){return this.apiHandler.uploadFile(n.reloadFileUrl,e,i)},t.prototype.setConfigs=function(e,i){return this.apiHandler.setConfigs(n.setConfigUrl,e,i)},t.prototype.copy=function(e,i){var t=this.getFileList(e),r=1===t.length?e[0].tempModel.name:void 0;return this.apiHandler.copy(n.copyUrl,t,this.getPath(i),r)},t.prototype.move=function(e,i){var t=this.getFileList(e);return this.apiHandler.move(n.moveUrl,t,this.getPath(i))},t.prototype.rsync=function(e,i){var t=this.getFileList(e);return this.apiHandler.rsync(n.rsyncUrl,t,this.getPath(i))},t.prototype.remove=function(e){var i=this.getFileList(e);return this.apiHandler.remove(n.removeUrl,i)},t.prototype.upload=function(i,t){if(!e.FormData)throw new Error("Unsupported browser version");var r=this.getPath(t);return this.apiHandler.upload(n.uploadUrl,r,i)},t.prototype.getContent=function(e){var i=this.getFilePath(e);return this.apiHandler.getContent(n.getContentUrl,i)},t.prototype.edit=function(e){var i=this.getFilePath(e);return this.apiHandler.edit(n.editUrl,i,e.tempModel.content)},t.prototype.rename=function(e){var i=this.getFilePath(e),t=e.tempModel.fullPath();return this.apiHandler.rename(n.renameUrl,i,t)},t.prototype.getUrl=function(e){var i=this.getFilePath(e);return this.apiHandler.getUrl(n.downloadFileUrl,i)},t.prototype.download=function(e,i){var t=this.getFilePath(e),r=e.model.name;if(!e.isFolder())return this.apiHandler.download(n.downloadFileUrl,t,r,n.downloadFilesByAjax,i)},t.prototype.downloadMultiple=function(e,i){var t=this.getFileList(e),r=(new Date).getTime().toString().substr(8,13),a=r+"-"+n.multipleDownloadFileName;return this.apiHandler.downloadMultiple(n.downloadMultipleUrl,t,a,n.downloadFilesByAjax,i)},t.prototype.compress=function(e,i,t){var r=this.getFileList(e);return this.apiHandler.compress(n.compressUrl,r,i,this.getPath(t))},t.prototype.extract=function(e,i,t){var r=this.getFilePath(e);return this.apiHandler.extract(n.extractUrl,r,i,this.getPath(t))},t.prototype.changePermissions=function(e,i){var t=this.getFileList(e),r=i.tempModel.perms.toCode(),a=i.tempModel.perms.toOctal(),s=!!i.tempModel.recursive;return this.apiHandler.changePermissions(n.permissionsUrl,t,r,a,s)},t.prototype.createFolder=function(e){var i=e.tempModel.fullPath();return this.apiHandler.createFolder(n.createFolderUrl,i)},t}])}(angular),function(e){"use strict";e.module("FileManagerApp").service("cogradient",["apiMiddleware",function(e){var n=function(){this.apiMiddleware=new e,this.requesting=!1,this.historyList=[],this.index=1,this.list=[],this.deviceLists=[],this.device={},this.error="",this.testArray=[{key:"/test11-13/test/[无心]第02集v2_bd.mp4",parentKey:"",fromRouter:"C494ACB40260",fromRouterName:"",fromPath:"/[无心]第02集v2_bd.mp4",toPath:"/test11-13/test/[无心]第02集v2_bd.mp4",toRouter:"8B46EC49E550",toRouterName:"",progress:48,downloadSpeed:0,uploadSpeed:262994,isDir:!1,error:"",childs:null},{key:"/test11-13/test/hello",parentKey:"",fromRouter:"C494ACB40260",fromRouterName:"",fromPath:"/test",toPath:"/test11-13/test/test",toRouter:"8B46EC49E550",toRouterName:"",progress:89,downloadSpeed:20,uploadSpeed:150482,isDir:!0,error:"",childs:[{key:"/test11-13/test/test/client-11-11.exe",parentKey:"/test11-13/test/test",fromRouter:"C494ACB40260",fromRouterName:"",fromPath:"/test/hello",toPath:"/test11-13/test/test/client-11-11.exe",toRouter:"8B46EC49E550",toRouterName:"",progress:7,downloadSpeed:5,uploadSpeed:1e4,isDir:!1,error:"",childs:null}]}]};return n.prototype.deferredHandler=function(e,n,i,t){return e&&"object"==typeof e||(this.error="Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s",i)),404==i&&(this.error="Error 404 - Backend bridge is not working, please check the ajax response."),200==i&&(this.error=null),!this.error&&e.result&&e.result.error&&(this.error=e.result.error),!this.error&&e.error&&(this.error=e.error),!this.error&&t&&(this.error=t),this.error?n.reject(e):n.resolve(e)},n.prototype.lists=function(){return this.apiMiddleware.list([],this.deferredHandler.bind(this))},n.prototype.listTask=function(e){return this.apiMiddleware.listTask(e,this.deferredHandler.bind(this))},n.prototype.historyTask=function(){return this.apiMiddleware.historyTask(this.deferredHandler.bind(this))},n.prototype.cancel=function(e,n){return this.apiMiddleware.cancelTask(e,n,this.deferredHandler.bind(this))},n.prototype.getRouterInfo=function(){return this.apiMiddleware.getRouterInfo(this.deferredHandler.bind(this))},n.prototype.uploadFile=function(e){return this.apiMiddleware.uploadFile(e,this.deferredHandler.bind(this))},n.prototype.refreshHistory=function(){var e=this;return e.requesting=!0,e.historyList=[],e.historyTask().then(function(n){if(n.success||0==n.success)e.historyList=n.result;else{var i=confirm("请求失败,是否重试");1==i?e.refreshHistory():alert("取消请求!")}})["finally"](function(){e.requesting=!1})},n.prototype.refreshList=function(e){var n=this,i=e||n.device.routerId;return n.listTask(i).then(function(t){if(i==n.device.routerId)n.list=t.result;else for(var r=n.deviceLists,a=0,s=r.length;a<s;a++)if(r[a].routerId==e){r[a].list=t.result,0==t.result?r[a].child=!1:r[a].child=!0;break}})["finally"](function(){})},n.prototype.cancelTask=function(e,n){var i=this;return i.requesting=!0,i.cancel(e,n).then(function(){})["finally"](function(){i.requesting=!1})},n.prototype.getCurrentDevice=function(){var e=this,n=JSON.parse(localStorage.getItem("deviceList"));e.deviceLists=[];for(var i=0,t=n.length;i<t;i++)if(n[i].isCurrentDevice)e.device={routerId:n[i].routerId,name:n[i].name};else{var r={};r.routerId=n[i].routerId,r.name=n[i].name,r.hidden=!0,r.list=[],r.child=!1,e.deviceLists.push(r)}},n.prototype.reloadFile=function(e){var n=this;return n.requesting=!0,n.uploadFile(e).then(function(){})["finally"](function(){n.requesting=!1})},n}])}(angular),function(e){"use strict";e.module("FileManagerApp").service("fileNavigator",["apiMiddleware","fileManagerConfig","item",function(e,n,i){var t=function(){this.apiMiddleware=new e,this.requesting=!1,this.fileList=[],this.currentPath=this.getBasePath(),this.history=[],this.error="",this.deviceList=[],this.onRefresh=function(){}};return t.prototype.getBasePath=function(){var e=(n.basePath||"").replace(/^\//,"");return e.trim()?e.split("/"):[]},t.prototype.deferredHandler=function(e,n,i,t){return e&&"object"==typeof e||(this.error="Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s",i)),404==i&&(this.error="Error 404 - Backend bridge is not working, please check the ajax response."),200==i&&(this.error=null),!this.error&&e.error&&(this.error=e.error),!this.error&&t&&(this.error=t),this.error?n.reject(e):n.resolve(e)},t.prototype.list=function(){return this.apiMiddleware.list(this.currentPath,this.deferredHandler.bind(this))},t.prototype.getRouterInfo=function(){return this.apiMiddleware.getRouterInfo(this.deferredHandler.bind(this))},t.prototype.refresh=function(){var e=this,n=JSON.parse(localStorage.getItem("deviceList"));e.currentPath.length||(e.currentPath=this.getBasePath());var t=e.currentPath.join("/");return e.requesting=!0,e.fileList=[],e.list().then(function(r){e.fileList=(r.result||[]).map(function(n){return new i(n,e.currentPath)});for(var a=0,s=n.length;a<s;a++)for(var o=0,l=e.fileList.length;o<l;o++)n[a].routerId!=e.fileList[o].model.name||(e.fileList[o].model.key=n[a].name);t||e.getCurrentDevices(),e.buildTree(t),e.onRefresh()})["finally"](function(){e.requesting=!1})},t.prototype.getCurrentDevices=function(){var e=this;return e.requesting=!0,e.getRouterInfo().then(function(n){n.result&&(n=n.result);var i=n.routers;if(!i)return void("unready"===n.err?(alert("未初始化,请填写正确的信息"),window.location.href="/static/config.html"):alert("网络存在问题,请重试!"));e.deviceList=[];for(var t=0,r=i.length;t<r;t++){var a={};a.routerId=i[t].routerId,a.name=i[t].name,n.routerId==i[t].routerId?a.isCurrentDevice=!0:a.isCurrentDevice=!1,e.deviceList.push(a)}localStorage.setItem("deviceList",JSON.stringify(e.deviceList)),e.refresh2(e.deviceList)})["catch"](function(e){e&&"login-require"===e.error&&(alert("未登录,请登录再进行访问"),window.location.href="/static/config.html?nologin=1")})["finally"](function(){e.requesting=!1})},t.prototype.refresh2=function(e){var n=this;n.currentPath.length||(n.currentPath=this.getBasePath());var t=n.currentPath.join("/");return n.requesting=!0,n.fileList=[],n.list().then(function(r){n.fileList=(r.result||[]).map(function(e){return new i(e,n.currentPath)});for(var a=0,s=e.length;a<s;a++)for(var o=0,l=n.fileList.length;o<l;o++)e[a].routerId!=n.fileList[o].model.name||(n.fileList[o].model.key=e[a].name);n.buildTree(t),n.onRefresh()})["finally"](function(){n.requesting=!1})},t.prototype.buildTree=function(e){function n(e,i,t){var r=t?t+"/"+i.model.name:i.model.name;if(e.name&&e.name.trim()&&0!==t.trim().indexOf(e.name)&&(e.nodes=[]),e.name!==t)e.nodes.forEach(function(e){n(e,i,t)});else{for(var a in e.nodes)if(e.nodes[a].name===r)return;e.nodes.push({item:i,name:r,nodes:[]})}e.nodes=e.nodes.sort(function(e,n){return e.name.toLowerCase()<n.name.toLowerCase()?-1:e.name.toLowerCase()===n.name.toLowerCase()?0:1})}function t(e,n){n.push(e);for(var i in e.nodes)t(e.nodes[i],n)}function r(e,n){return e.filter(function(e){return e.name===n})[0]}var a=[],s={};!this.history.length&&this.history.push({name:this.getBasePath()[0]||"",nodes:[]}),t(this.history[0],a),s=r(a,e),s&&(s.nodes=[]);for(var o in this.fileList){var l=this.fileList[o];l instanceof i&&l.isFolder()&&n(this.history[0],l,e)}for(var d=0,c=this.history[0].nodes.length;d<c;d++)for(var p=0,m=this.deviceList.length;p<m;p++)if(this.history[0].nodes[d].name==this.deviceList[p].routerId&&this.deviceList[p].isCurrentDevice){var u=this.history[0].nodes.splice(d,1);this.history[0].nodes.unshift(u[0]);break}},t.prototype.folderClick=function(e){this.currentPath=[],e&&e.isFolder()&&(this.currentPath=e.model.fullPath().split("/").splice(1)),this.refresh()},t.prototype.upDir=function(){this.currentPath[0]&&(this.currentPath=this.currentPath.slice(0,-1),this.refresh())},t.prototype.goTo=function(e){this.currentPath=this.currentPath.slice(0,e+1),this.refresh()},t.prototype.fileNameExists=function(e){return this.fileList.find(function(n){return e&&n.model.name.trim()===e.trim()})},t.prototype.listHasFolders=function(){return this.fileList.find(function(e){return"dir"===e.model.type})},t.prototype.getCurrentFolderName=function(){return this.currentPath.slice(-1)[0]||"/"},t}])}(angular),function(e){"use strict";e.module("FileManagerApp").service("option",["apiMiddleware",function(e){var n=function(){this.apiMiddleware=new e,this.requesting=!1,this.isOptioned=!0};return n.prototype.setConfigs=function(e){return this.apiMiddleware.setConfigs(e,this.deferredHandler.bind(this))},n.prototype.deferredHandler=function(e,n,i,t){return e&&"object"==typeof e||(this.error="Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s",i)),404==i&&(this.error="Error 404 - Backend bridge is not working, please check the ajax response."),200==i&&(this.error=null),!this.error&&e.result&&e.result.error&&(this.error=e.result.error),!this.error&&e.error&&(this.error=e.error.message),!this.error&&t&&(this.error=t),this.error?n.reject(e):n.resolve(e)},n.prototype.setConfig=function(e,n){var i=this;return i.requesting=!0,i.setConfigs(e).then(function(e){e.result.success&&(i.isOptioned=!1,n())})["finally"](function(){i.requesting=!1})},n.prototype.getConfig=function(){return JSON.parse(localStorage.getItem("token_path"))},n}])}(angular),angular.module("FileManagerApp").run(["$templateCache",function(e){e.put("src/templates/current-folder-breadcrumb.html",'<ol class="breadcrumb">\n <li>\n <a href="" ng-click="fileNavigator.goTo(-1)">\n {{"filemanager" | translate}}\n </a>\n </li>\n <li ng-repeat="(key, dir) in fileNavigator.currentPath track by key" ng-class="{\'active\':$last}" class="animated breadcrumb-item fast fadeIn">\n <a href="" ng-show="!$last" ng-click="fileNavigator.goTo(key)">\n {{dir | strLimit : 8}}\n </a>\n <span ng-show="$last">\n {{dir | strLimit : 12}}\n </span>\n </li>\n</ol>'),e.put("src/templates/item-context-menu.html",'<div id="context-menu" class="dropdown clearfix animated fast fadeIn">\n <ul class="dropdown-menu dropdown-right-click" role="menu" aria-labelledby="dropdownMenu" ng-show="temps.length">\n\n <li ng-show="singleSelection() && singleSelection().isFolder()">\n <a href="" tabindex="-1" ng-click="smartClick(singleSelection())">\n <i class="glyphicon glyphicon-folder-open"></i> {{\'open\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.pickCallback && singleSelection() && singleSelection().isSelectable()">\n <a href="" tabindex="-1" ng-click="config.pickCallback(singleSelection().model)">\n <i class="glyphicon glyphicon-hand-up"></i> {{\'select_this\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.download && !selectionHas(\'dir\') && singleSelection()">\n <a href="" tabindex="-1" ng-click="download()">\n <i class="glyphicon glyphicon-cloud-download"></i> {{\'download\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.downloadMultiple && !selectionHas(\'dir\') && !singleSelection()">\n <a href="" tabindex="-1" ng-click="download()">\n <i class="glyphicon glyphicon-cloud-download"></i> {{\'download_as_zip\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.preview && singleSelection().isImage() && singleSelection()">\n <a href="" tabindex="-1" ng-click="openImagePreview()">\n <i class="glyphicon glyphicon-picture"></i> {{\'view_item\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.preview && singleSelection().isVideo() && singleSelection()">\n <a href="" tabindex="-1" ng-click="openVideoPreview()">\n <i class="glyphicon glyphicon-film"></i> {{\'view_item\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.rename && singleSelection()">\n <a href="" tabindex="-1" ng-click="modal(\'rename\')">\n <i class="glyphicon glyphicon-edit"></i> {{\'rename\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.move && !isRootPath()">\n <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'move\')">\n <i class="glyphicon glyphicon-arrow-right"></i> {{\'move\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.copy && !isRootPath()">\n <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'copy\')">\n <i class="glyphicon glyphicon-log-out"></i> {{\'copy\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.rsync && singleSelection() && selectionHas(\'dir\') && !isRootPath()">\n <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'rsync\')">\n <i class="glyphicon glyphicon-refresh"></i> {{\'rsync\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.edit && singleSelection() && singleSelection().isEditable()">\n <a href="" tabindex="-1" ng-click="openEditItem()">\n <i class="glyphicon glyphicon-pencil"></i> {{\'edit\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.changePermissions && !isRootPath()">\n <a href="" tabindex="-1" ng-click="modal(\'changepermissions\')">\n <i class="glyphicon glyphicon-lock"></i> {{\'permissions\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.compress && (!singleSelection() || selectionHas(\'dir\')) && !isRootPath()">\n <a href="" tabindex="-1" ng-click="modal(\'compress\')">\n <i class="glyphicon glyphicon-compressed"></i> {{\'compress\' | translate}}\n </a>\n </li>\n\n <li ng-show="config.allowedActions.extract && singleSelection() && singleSelection().isExtractable()">\n <a href="" tabindex="-1" ng-click="modal(\'extract\')">\n <i class="glyphicon glyphicon-export"></i> {{\'extract\' | translate}}\n </a>\n </li>\n\n <li class="divider" ng-show="config.allowedActions.remove"></li>\n\n <li ng-show="config.allowedActions.remove && !isRootPath()">\n <a href="" tabindex="-1" ng-click="modal(\'remove\')">\n <i class="glyphicon glyphicon-trash"></i> {{\'remove\' | translate}}\n </a>\n </li>\n\n </ul>\n\n <ul class="dropdown-menu dropdown-right-click" role="menu" aria-labelledby="dropdownMenu" ng-show="!temps.length">\n <li ng-show="config.allowedActions.createFolder && !isRootPath()">\n <a href="" tabindex="-1" ng-click="modal(\'newfolder\') && prepareNewFolder()">\n <i class="glyphicon glyphicon-plus"></i> {{\'new_folder\' | translate}}\n </a>\n </li>\n <li ng-show="config.allowedActions.upload">\n <a href="" tabindex="-1" ng-click="modal(\'uploadfile\')">\n <i class="glyphicon glyphicon-cloud-upload"></i> {{\'upload_files\' | translate}}\n </a>\n </li>\n </ul>\n</div>\n'),e.put("src/templates/main-icons.html",'<div class="iconset noselect">\n <div class="item-list clearfix" prevent="true">\n <div class="col-120" ng-repeat="item in $parent.fileList = (fileNavigator.fileList | filter: {model:{name: query}})" ng-show="!fileNavigator.requesting && !fileNavigator.error">\n <a href="" class="thumbnail text-center main-item" ng-click="selectOrUnselect(item, $event, $index)" ng-dblclick="smartClick(item)" ng-right-click="selectOrUnselect(item, $event, $index)" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})" ng-class="{selected: isSelected(item)}">\n <div class="item-icon">\n <i class="glyphicon glyphicon-folder-open" ng-show="item.model.type === \'dir\'"></i>\n <div ng-show="item.model.type === \'file\'" ng-class="{\'item-extension\': config.showExtensionIcons}">\n <div >\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'xcel\'" ng-src="static/assets/excel.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="[\'docx\', \'doc\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" ng-src="static/assets/word.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'flv\'" ng-src="static/assets/flash.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="[\'mp4\',\'mp3\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" ng-src="static/assets/music.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'pdf\'" ng-src="static/assets/pdf.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'ppt\'" ng-src="static/assets/ppt.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'rar\'" ng-src="static/assets/rar.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="[\'jpeg\',\'png\',\'jpg\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" ng-src="static/assets/img.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="![\'xcel\',\'doc\',\'docx\',\'flv\',\'ppt\',\'pdf\',\'rar\',\'jpeg\',\'png\',\'jpg\',\'mp4\',\'mp3\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" ng-src="static/assets/others.svg">\n <!-- <i class="glyphicon glyphicon-file" ng-if="![\'xcel\',\'docx\',\'flv\',\'ppt\',\'pdf\',\'rar\',\'jpeg\',\'png\',\'jpg\',\'mp4\',\'mp3\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" data-ext="{{ item.model.name | fileExtension }}" ng-class="{\'item-extension\': config.showExtensionIcons}"></i> -->\n </div>\n </div>\n </div>\n {{(item.model.key||item.model.name) | strLimit : 11 }}\n </a>\n </div>\n </div>\n\n <div ng-show="fileNavigator.requesting">\n <div ng-include="config.tplPath + \'/spinner.html\'"></div>\n <div class="text-center">P2P连接中,请等待...<a href="/static/log.html" target="_blank" style="color:red">点击查看日志</a></div>\n </div>\n\n <div class="alert alert-warning" ng-show="!fileNavigator.requesting && fileNavigator.fileList.length < 1 && !fileNavigator.error">\n {{"no_files_in_folder" | translate}}...\n </div>\n\n <div class="alert alert-danger" ng-show="!fileNavigator.requesting && fileNavigator.error">\n {{ fileNavigator.error }}\n </div>\n</div>\n'),
e.put("src/templates/main-table-modal.html",'<table class="table table-condensed table-modal-condensed mb0">\n <thead>\n <tr>\n <th>\n <a href="" ng-click="order(\'model.name\')">\n {{"name" | translate}}\n <span class="sortorder" ng-show="predicate[1] === \'model.name\'" ng-class="{reverse:reverse}"></span>\n </a>\n </th>\n <th class="text-right"></th>\n </tr>\n </thead>\n <tbody class="file-item">\n <tr ng-show="fileNavigator.requesting">\n <td colspan="2">\n <div ng-include="config.tplPath + \'/spinner.html\'"></div>\n <div class="text-center">P2P连接中,请等待...\n <a href="/static/log.html" target="_blank" style="color:red">点击查看日志</a></div>\n </td>\n </tr>\n <tr ng-show="!fileNavigator.requesting && !fileNavigator.listHasFolders() && !fileNavigator.error">\n <td>\n {{"no_folders_in_folder" | translate}}...\n </td>\n <td class="text-right">\n <button class="btn btn-sm btn-default" ng-click="fileNavigator.upDir()">{{"go_back" | translate}}</button>\n </td>\n </tr>\n <tr ng-show="!fileNavigator.requesting && fileNavigator.error">\n <td colspan="2">\n {{ fileNavigator.error }}\n </td>\n </tr>\n <tr ng-repeat="item in fileNavigator.fileList | orderBy:predicate:reverse" ng-show="!fileNavigator.requesting && item.model.type === \'dir\'" ng-if="!selectedFilesAreChildOfPath(item)">\n <td>\n <a href="" ng-click="fileNavigator.folderClick(item)" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})">\n <i class="glyphicon glyphicon-folder-close"></i>\n {{(item.model.key || item.model.name) | strLimit : 32}}\n </a>\n </td>\n <td class="text-right">\n <button class="btn btn-sm btn-default" ng-click="select(item)">\n <i class="glyphicon glyphicon-hand-up"></i> {{"select_this" | translate}}\n </button>\n </td>\n </tr>\n </tbody>\n</table>'),e.put("src/templates/main-table.html",'<style>\n thead th a {\n color: rgba(0,0,0,0.85) !important;\n }\nth, td {\n padding: 14px !important;\n}\n</style>\n\n<table class="table mb0 table-files noselect p-10px">\n <thead>\n <tr>\n <th>\n <a href="" ng-click="order(\'model.name\')">\n {{"name" | translate}}\n <span class="sortorder" ng-show="predicate[1] === \'model.name\'" ng-class="{reverse:reverse}"></span>\n </a>\n </th>\n <th class="hidden-xs" ng-hide="config.hideSize">\n <a href="" ng-click="order(\'model.size\')">\n {{"size" | translate}}\n <span class="sortorder" ng-show="predicate[1] === \'model.size\'" ng-class="{reverse:reverse}"></span>\n </a>\n </th>\n <th class="hidden-sm hidden-xs" ng-hide="config.hideDate">\n <a href="" ng-click="order(\'model.date\')">\n {{"date" | translate}}\n <span class="sortorder" ng-show="predicate[1] === \'model.date\'" ng-class="{reverse:reverse}"></span>\n </a>\n </th>\n <th class="hidden-sm hidden-xs" ng-hide="config.hidePermissions">\n <a href="" ng-click="order(\'model.permissions\')">\n {{"permissions" | translate}}\n <span class="sortorder" ng-show="predicate[1] === \'model.permissions\'" ng-class="{reverse:reverse}"></span>\n </a>\n </th>\n </tr>\n </thead>\n <tbody class="file-item">\n <tr ng-show="fileNavigator.requesting">\n <td colspan="5">\n <div ng-include="config.tplPath + \'/spinner.html\'"></div>\n <div class="text-center">P2P连接中,请等待...\n <a href="/static/log.html" target="_blank" style="color:red">点击查看日志</a></div>\n </td>\n </tr>\n <tr ng-show="!fileNavigator.requesting && fileNavigator.fileList.length < 1 && !fileNavigator.error">\n <td colspan="5">\n {{"no_files_in_folder" | translate}}...\n </td>\n </tr>\n <tr ng-show="!fileNavigator.requesting && fileNavigator.error">\n <td colspan="5">\n {{ fileNavigator.error }}\n </td>\n </tr>\n <tr class="item-list main-item" ng-repeat="item in $parent.fileList = (fileNavigator.fileList | filter: {model:{name: query}} | orderBy:predicate:reverse)" ng-show="!fileNavigator.requesting" ng-click="selectOrUnselect(item, $event, $index)" ng-dblclick="smartClick(item)" ng-right-click="selectOrUnselect(item, $event, $index)" ng-class="{selected: isSelected(item)}">\n <td>\n <a href="" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})">\n <i class="glyphicon glyphicon-folder-close mr-10px" ng-show="item.model.type === \'dir\'"></i>\n <!-- <i class="glyphicon glyphicon-file" ng-show="item.model.type === \'file\'"></i> -->\n <span ng-show="item.model.type === \'file\'" class="mr-10px" ng-class="{\'item-extension\': config.showExtensionIcons}">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'xcel\'" ng-src="static/assets/excel.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="[\'docx\', \'doc\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" ng-src="static/assets/word.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'flv\'" ng-src="static/assets/flash.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="[\'mp4\',\'mp3\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" ng-src="static/assets/music.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'pdf\'" ng-src="static/assets/pdf.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'ppt\'" ng-src="static/assets/ppt.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1) === \'rar\'" ng-src="static/assets/rar.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="[\'jpeg\',\'png\',\'jpg\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" ng-src="static/assets/img.svg">\n <img data-ext="{{ item.model.name | fileExtension }}" ng-if="![\'xcel\',\'doc\',\'docx\',\'flv\',\'ppt\',\'pdf\',\'rar\',\'jpeg\',\'png\',\'jpg\',\'mp4\',\'mp3\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" ng-src="static/assets/others.svg">\n <!-- <i class="glyphicon glyphicon-file" ng-if="![\'xcel\',\'docx\',\'flv\',\'ppt\',\'pdf\',\'rar\',\'jpeg\',\'png\',\'jpg\',\'mp4\',\'mp3\'].includes(item.model.name.slice(item.model.name.lastIndexOf(\'.\')+1))" data-ext="{{ item.model.name | fileExtension }}" ng-class="{\'item-extension\': config.showExtensionIcons}"></i> -->\n </span>\n {{(item.model.key||item.model.name) | strLimit : 64}}\n </a>\n </td>\n <td class="hidden-xs">\n <span ng-show="item.model.type !== \'dir\' || config.showSizeForDirectories">\n {{item.model.size | humanReadableFileSize}}\n </span>\n </td>\n <td class="hidden-sm hidden-xs" ng-hide="config.hideDate">\n {{item.model.date | formatDate }}\n </td>\n <td class="hidden-sm hidden-xs" ng-hide="config.hidePermissions">\n {{item.model.perms.toCode(item.model.type === \'dir\'?\'d\':\'-\')}}\n </td>\n </tr>\n </tbody>\n</table>\n'),e.put("src/templates/main.html",'<div class="app-container" ng-click="clickContainer()" ng-controller="FileManagerCtrl" ngf-drop="addForUpload($files)" ngf-drag-over-class="\'upload-dragover\'" ngf-multiple="true">\n\n <div ng-include="config.tplPath + \'/navbar.html\'" ></div>\n\n <div class="container-fluid" >\n <div class="row">\n\n <div class="col-sm-4 col-md-3 sidebar file-tree animated slow fadeIn" ng-include="config.tplPath + \'/sidebar.html\'" ng-show="config.sidebar && fileNavigator.history[0]">\n </div>\n\n <div class="main" ng-class="config.sidebar && fileNavigator.history[0] && \'col-sm-8 col-md-9\'">\n <div ng-include="config.tplPath + \'/\' + viewTemplate" class="main-navigation clearfix"></div>\n </div>\n </div>\n </div>\n\n <button type="button" class="btn btn-primary operation-btn" ng-show="!isPc" ng-disabled="selectIndex === undefined" ng-click="showContextMenuInMobile($event)">操作</button>\n\n <div ng-include="config.tplPath + \'/modals.html\'" ></div>\n <!-- 同步状态 -->\n <div ng-include="config.tplPath + \'/synchroHistory.html\'"></div>\n <div ng-include="config.tplPath + \'/synchroPanel.html\'" ></div>\n <div ng-include="config.tplPath + \'/systemInfo.html\'" ></div>\n <div ng-include="config.tplPath + \'/item-context-menu.html\'" ></div>\n</div>\n'),e.put("src/templates/modals.html",'<div class="modal animated fadeIn" id="imagepreview">\n <div class="modal-dialog">\n <div class="modal-content">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{"preview" | translate}}</h4>\n </div>\n <div class="modal-body">\n <div class="text-center">\n <img id="imagepreview-target" class="preview" alt="{{singleSelection().model.name}}" ng-class="{\'loading\': apiMiddleware.apiHandler.inprocess}">\n <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\n </div>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\n </div>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="videopreview">\n <div class="modal-dialog">\n <div class="modal-content">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal" onclick="document.getElementsByTagName(\'video\')[0].src=\'\';">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{"preview" | translate}}</h4>\n </div>\n <div class="modal-body">\n <div class="text-center">\n <video id="videopreview-target" class="col-xs-12" alt="{{singleSelection().model.name}}" ng-class="{\'loading\': apiMiddleware.apiHandler.inprocess}"></video>\n </div>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="remove">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="remove()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{"confirm" | translate}}</h4>\n </div>\n <div class="modal-body">\n {{\'sure_to_delete\' | translate}} <span ng-include data-src="\'selected-files-msg\'"></span>\n\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess" autofocus="autofocus">{{"remove" | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="move">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="move()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'move\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'move\' | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="rsync">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="rsync()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'rsync\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'rsync\' | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n\n<div class="modal animated fadeIn" id="rename">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="rename()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'rename\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <label class="radio">{{\'enter_new_name_for\' | translate}} <b>{{singleSelection() && singleSelection().model.name}}</b></label>\n <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\n\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'rename\' | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="copy">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="copy()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'copy_file\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <div ng-show="singleSelection()">\n <label class="radio">{{\'enter_new_name_for\' | translate}} <b>{{singleSelection().model.name}}</b></label>\n <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\n </div>\n\n <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"copy" | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="compress">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="compress()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'compress\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\n <div class="label label-success error-msg">{{\'compression_started\' | translate}}</div>\n </div>\n <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\n <div ng-hide="config.allowedActions.compressChooseName">\n {{\'sure_to_start_compression_with\' | translate}} <b>{{singleSelection().model.name}}</b> ?\n </div>\n <div ng-show="config.allowedActions.compressChooseName">\n <label class="radio">\n {{\'enter_file_name_for_compression\' | translate}}\n <span ng-include data-src="\'selected-files-msg\'"></span>\n </label>\n <input class="form-control" ng-model="temp.tempModel.name" autofocus="autofocus">\n </div>\n </div>\n\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\n </div>\n <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'compress\' | translate}}</button>\n </div>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="extract" ng-init="singleSelection().emptyName()">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="extract()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'extract_item\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\n <div class="label label-success error-msg">{{\'extraction_started\' | translate}}</div>\n </div>\n <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\n <label class="radio">{{\'enter_folder_name_for_extraction\' | translate}} <b>{{singleSelection().model.name}}</b></label>\n <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\n </div>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\n </div>\n <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'extract\' | translate}}</button>\n </div>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="edit" ng-class="{\'modal-fullscreen\': fullscreen}">\n <div class="modal-dialog modal-lg">\n <div class="modal-content">\n <form ng-submit="edit()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <button type="button" class="close fullscreen" ng-click="fullscreen=!fullscreen">\n <i class="glyphicon glyphicon-fullscreen"></i>\n <span class="sr-only">{{\'toggle_fullscreen\' | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'edit_file\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <label class="radio bold">{{ singleSelection().model.fullPath() }}</label>\n <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\n <textarea class="form-control code" ng-model="singleSelection().tempModel.content" ng-show="!apiMiddleware.apiHandler.inprocess" autofocus="autofocus"></textarea>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'close\' | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-show="config.allowedActions.edit" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'edit\' | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="newfolder">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="createFolder()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'new_folder\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <label class="radio">{{\'folder_name\' | translate}}</label>\n <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'create\' | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="uploadfile">\n <div class="modal-dialog">\n <div class="modal-content">\n <form>\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{"upload_files" | translate}}</h4>\n </div>\n <div class="modal-body">\n <label class="radio">\n {{"files_will_uploaded_to" | translate}} \n <b>/{{fileNavigator.currentPath.join(\'/\')}}</b>\n </label>\n <button class="btn btn-default btn-block" ngf-select="$parent.addForUpload($files)" ngf-multiple="true">\n {{"select_files" | translate}}\n </button>\n \n <div class="upload-list">\n <ul class="list-group">\n <li class="list-group-item" ng-repeat="(index, uploadFile) in $parent.uploadFileList">\n <button class="btn btn-sm btn-danger pull-right" ng-click="$parent.removeFromUpload(index)">\n ×\n </button>\n <h5 class="list-group-item-heading">{{uploadFile.name}}</h5>\n <p class="list-group-item-text">{{uploadFile.size | humanReadableFileSize}}</p>\n </li>\n </ul>\n <div ng-show="apiMiddleware.apiHandler.inprocess">\n <em>{{"uploading" | translate}}... {{apiMiddleware.apiHandler.progress}}%</em>\n <div class="progress mb0">\n <div class="progress-bar active" role="progressbar" aria-valuenow="{{apiMiddleware.apiHandler.progress}}" aria-valuemin="0" aria-valuemax="100" style="width: {{apiMiddleware.apiHandler.progress}}%"></div>\n </div>\n </div>\n </div>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <div>\n <button type="button" class="btn btn-default" data-dismiss="modal">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="!$parent.uploadFileList.length || apiMiddleware.apiHandler.inprocess" ng-click="uploadFiles()">{{\'upload\' | translate}}</button>\n </div>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="changepermissions">\n <div class="modal-dialog">\n <div class="modal-content">\n <form ng-submit="changePermissions()">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{\'change_permissions\' | translate}}</h4>\n </div>\n <div class="modal-body">\n <table class="table mb0">\n <thead>\n <tr>\n <th>{{\'permissions\' | translate}}</th>\n <th class="col-xs-1 text-center">{{\'read\' | translate}}</th>\n <th class="col-xs-1 text-center">{{\'write\' | translate}}</th>\n <th class="col-xs-1 text-center">{{\'exec\' | translate}}</th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="(permTypeKey, permTypeValue) in temp.tempModel.perms">\n <td>{{permTypeKey | translate}}</td>\n <td ng-repeat="(permKey, permValue) in permTypeValue" class="col-xs-1 text-center" ng-click="main()">\n <label class="col-xs-12">\n <input type="checkbox" ng-model="temp.tempModel.perms[permTypeKey][permKey]">\n </label>\n </td>\n </tr>\n </tbody>\n </table>\n <div class="checkbox" ng-show="config.enablePermissionsRecursive && selectionHas(\'dir\')">\n <label>\n <input type="checkbox" ng-model="temp.tempModel.recursive"> {{\'recursive\' | translate}}\n </label>\n </div>\n <div class="clearfix mt10">\n <span class="label label-primary pull-left" ng-hide="temp.multiple">\n {{\'original\' | translate}}: \n {{temp.model.perms.toCode(selectionHas(\'dir\') ? \'d\':\'-\')}} \n ({{temp.model.perms.toOctal()}})\n </span>\n <span class="label label-primary pull-right">\n {{\'changes\' | translate}}: \n {{temp.tempModel.perms.toCode(selectionHas(\'dir\') ? \'d\':\'-\')}} \n ({{temp.tempModel.perms.toOctal()}})\n </span>\n </div>\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal">{{"cancel" | translate}}</button>\n <button type="submit" class="btn btn-primary" ng-disabled="">{{\'change\' | translate}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n<div class="modal animated fadeIn" id="selector" ng-controller="ModalFileManagerCtrl">\n <div class="modal-dialog">\n <div class="modal-content">\n <div class="modal-header">\n <button type="button" class="close" data-dismiss="modal">\n <span aria-hidden="true">×</span>\n <span class="sr-only">{{"close" | translate}}</span>\n </button>\n <h4 class="modal-title">{{"select_destination_folder" | translate}}</h4>\n </div>\n <div class="modal-body">\n <div>\n <div ng-include="config.tplPath + \'/current-folder-breadcrumb.html\'"></div>\n <div ng-include="config.tplPath + \'/main-table-modal.html\'"></div>\n <hr />\n <button class="btn btn-sm btn-default" ng-click="selectCurrent()">\n <i class="glyphicon"></i> {{"select_this" | translate}}\n </button>\n </div>\n </div>\n <div class="modal-footer">\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\n </div>\n </div>\n </div>\n</div>\n\n<script type="text/ng-template" id="path-selector">\n <div class="panel panel-primary mt10 mb0">\n <div class="panel-body">\n <div class="detail-sources">\n <div class="like-code mr5"><b>{{"selection" | translate}}:</b>\n <span ng-include="\'selected-files-msg\'"></span>\n </div>\n </div>\n <div class="detail-sources">\n <div class="like-code mr5">\n <b>{{"destination" | translate}}:</b> {{ getSelectedPath() }}\n </div>\n <a href="" class="label label-primary" ng-click="openNavigator(fileNavigator.currentPath)">\n {{\'change\' | translate}}\n </a>\n </div>\n </div>\n </div>\n</script>\n\n<script type="text/ng-template" id="error-bar">\n <div class="label label-danger error-msg pull-left animated fadeIn" ng-show="apiMiddleware.apiHandler.error">\n <i class="glyphicon glyphicon-remove-circle"></i>\n <span>{{apiMiddleware.apiHandler.error}}</span>\n </div>\n</script>\n\n<script type="text/ng-template" id="selected-files-msg">\n <span ng-show="temps.length == 1">\n {{singleSelection().model.name}}\n </span>\n <span ng-show="temps.length > 1">\n {{\'these_elements\' | translate:totalSelecteds()}}\n <a href="" class="label label-primary" ng-click="showDetails = !showDetails">\n {{showDetails ? \'-\' : \'+\'}} {{\'details\' | translate}}\n </a>\n </span>\n <div ng-show="temps.length > 1 && showDetails">\n <ul class="selected-file-details">\n <li ng-repeat="tempItem in temps">\n <b>{{tempItem.model.name}}</b>\n </li>\n </ul>\n </div>\n</script>\n'),
e.put("src/templates/navbar.html",'<style>\n .navbar-inverse {\n background-color: #ffffff;\n }\n .middle {\n transform: translateY(5px)\n }\n .logo {width:42px;margin: 0 16px}\n .dropdown-menu {width: 250px}\n .icon {width: 50px;height: 50px;}\n .mt-10px {margin-top: 8px;}\n .mt-34px {margin-top: 34px;}\n .my-34px {margin: 34px 0;}\n</style>\n<nav class="navbar navbar-inverse">\n <div class="container-fluid">\n <div class="row">\n <div class="col-sm-8 col-md-9 hidden-xs ">\n <!-- <img class="logo pull-left middle" src="static/assets/icon.png"> -->\n <div ng-show="!config.breadcrumb">\n <a class="navbar-brand hidden-xs ng-binding" href="">angular-{{"filemanager" | translate}}</a>\n </div>\n <div ng-include="config.tplPath + \'/current-folder-breadcrumb.html\'" ng-show="config.breadcrumb">\n </div>\n </div>\n <div class="col-sm-4 col-md-3">\n <div class="navbar-collapse">\n <div class="navbar-form navbar-right text-right">\n <div class="pull-left visible-xs" ng-if="fileNavigator.currentPath.length">\n <button class="btn btn-primary btn-flat" ng-click="fileNavigator.upDir()">\n <i class="glyphicon glyphicon-chevron-left"></i>\n </button>\n {{fileNavigator.getCurrentFolderName() | strLimit : 12}}\n </div>\n <div class="btn-group" title="搜索">\n <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="dropDownMenuSearch" data-toggle="dropdown" aria-expanded="true">\n <i class="glyphicon glyphicon-search mr2"></i>\n </button>\n <div class="dropdown-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="dropDownMenuLang">\n <input type="text" class="form-control" ng-show="config.searchForm" placeholder="{{\'search\' | translate}}..." ng-model="$parent.query">\n </div>\n </div>\n\n <button class="btn btn-flat btn-sm" ng-click="$parent.setTemplate(\'main-icons.html\')" ng-show="$parent.viewTemplate !==\'main-icons.html\'" title="{{\'icons\' | translate}}">\n <i class="glyphicon glyphicon-th-large"></i>\n </button>\n\n <button class="btn btn-flat btn-sm" ng-click="$parent.setTemplate(\'main-table.html\')" ng-show="$parent.viewTemplate !==\'main-table.html\'" title="{{\'list\' | translate}}">\n <i class="glyphicon glyphicon-th-list"></i>\n </button>\n\n <div class="btn-group" title="语言选择">\n <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="dropDownMenuLang" data-toggle="dropdown" aria-expanded="true">\n <i class="glyphicon glyphicon-globe mr2"></i>\n </button>\n\n <ul class="dropdown-menu scrollable-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="dropDownMenuLang">\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'en\')">English</a></li>\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'zh_cn\')">简体中文</a></li>\n </ul>\n </div>\n\n <div class="btn-group" title="文件操作">\n <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="more" data-toggle="dropdown" aria-expanded="true">\n <i class="glyphicon glyphicon-option-vertical"></i>\n </button>\n\n <ul class="dropdown-menu scrollable-menu animated fast fadeIn pull-right " role="menu" aria-labelledby="more">\n <div >\n <li class="mt-34px col-sm-6 col-md-6 text-center" role="presentation" ng-show="config.allowedActions.createFolder" ng-click="modal(\'newfolder\') && prepareNewFolder()">\n <svg class="icon" aria-hidden="true">\n <use xlink:href="#iconxxinjianwenjianjia"></use>\n </svg>\n <div class="">\n {{"new_folder" | translate}}\n </div>\n </li>\n <li class="mt-34px col-sm-6 col-md-6 text-center" role="presentation" ng-show="config.allowedActions.upload" ng-click="modal(\'uploadfile\')">\n <svg class="icon" aria-hidden="true">\n <use xlink:href="#iconxshangchuanwenjian"></use>\n </svg>\n <div class="">\n {{"upload_files" | translate}}\n </div>\n </li>\n </div>\n <div class="">\n <li class="mt-34px col-sm-6 col-md-6 text-center" role="presentation" ng-click="showStatus(3)">\n <svg class="icon" aria-hidden="true">\n <use xlink:href="#iconxtongbuliebiao"></use>\n </svg>\n <div class=" text-center">\n 同步状态\n </div>\n </li>\n <li class="mt-34px col-sm-6 col-md-6 text-center" role="presentation" ng-click="showProgress(4)">\n <svg class="icon" aria-hidden="true">\n <use xlink:href="#iconxtongbulishi"></use>\n </svg>\n <div class=" text-center">\n 同步历史\n </div>\n </li>\n </div>\n <div class="">\n <li class="mt-34px col-sm-6 col-md-6 text-center" role="presentation" ng-click="showSysteminfo()">\n <svg class="icon" aria-hidden="true">\n <use xlink:href="#iconxxitongxinxi"></use>\n </svg>\n <div class="">\n 系统信息\n </div>\n </li>\n <li class="my-34px col-sm-6 col-md-6 text-center" role="presentation" ng-click="sysReconfig()">\n <svg class="icon" aria-hidden="true">\n <use xlink:href="#iconxxitongpeizhi"></use>\n </svg>\n <div class="">\n 系统配置\n </div>\n </li>\n </div>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</nav>\n'),e.put("src/templates/option.html",'<style>\n .option-box {\n width: 30%;\n height: 35vh;\n border-radius: 5px;\n position: absolute;\n top: 50%;\n left: 50%;\n -webkit-transform: translate(-50%, -50%);\n -moz-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n box-shadow: 1px -1px 10px gray, -1px 1px 10px gray, -1px -1px 10px gray, 1px 1px 10px gray;\n }\n</style>\n<div class="option-box">\n <div ng-show="option.requesting">\n <div ng-include="config.tplPath + \'/spinner.html\'"></div>\n <div style="text-align:center;">加载中,请稍后。。。</div>\n </div>\n <h4 class="text-center">P2PExplorer</h4>\n <div class="form-horizontal" role="form">\n <div class="form-group">\n <label for="token" class="col-sm-3 control-label">token:</label>\n <div class="col-sm-8">\n <input type="text" class="form-control" id="token" ng-model="token_path_config.username" placeholder="请输入token">\n </div>\n </div>\n <div class="form-group">\n <label for="path" class="col-sm-3 control-label">共享路径:</label>\n <div class="col-sm-8">\n <input type="text" class="form-control" id="path" ng-model="token_path_config.sharePath" placeholder="请输入共享路径">\n </div>\n </div>\n <div class="form-group">\n <div class="col-sm-offset-3 col-sm-6">\n <div class="checkbox">\n <label>\n <input type="checkbox" checked ng-model="token_path_flag"> 记住token及路径\n </label>\n </div>\n </div>\n </div>\n <div class="form-group">\n <div class="col-sm-offset-3 col-sm-10">\n <button class="btn btn-primary set" ng-click="setOption()">配置</button>\n <!-- <button type="reset" class="btn btn-default">重置</button> -->\n </div>\n </div>\n </div>\n</div>\n'),e.put("src/templates/sidebar.html",'<ul class="nav nav-sidebar file-tree-root">\n <li ng-repeat="item in fileNavigator.history" ng-include="\'folder-branch-item\'" ng-class="{\'active\': item.name == fileNavigator.currentPath.join(\'/\')}"></li>\n</ul>\n\n<script type="text/ng-template" id="folder-branch-item">\n <a href="" ng-click="fileNavigator.folderClick(item.item)" class="animated fast fadeInDown">\n\n <span class="point">\n <i class="glyphicon glyphicon-chevron-down" ng-show="isInThisPath(item.name)"></i>\n <i class="glyphicon glyphicon-chevron-right" ng-show="!isInThisPath(item.name)"></i>\n </span>\n\n <i class="glyphicon glyphicon-folder-open mr2" ng-show="isInThisPath(item.name)"></i>\n <i class="glyphicon glyphicon-folder-close mr2" ng-show="!isInThisPath(item.name)"></i>\n {{ (item.item.model.key|| item.name.split(\'/\').pop()|| fileNavigator.getBasePath().join(\'/\') || \'/\') | strLimit : 30 }}\n <span ng-show="item.item.model.key!=\'\'">({{item.name.split(\'/\').pop()}})</span>\n </a>\n <ul class="nav nav-sidebar">\n <li ng-repeat="item in item.nodes" ng-include="\'folder-branch-item\'" ng-class="{\'active\': item.name == fileNavigator.currentPath.join(\'/\')}"></li>\n </ul>\n</script>'),e.put("src/templates/spinner.html",'<div class="spinner-wrapper col-xs-12">\n <svg class="spinner-container" style="width:65px;height:65px" viewBox="0 0 44 44">\n <circle class="path" cx="22" cy="22" r="20" fill="none" stroke-width="4"></circle>\n </svg>\n</div>'),e.put("src/templates/synchroDialog.html",'<style>\n h5,\n h6 {\n margin-left: 10px;\n }\n\n .progress-div {\n display: none;\n width: 25%;\n background-color: #fff;\n position: absolute;\n top: 55px;\n right: 5px;\n border-radius: 5px;\n box-shadow: 1px 1px 5px rgba(146, 142, 142, 0.911);\n }\n\n .progress-title>span {\n font-size: 20px;\n font-weight: bold;\n display: inline-block;\n padding: 5px;\n }\n\n .progress-title>button {\n position: absolute;\n right: 20px;\n top: 10px;\n }\n\n .fill-after:after {\n content: \'.\';\n height: 0;\n display: block;\n clear: both;\n visibility: hidden;\n }\n\n .m10 {\n margin: 10px;\n }\n\n .detail-button {\n margin-left: 20px;\n color: #00aaff;\n cursor: pointer\n }\n\n .file-box {\n width: 50px;\n height: 60px;\n border: 1px solid #000;\n float: left;\n padding: 4px;\n line-height: 25px;\n }\n\n .progress-content {\n width: 60%;\n float: left;\n margin: 0 10px;\n }\n\n .center-33p {\n display: inline-block;\n width: 33%;\n text-align: center;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .w28p {\n width: 28%;\n }\n\n .left-63p {\n display: inline-block;\n width: 63%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .cancel-button {\n width: 10%;\n float: left;\n margin-left: 20px;\n color: #00aaff;\n cursor: pointer;\n }\n\n .no-task {\n margin-left: 10px;\n color: red;\n }\n</style>\n<div class="progress-div" id="progress">\n <div class="cogradient-list-history">\n <div class="progress-title">\n <span>同步列表</span>\n <button class="btn btn-default" ng-click="$parent.selectHistoryList(\'cogradient-list-history\',\'history\')">同步历史</button>\n </div>\n <div class="fill-after m10">\n <h5>当前设备:{{cogradient.device.routerId}}</h5>\n <div class="fill-after m10">\n <div class="file-box">文件预览</div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="文件1">文件1</span>\n <span class="center-33p">250KB/s</span>\n </div>\n <div class="progress">\n <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 40%;">\n <span class="sr-only">40% 完成</span>\n </div>\n </div>\n </div>\n <div class="cancel-button">\n 取消\n </div>\n </div>\n <div class="fill-after m10" ng-repeat="item in cogradient.list">\n <div class="file-box">文件预览</div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="{{item.key | formatName}}">{{item.key | formatName}}</span>\n <span class="center-33p" title="{{item.uploadSpeed | formatKB}}KB">{{item.uploadSpeed | formatKB}}KB/s</span>\n </div>\n <div class="progress">\n <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: {{item.progress}}%;"\n title="{{item.progress}}%">\n <span class="sr-only">{{item.progress}}</span>\n </div>\n </div>\n </div>\n <div class="cancel-button" ng-click="cancelTask(item.fromRouter,item.key)">\n 取消\n </div>\n </div>\n </div>\n <div class="fill-after m10">\n <h5>其他设备</h5>\n <div class="fill-after">\n <h6>大爷的电脑\n <span class="detail-button" ng-click="$parent.progress(\'c9\')">收起</span>\n </h6>\n <div style="margin:10px;" id="c9">\n <div class="file-box">文件预览</div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="文件1">文件1</span>\n <span class="center-33p">250KB/s</span>\n </div>\n <div class="progress">\n <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 40%;">\n <span class="sr-only">40% 完成</span>\n </div>\n </div>\n </div>\n <div class="cancel-button">\n 取消\n </div>\n </div>\n </div>\n <div class="fill-after" ng-repeat="item in cogradient.deviceLists">\n <h6>{{item.name}}\n <span class="detail-button" ng-click="$parent.showDetail(item.routerId)">\n <span ng-show="item.hidden">详情</span>\n <span ng-hide="item.hidden">收起</span>\n </span>\n </h6>\n <div class="fill-after m10 detail-show" ng-hide="item.hidden" ng-repeat="subItem in item.list">\n <div class="file-box">文件预览</div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="subItem.key">{{subItem.key}}</span>\n <span class="center-33p">{{subItem.uploadSpeed | formatKB}}KB/s</span>\n </div>\n <div class="progress">\n <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: {{subItem.progress}}%;">\n <span class="sr-only">{{subItem.progress}}% 完成</span>\n </div>\n </div>\n </div>\n <div class="cancel-button" ng-click="cancelTask(subItem.fromRouter,subItem.key)">\n 取消\n </div>\n </div>\n <div class="no-task" ng-show="!item.hidden&&!item.child">当前设备无同步任务</div>\n </div>\n </div>\n </div>\n <div class="cogradient-list-history" style="display:none">\n <div class="progress-title">\n <span>同步历史</span>\n <button class="btn btn-default" ng-click="$parent.selectHistoryList(\'cogradient-list-history\',\'list\')">同步列表</button>\n </div>\n <!-- <div class="fill-after">\n <div class="file-box">文件预览</div>\n <div class="progress-content">\n <div>\n <span class="left-63p">文件1</span>\n <span class="center-33p" style="color:#00aaff;">同步成功!</span>\n </div>\n <div>\n <span class="center-33p">大爷的电脑</span>\n <span class="center-33p w28p">----></span>\n <span class="center-33p">小爷的电脑</span>\n </div>\n </div>\n <div class="cancel-button">\n 再次同步\n </div>\n </div> -->\n <!-- <div class="fill-after">\n <div class="file-box">文件预览</div>\n <div class="progress-content">\n <div>\n <span class="left-63p">文件2</span>\n <span class="center-33p" style="color:red;">同步失败!</span>\n </div>\n <div>\n <span class="center-33p">大爷的电脑</span>\n <span class="center-33p w28p">----></span>\n <span class="center-33p">小爷的电脑</span>\n </div>\n </div>\n <div class="cancel-button">\n 重新同步\n </div>\n </div> -->\n <div class="fill-after m10" ng-repeat="item in $parent.historyTask = cogradient.historyList">\n <div class="file-box">文件预览</div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="{{item.fromPath | formatName}}">{{item.fromPath | formatName}}</span>\n <span></span>\n <span class="center-33p" style="color:red;">{{item.progress}}%</span>\n </div>\n <div>\n <span class="center-33p" title="{{item.fromRouter}}">{{item.fromRouter}}</span>\n <span class="center-33p w28p">----></span>\n <span class="center-33p" title="{{item.toRouter}}">{{item.toRouter}}</span>\n </div>\n </div>\n <div class="cancel-button" ng-click="reSynchro(item)">\n 重新同步\n </div>\n </div>\n </div>\n</div>\n</div>'),e.put("src/templates/synchroHistory.html",'<style>\n\n .panel-default {\n display: none;\n width: 85%;\n background-color: #fff;\n position: absolute;\n top: 55px;\n right: 5px;\n border-radius: 5px;\n box-shadow: 1px 1px 5px rgba(146, 142, 142, 0.911);\n height: 80vh;\n overflow: auto\n }\n\n .panel-heading>button {\n position: absolute;\n right: 20px;\n top: 10px;\n }\n /* .panel-body{\n max-height: 80vh;\n overflow-y: auto;\n } */\n\n .fill-after:after {\n content: \'.\';\n height: 0;\n display: block;\n clear: both;\n visibility: hidden;\n }\n\n .m10 {\n margin: 10px;\n }\n\n .detail-button {\n margin-left: 20px;\n color: #00aaff;\n cursor: pointer\n }\n\n .file-box {\n width: 50px;\n height: 60px;\n /* border: 1px solid #000; */\n float: left;\n /* padding: 4px;\n line-height: 25px; */\n }\n\n .progress-content {\n width: 60%;\n float: left;\n margin: 0 10px;\n }\n\n .center-33p {\n display: inline-block;\n width: 33%;\n text-align: center;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .w28p {\n width: 28%;\n }\n\n .left-63p {\n display: inline-block;\n width: 63%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .cancel-button {\n width: 10%;\n float: left;\n margin-left: 20px;\n color: #00aaff;\n cursor: pointer;\n }\n\n .no-task {\n margin-left: 10px;\n color: red;\n }\n\n .mask {\n position: fixed;\n /* background-color: gray; */\n width: 100%;\n height: 100%;\n opacity: 0.5;\n z-index: 3;\n }\n .left-file-icon {\n width: 26px;\n height: 32px;\n }\n .bg-progress {\n /* background: rgba(21,126,251,0.15); */\n /* background-image: url(\'static/assets/bg-progress.png\'); */\n background-position: 10%;\n background-repeat: no-repeat;\n }\n</style>\n<div class="panel panel-default" id="sync-history" style="display:none">\n <div class="panel-heading history-list" >\n 同步状态\n </div>\n <div class=" list-history" style="display:block">\n <div class="fill-after">\n <h5 class="px-10px">当前设备:{{cogradient.device.name}}</h5>\n <div class="fill-after m10" ng-repeat="item in cogradient.list">\n <div ng-show="item.isDir">\n <h6 title="{{item.key | formatName}}">\n <span class="left-63p" style="width:50%;" title="{{item.key | formatName}}">---文件夹: {{item.key | formatName}} start---</span>\n <span class="center-33p" title="{{item.uploadSpeed | formatKB}}kb">\n {{item.uploadSpeed | formatKB}}kb/s</span>\n <span class="center-33p" ng-click="cancelTask(item.fromRouter,item.key)" style="width:10%;color:#00aaff;cursor:pointer;margin-left:10px;">取消</span>\n </h6>\n <div ng-repeat="subItem in item.childs" ng-include="\'synchro-branch-item\'"></div>\n <h6>---文件夹:{{item.key | formatName}} end---</h6>\n </div>\n <!-- 文件 -->\n <div ng-hide="item.isDir">\n <div class="file-box">\n <img src="/static/assets/music.svg" alt="">\n </div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="{{item.key | formatName}}">{{item.key | formatName}}</span>\n <span class="center-33p" title="{{item.uploadSpeed | formatKB}}kb">{{item.uploadSpeed | formatKB}}kb/s</span>\n </div>\n <div class="progress">\n <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: {{item.progress}}%;"\n title="{{item.progress}}%">\n <span class="sr-only">{{item.progress}}</span>\n </div>\n </div>\n </div>\n <div class="cancel-button" ng-click="cancelTask(item.fromRouter,item.key)">\n 取消\n </div>\n </div>\n </div>\n <script type="text/ng-template" id="synchro-branch-item">\n <div class="fill-after">\n <div ng-show="subItem.isDir">\n <h6 title="{{subItem.key | formatName}}">\n <span class="left-63p" style="width:50%;" title="{{subItem.key | formatName}}">---文件夹: {{subItem.key | formatName}} start---</span>\n <span class="center-33p" title="{{subItem.uploadSpeed | formatKB}}kb">\n {{subItem.uploadSpeed | formatKB}}kb/s</span>\n <span class="center-33p" ng-click="cancelTask(subItem.fromRouter,item.key)" style="width:10%;color:#00aaff;cursor:pointer;margin-left:10px;">取消</span>\n </h6>\n <div ng-repeat="subItem in subItem.childs" ng-include="\'synchro-branch-item\'"></div>\n <h6>---文件夹:{{subItem.key | formatName}} end---</h6>\n </div>\n <div ng-hide="subItem.isDir">\n <div class="file-box">\n <img src="/static/assets/music.svg" alt="">\n </div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="{{subItem.key | formatName}}">{{subItem.key | formatName}}</span>\n <span class="center-33p" title="{{subItem.uploadSpeed | formatKB}}kb/s">{{subItem.uploadSpeed | formatKB}}kb/s</span>\n </div>\n <div class="progress">\n <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: {{subItem.progress}}%;"\n title="{{subItem.progress}}%">\n <span class="sr-only">{{subItem.progress}}</span>\n </div>\n </div>\n </div>\n <div class="cancel-button" ng-click="cancelTask(subItem.fromRouter,subItem.key)">\n 取消\n </div>\n </div>\n </div>\n </script>\n </div>\n <div class="fill-after">\n <h5 class="px-10px">其他设备</h5>\n <div class="fill-after" ng-repeat="item in cogradient.deviceLists">\n <h6 class="px-10px">{{item.name}}\n <span class="detail-button" ng-click="$parent.showDetail(item.routerId)">\n <span ng-show="item.hidden">详情</span>\n <span ng-hide="item.hidden">收起</span>\n </span>\n </h6>\n <div ng-hide="item.hidden" ng-repeat="subItem in item.list">\n <div class="" ng-show="subItem.isDir">\n <!-- <div>\n <img class="left-file-icon" src="static/assets/others.svg" alt="">\n </div>\n <div class="progress-content flex-auto">\n <span class="left-63p fs-14px" title="{{subItem.key | formatName}}">666666{{subItem.key | formatName}}</span>\n \n <div class="flex justify-between fs-10px c-75">\n <span class="" title="{{subItem.uploadSpeed | formatKB}}kb/s">{{subItem.uploadSpeed | formatKB}}kb/s</span>\n </div>\n </div>\n <div class="cancel-button">\n <svg class="w-8px" ng-show="subItem.progress !=100" ng-click="reSynchro(subItem)" aria-hidden="true">\n <use xlink:href="#iconxtongbuzhuangtai"></use>\n </svg>\n <svg class="w-8px" ng-show="subItem.progress ==100" aria-hidden="true">\n <use xlink:href="#iconxlvdian"></use>\n </svg>\n <svg class="w-8px" ng-show="subItem.progress !=100" ng-click="reSynchro(subItem)" aria-hidden="true">\n <use xlink:href="#iconxhuidian"></use>\n </svg>\n </div>\n <div ng-repeat="subItem in subItem.childs" ng-include="\'synchro-branch-item\'"></div> -->\n\n <!-- before -->\n <!-- <div class="file-box">\n <img src="/static/assets/others.svg" alt="">\n </div> -->\n <h6 title="{{subItem.key | formatName}}">\n <span class="left-63p" style="width:48%;" title="{{subItem.key | formatName}}">---文件夹: {{subItem.key | formatName}} start---</span>\n <span class="center-33p" title="{{item.uploadSpeed | formatKB}}kb">\n {{subItem.uploadSpeed | formatKB}}kb/s</span>\n <span class="center-33p" ng-click="cancelTask(subItem.fromRouter,item.key)" style="width:10%;color:#00aaff;cursor:pointer;margin-left:10px;">取消</span>\n </h6>\n <div ng-repeat="subItem in subItem.childs" ng-include="\'synchro-branch-item\'"></div>\n <h6>---文件夹:{{subItem.key | formatName}} end---</h6>\n </div>\n <div ng-hide="subItem.isDir">\n <div class="file-box">\n <img class="left-file-icon" src="static/assets/others.svg" alt="">\n </div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="subItem.key">{{subItem.key}}</span>\n <span class="center-33p">{{subItem.uploadSpeed | formatKB}}kb/s</span>\n </div>\n <div class="progress">\n <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: {{subItem.progress}}%;">\n <span class="sr-only">{{subItem.progress}}% 完成</span>\n </div>\n </div>\n </div>\n <div class="cancel-button" ng-click="cancelTask(subItem.fromRouter,subItem.key)">\n 取消\n </div>\n </div>\n </div>\n <div class="no-task" ng-show="!item.hidden&&!item.child">当前设备无同步任务</div>\n </div>\n <script type="text/ng-template" id="synchro-branch-item">\n <div class="fill-after">\n <div ng-show="subItem.isDir">\n <h6 title="{{subItem.key | formatName}}">\n <span class="left-63p" style="width:50%;" title="{{subItem.key | formatName}}">---文件夹: {{subItem.key | formatName}} start---</span>\n <span class="center-33p" title="{{subItem.uploadSpeed | formatKB}}kb">\n {{subItem.uploadSpeed | formatKB}}kb/s</span>\n <span class="center-33p" ng-click="cancelTask(subItem.fromRouter,item.key)" style="width:10%;color:#00aaff;cursor:pointer;margin-left:10px;">取消</span>\n </h6>\n <div ng-repeat="subItem in subItem.childs" ng-include="\'synchro-branch-item\'"></div>\n <h6>---文件夹:{{subItem.key | formatName}} end---</h6>\n </div>\n <div ng-hide="subItem.isDir">\n <div class="file-box">\n <img src="/static/assets/music.svg" alt="">\n </div>\n <div class="progress-content">\n <div>\n <span class="left-63p" title="{{subItem.key | formatName}}">{{subItem.key | formatName}}</span>\n <span class="center-33p" title="{{subItem.uploadSpeed | formatKB}}kb/s">{{subItem.uploadSpeed | formatKB}}kb/s</span>\n </div>\n <div class="progress">\n <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: {{subItem.progress}}%;"\n title="{{subItem.progress}}%">\n <span class="sr-only">{{subItem.progress}}</span>\n </div>\n </div>\n </div>\n <div class="cancel-button" ng-click="cancelTask(subItem.fromRouter,subItem.key)">\n 取消\n </div>\n </div>\n </div>\n </script>\n </div>\n</div>\n'),
e.put("src/templates/synchroPanel.html",'<style>\n\n .panel-default {\n display: none;\n width: 85%;\n background-color: #fff;\n position: absolute;\n top: 55px;\n right: 5px;\n border-radius: 5px;\n box-shadow: 1px 1px 5px rgba(146, 142, 142, 0.911);\n height: 80vh;\n overflow: auto\n }\n\n .panel-heading>button {\n position: absolute;\n right: 20px;\n top: 10px;\n }\n /* .panel-body{\n max-height: 80vh;\n overflow-y: auto;\n } */\n\n .fill-after:after {\n content: \'.\';\n height: 0;\n display: block;\n clear: both;\n visibility: hidden;\n }\n\n .m10 {\n padding: 10px;\n }\n\n .detail-button {\n margin-left: 20px;\n color: #00aaff;\n cursor: pointer\n }\n\n .file-box {\n width: 26px;\n height: 32px;\n float: left;\n }\n\n .progress-content {\n width: 60%;\n float: left;\n margin: 0 10px;\n line-height: 1.3;\n }\n\n .center-33p {\n display: inline-block;\n width: 33%;\n text-align: center;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .w28p {\n width: 28%;\n }\n\n .left-63p {\n display: inline-block;\n width: 63%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .cancel-button {\n width: 10%;\n float: left;\n /* margin-left: 20px; */\n color: #00aaff;\n cursor: pointer;\n }\n\n .no-task {\n margin-left: 10px;\n color: red;\n }\n\n .mask {\n position: fixed;\n /* background-color: gray; */\n width: 100%;\n height: 100%;\n opacity: 0.5;\n z-index: 3;\n }\n\n .left-file-icon {\n width: 26px;\n height: 32px;\n }\n .bg-progress {\n /* background: rgba(21,126,251,0.15); */\n /* background-image: url(\'static/assets/bg-progress.png\'); */\n background-position: 10%;\n background-repeat: no-repeat;\n }\n</style>\n<div class="panel panel-default" id="progress">\n <div class="panel-heading history-list" style="display:block;">\n 同步历史\n <!--<button class="btn btn-primary btn-sm" ng-click="$parent.selectHistoryList(\'history-list\',\'list\')">同步列表</button>-->\n </div>\n <div class="history-list" style="display:block;">\n <div ng-show="cogradient.requesting">\n <div ng-include="config.tplPath + \'/spinner.html\'"></div>\n <div style="text-align:center;">加载中,请稍后。。。</div>\n </div>\n <div class="m10 my-10px flex align-center bg-progress" ng-repeat="item in $parent.historyTask = cogradient.historyList">\n <div >\n <img class="left-file-icon" src="static/assets/others.svg" alt="">\n </div>\n <div class="progress-content flex-auto">\n <span class="left-63p fs-14px" title="{{item.fromPath | formatName}}">{{item.fromPath | formatName}}</span>\n\n <!-- <span class="center-33p" style="color:red;" ng-show="item.progress !=100">同步失败</span>\n <span class="center-33p" style="color:blue;" ng-hide="item.progress !=100">同步成功</span> -->\n <div ng-show="item.progress !=100" style="color: red;">{{item.error}}</div>\n\n <div class="flex justify-between fs-10px c-75">\n <span class="" title="{{item.fromRouterName}}">{{item.fromRouterName}}->{{item.toRouterName}}</span>\n <span class="" title="{{item.toRouterName}}"></span>\n </div>\n </div>\n <div class="cancel-button" >\n <!-- <span ng-show="item.progress !=100">重新同步</span>\n <span ng-hide="item.progress !=100">再次同步</span> -->\n <svg class="w-8px" ng-show="item.progress !=100" ng-click="reSynchro(item)" aria-hidden="true">\n <use xlink:href="#iconxtongbuzhuangtai"></use>\n </svg>\n <svg class="w-8px" ng-show="item.progress ==100" aria-hidden="true">\n <use xlink:href="#iconxlvdian"></use>\n </svg>\n <!-- 失败 -->\n <svg class="w-8px" ng-show="item.progress !=100" ng-click="reSynchro(item)" aria-hidden="true">\n <use xlink:href="#iconxhuidian"></use>\n </svg>\n </div>\n </div>\n <div>\n\n </div>\n </div>\n</div>\n'),e.put("src/templates/systemInfo.html",'<style>\n .panel-default {\n display: none;\n width: 360px;\n background-color: #fff;\n position: absolute;\n top: 55px;\n right: 5px;\n border-radius: 5px;\n box-shadow: 1px 1px 5px rgba(146, 142, 142, 0.911);\n height: 80vh;\n overflow: auto\n\n }\n\n .fill-after:after {\n content: \'.\';\n height: 0;\n display: block;\n clear: both;\n visibility: hidden;\n }\n\n .info{\n font-size: 12px;\n /*line-height: 5px;*/\n }\n\n .abinfo{\n font-size: 12px;\n color: #FF7F24;\n }\n\n #dlist ul li{\n list-style-type:none;\n }\n</style>\n<div class="panel panel-default" id="systeminfo">\n <div class="panel-heading" style="display:block">\n 系统信息\n </div>\n <div class="panel-body" style="display:block">\n <div class="fill-after">\n <p class="info">外网TCP: <span id="wtcp"></span></p>\n <p class="info">外网UDP: <span id="wudp"></span></p>\n <p class="info">内网TCP: <span id="ntcp"></span></p>\n <p class="info">NAT类型: <span id="nattype"></span></p>\n <p class="info">设备分享: <span id="routerid"></span></p>\n <p class="info">共享密钥:<a href="#" onclick="$(\'#shareKey\').show();">点击显示</a><br><span style="display: none;" id="shareKey"></span></p>\n <p class="info">共享路径: <span id="sharePath"></span></p>\n <p class="info">用户令牌:<a href="#" onclick="$(\'#userToken\').show();">点击显示</a><br><span style="display: none;" id="userToken"></span></p>\n <p class="info">当前版本: <span id="version"></span></p>\n <p class="info">最新版本: <span id="newversion"></span></p>\n <div>\n <p><b>设备连接状态</b> (<a href="#" onclick="$(\'#dlist\').show();">点击显示</a>)</p>\n <div id="dlist" style="display: none;">\n </div>\n </div>\n <div id="aboutus">\n <p><b>贡献列表</b> (<a href="#" onclick="$(\'.abinfo\').show();">点击显示</a>)</p>\n <p class="abinfo" style="display: none;">1. 服务器端 winkidney<br>2. Web端 JSMonkey, 峰<br>3. 客户端 小宝<br>4. Android TODO<br>5. iOS TODO<br>6. 群辉插件 fw867<br>7. 梅林插件 clang<br>8. 测试与教程 bbis</p>\n </div>\n </div>\n </div>\n</div>\n')}]);