Compare commits

..

33 Commits
v3.4 ... v3.5

Author SHA1 Message Date
Matt Pass
ae864faa84 Version 3.5 2014-01-16 14:50:10 +00:00
Matt Pass
bfea966a14 Replace on SCRIPT_FILENAME
By replacing on this rather than __FILE__, we have a full file path and
can actually exclude the current working folder
2014-01-16 14:15:34 +00:00
Matt Pass
58e7c5ec42 preg_replace to remove full path prefix
Use preg_replace to only replace the first instance on a full path to
make it local
Avoids str_replace replacing all instances in the string
2014-01-15 10:39:31 +00:00
Matt Pass
080aaea4f7 Exclude from FM if its the ICEcoder dir 2014-01-11 17:44:22 +00:00
Matt Pass
eb634555df Exclude the dir ICEcoder is running from
After globalling $docRoot and $ICEcodeDir, work out a $localPath for the
file we have a result for
If our results match, we are looking in the ICEcoder dir and should
exclude as a result
2014-01-11 17:43:17 +00:00
Matt Pass
d42ea6f54b Establish the dir that ICEcoder is running from
Used to exclude from file manager and search results
2014-01-11 17:41:14 +00:00
Matt Pass
3c4a0eba6d _coder and ICEcoder no longer part of arrays
These 2 values were originally set to exclude showing ICEcoder based
files in the search results and file manager. However, some users will
install ICEcoder to another dir name, so removed these hardcoded values
from here and excluding in a better way in both instances.
2014-01-11 17:39:46 +00:00
Matt Pass
a7f3205edb Use left/right value from pluginPanelAligned to 0 2014-01-11 16:40:44 +00:00
Matt Pass
71875e8f5b pluginPanelAligned param passed to function
Contains left/right value, sets left and right values on plugins DIV
2014-01-11 16:39:20 +00:00
Matt Pass
bccc613de0 Allow updating of pluginPanelAligned
Also passed param to useNewSettings to update in the current browser
session
2014-01-11 16:36:00 +00:00
Matt Pass
accf9b0936 Plugin panel aligned option added
Allows user to set it to be left/right
2014-01-11 16:33:24 +00:00
Matt Pass
aa5ee237c9 Removed left: 0 value, now set via settings & JS 2014-01-11 16:31:57 +00:00
Matt Pass
1024c3ff50 pluginPanelAligned option added 2014-01-11 16:30:09 +00:00
Matt Pass
1c915d81da Added loginRequired bool
So you can choose if you need a login screen or not, true by default
2014-01-11 15:49:31 +00:00
Matt Pass
31aceb7226 Refactored and improved settings.php file
Moved huge chunks of isolated code to their own files
Reordered and improved remaining code
Lots of die messages added to stop code continuing after a header
location
!loginRequired now also setting loggedIn = true as demoMode does
Boot user to new login page instead of back to this page
loginRequired added to final elseif condition
Added 2 big notes re probably showing he login screen and continuing
with what we're doing
2014-01-11 15:48:23 +00:00
Matt Pass
8f06223c07 Display of plugins now handled here
Handled here rather than in settings.php file
$onLoadExtras = ""; and $pluginsDisplay = ""; also set here
No need to recreate the plugins array from POST'd values, now picked up
from a page load
If isset($_GET['updatedPlugins']) then update the new pluginsOptional
DIV innerHTML, no need to also check if the DIV exists
Also restart the plugin intervals upon $_GET['updatedPlugins']
No longer tacking content visibility onto $onLoadExtras
2014-01-11 15:36:27 +00:00
Matt Pass
73047549a6 Login now on own page, seperated from settings
No longer part of settings.php
Alt tag added to logo
Form action is now to login.php
Tabbing and line breaking around username now improved for source code
reading purposes only
2014-01-11 15:18:47 +00:00
Matt Pass
ade86eda6b previousFiles and last10Files updated here now 2014-01-11 15:15:44 +00:00
Matt Pass
03c0842ba2 Common settings/functions now in own file 2014-01-11 15:14:04 +00:00
Matt Pass
5dcfe80e71 Update condition moved to own include file
repPosEnd also now to plugins, not previousFiles, as moved position in
array
Plugins no longer updated here
2014-01-11 15:12:18 +00:00
Matt Pass
3e0f41b585 Removed plugins from settings screen
Added anagnam to credits as he let kindly me use webspace to test fixes
Plugins removed from settings screen now, set via plugin manager
FM root input field moved up now plugins area has gone
2014-01-11 15:07:40 +00:00
Matt Pass
887c7c1873 Plugins textarea not part of settings screen now 2014-01-11 15:03:35 +00:00
Matt Pass
67ab6c8f9c repPosEnd now to previousFiles, GET QS on update
End point immediately after plugins is now previousFiles as plugins has
moved in the array order
Tacked ?updatedPlugins onto the URL so we can pick this up and know what
to also action in plugins-manager.php
2014-01-11 15:02:31 +00:00
Matt Pass
af0e81e690 Position of plugins array moved
It's now updated from manager, not from settings screen
2014-01-11 14:59:39 +00:00
Matt Pass
e54d735614 Set content vis onLoad, plugins DIV, zip optional
Set visibility of content onload here, not tacked onto end of
$onLoadExtras
$pluginsDisplay now wrapped in a DIV with an id as a hook so it's
updateable
Only if we have the Zip-It! plugin should we display the option to zip
the file, as the plugin is optional now
2014-01-11 14:58:52 +00:00
Matt Pass
d298de35cf Copyright 2014 now 2014-01-11 14:45:02 +00:00
Matt Pass
c55c154856 Added note re setting perms on plugins dir also 2013-12-29 14:45:21 +00:00
Matt Pass
4a36e1ec64 showManual section and pluginManager function
showManual function can now take a section param and append to iFrame
URL to target a section of the manual if required. Used from Plugin
Manager only for now.
pluginsManager is a new function to display the Plugins Manager on
demand
2013-12-29 14:44:56 +00:00
Matt Pass
53d712b0ba Plugins Manager added
Allows you to install/uninstall as well as update the details of
installed plugins
2013-12-29 14:41:18 +00:00
Matt Pass
801597f91f Link to plugins manager added 2013-12-29 14:32:15 +00:00
Matt Pass
af0de2020e Plugins removed 2013-12-29 14:29:25 +00:00
Matt Pass
1a5540de98 Keep the plugins dir 2013-12-29 14:28:21 +00:00
Matt Pass
bac9dd697c Plugins removed
Plugins are no longer supplied with ICEcoder itself but now available to
install/uninstall remotely
2013-12-29 14:28:08 +00:00
47 changed files with 698 additions and 3530 deletions

View File

@@ -1,4 +1,4 @@
Copyright: © 2013 Matt Pass
Copyright: © 2014 Matt Pass
Website: mattpass.com
Email: matt@mattpass.com
Twitter: @mattpass

View File

@@ -3,7 +3,7 @@
ICEcoder is a web IDE / browser based code editor, which allows you to develop websites directly within the web browser. It uses the brilliant CodeMirror for code highlighting & editing, with a slick IDE wrapped around it to make the whole thing work.
<img src="http://icecoder.net/images/icecoder-v3-4-browser-code-editor.png" alt="ICEcoder web IDE">
<img src="http://icecoder.net/images/icecoder-v3-5-browser-code-editor.png" alt="ICEcoder web IDE">
###Requirements
You can run ICEcoder either online or locally, on Linux, Windows or Mac based platforms. The only requirement is to have PHP 5 available (5.3 recommended). You can have this either as a vanilla installation or via a program such as WAMP or XAMPP (for Windows) or MAMP (for Mac).
@@ -19,7 +19,7 @@ $ git clone git://github.com/mattpass/ICEcoder.git
####Step 2: Place in your document root (online or local)
```
Put in a new sub-dir URL such as yourdomain.com/_coder or localhost/_coder
Set write permissions (757 or 775 depending on your system) on the 'backups', 'lib', 'test' and 'tmp' folders
Set write permissions (757 or 775 depending on your system) on the 'backups', 'lib', 'plugins', 'test' and 'tmp' folders
(Note: A small number of hosts give internal server error here, if you get this, try 755 instead)
```

View File

@@ -78,7 +78,7 @@ window.onbeforeunload = function() {
echo "'".$ICEcoder["tagWrapperCommand"]."'";
echo ';top.ICEcoder.autoComplete = ';
echo "'".$ICEcoder["autoComplete"]."'";
?>;ICEcoder.init()<?php echo $updateMsg.$onLoadExtras;?>;top.ICEcoder.filesFrame.contentWindow.frames['processControl'].location.href = 'processes/on-load.php';" onResize="ICEcoder.setLayout()" onKeyDown="return ICEcoder.interceptKeys('coder',event);" onKeyUp="parent.ICEcoder.resetKeys(event);">
?>;ICEcoder.init()<?php echo $updateMsg.$onLoadExtras;?>;top.ICEcoder.content.style.visibility='visible';top.ICEcoder.filesFrame.contentWindow.frames['processControl'].location.href = 'processes/on-load.php';" onResize="ICEcoder.setLayout()" onKeyDown="return ICEcoder.interceptKeys('coder',event);" onKeyUp="parent.ICEcoder.resetKeys(event);">
<div id="blackMask" class="blackMask" onClick="if (!ICEcoder.overPopup) {ICEcoder.showHide('hide',this)}" onContextMenu="return false">
<div class="popupVCenter">
@@ -95,12 +95,13 @@ window.onbeforeunload = function() {
</div>
</div>
<div id="plugins" class="plugins" onMouseOver="top.ICEcoder.showHidePlugins('show')" onMouseOut="top.ICEcoder.showHidePlugins('hide')" onClick="top.ICEcoder.showHidePlugins('hide')">
<div id="plugins" class="plugins" style="<?php echo $ICEcoder["pluginPanelAligned"];?>: 0" onMouseOver="top.ICEcoder.showHidePlugins('show')" onMouseOut="top.ICEcoder.showHidePlugins('hide')" onClick="top.ICEcoder.showHidePlugins('hide')">
<div style="padding: 15px">
<a nohref onClick="top.ICEcoder.showColorPicker(top.document.getElementById('color') ? top.document.getElementById('color').value : '#123456')" title="Farbtastic
Color picker"><img src="images/color-picker.png" style="cursor: pointer" alt="Color Picker"></a><br><br>
<a nohref onClick="top.ICEcoder.openTerminal()" title="Terminal"><img src="images/terminal.png" style="cursor: pointer" alt="Terminal"></a><br><br>
<?php echo $pluginsDisplay; ?>
<div id="pluginsOptional"><?php echo $pluginsDisplay; ?></div>
<a nohref onclick="top.ICEcoder.pluginsManager()" title="Plugins Manager" style="color: #fff; cursor: pointer">+ / -</a>
</div>
</div>
@@ -130,7 +131,11 @@ Color picker"><img src="images/color-picker.png" style="cursor: pointer" alt="Co
<a nohref onClick="window.open(iceRoot + top.ICEcoder.rightClickedFile.replace(/\|/g,'/'))" onMouseOver="ICEcoder.showFileMenu()" style="cursor: pointer">View Webpage</a>
</span>
<div onMouseOver="ICEcoder.showFileMenu()" style="padding: 2px 0"><hr></div>
<a href="javascript:top.ICEcoder.zipIt(top.ICEcoder.rightClickedFile)" onMouseOver="ICEcoder.showFileMenu()">Zip It!</a>
<?php
if (file_exists(dirname(__FILE__)."/plugins/zip-it/index.php")) {
echo '<a href="javascript:top.ICEcoder.zipIt(top.ICEcoder.rightClickedFile)" onMouseOver="ICEcoder.showFileMenu()">Zip It!</a>'.PHP_EOL;
};
?>
<a href="javascript:top.ICEcoder.downloadFile(top.ICEcoder.rightClickedFile)" onMouseOver="ICEcoder.showFileMenu()">Download</a>
<div onMouseOver="ICEcoder.showFileMenu()" style="padding: 2px 0"><hr></div>
<a href="javascript:top.ICEcoder.propertiesScreen(top.ICEcoder.rightClickedFile)" onMouseOver="ICEcoder.showFileMenu()">Properties</a>

View File

@@ -1,11 +1,12 @@
<?php
// ICEcoder system settings
$ICEcoderSettings = array(
"versionNo" => "3.4",
"versionNo" => "3.5",
"codeMirrorDir" => "CodeMirror-3.20",
"docRoot" => $_SERVER['DOCUMENT_ROOT'],
"demoMode" => false,
"devMode" => false,
"loginRequired" => true,
"multiUser" => false,
"lineEnding" => "\n"
);

View File

@@ -1,31 +1,26 @@
<?php
$ICEcoderUserSettings = array(
"versionNo" => "3.4",
"versionNo" => "3.5",
"root" => "",
"checkUpdates" => true,
"openLastFiles" => true,
"findFilesExclude" => array("_coder","ICEcoder",".doc",".gif",".jpg",".jpeg",".pdf",".png",".swf",".xml",".zip"),
"findFilesExclude" => array(".doc",".gif",".jpg",".jpeg",".pdf",".png",".swf",".xml",".zip"),
"codeAssist" => true,
"visibleTabs" => false,
"lockedNav" => true,
"tagWrapperCommand" => "ctrl+alt",
"autoComplete" => "ctrl+space",
"password" => "",
"bannedFiles" => array("_coder","ICEcoder"),
"bannedFiles" => array(),
"bannedPaths" => array("/var/www/.git","/var/www/sites/all/modules","/var/www/sites/default/files"),
"allowedIPs" => array("*"),
"plugins" => array(
array("Adminer MySQL database manager","plugins/adminer/icon.png","margin-left: 2px","plugins/adminer/adminer-3.7.1-mysql-en.php","_blank",""),
array("Emmet Snippet type booster","plugins/emmet/icon.png","","http://docs.emmet.io","_blank",""),
array("CSS Beautify Tidy up your CSS","plugins/cssbeautify/icon.png","","plugins/cssbeautify","fileControl:<b>Tidying your CSS</b>",""),
array("ICErepo Github repo manager","plugins/ice-repo/icon.png","","plugins/ice-repo","_blank",""),
array("Zip It! File/folder zip utility","plugins/zip-it/icon.png","margin-left: 3px","plugins/zip-it/?zip=|&exclude=*.doc*.gif*.jpg*.jpeg*.pdf*.png*.swf*.xml*.zip","fileControl:<b>Zipping Files</b>","30")
),
"theme" => "default",
"fontSize" => "13px",
"lineWrapping" => true,
"indentWithTabs" => true,
"indentSize" => 4,
"pluginPanelAligned" => "left",
"plugins" => array(),
"previousFiles" => "",
"last10Files" => ""
);

View File

@@ -23,6 +23,9 @@ foreach($finalArray as $entry) {
for ($i=0;$i<count($_SESSION['bannedFiles']);$i++) {
if(strpos($entry,$_SESSION['bannedFiles'][$i])!==false) {$canAdd = false;}
}
if ("/".$entry == $ICEcoderDir) {
$canAdd = false;
}
if ($entry != "." && $entry != ".." && $canAdd) {
is_dir($docRoot.$iceRoot.$location."/".$entry)
? array_push($dirArray,$location."/".$entry)

View File

@@ -50,7 +50,7 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
100% {transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}
}
.plugins {position: absolute; display: inline-block; width: 3px; height: 100%; top: 0; left: 0; background: transparent; overflow: hidden; z-index: 3;
.plugins {position: absolute; display: inline-block; width: 3px; height: 100%; top: 0; background: transparent; overflow: hidden; z-index: 3;
transition: all 0.07s ease-out;
}

View File

@@ -1769,8 +1769,11 @@ var ICEcoder = {
},
// Show the ICEcoder manual, loaded remotely
showManual: function(version) {
top.get('mediaContainer').innerHTML = '<iframe src="http://icecoder.net/manual?version='+version+'" class="whiteGlow" style="width: 500px; height: 500px"></iframe>';
showManual: function(version,section) {
var sectionExtra;
sectionExtra = section ? "#"+section : "";
top.get('mediaContainer').innerHTML = '<iframe src="http://icecoder.net/manual?version='+version+sectionExtra+'" class="whiteGlow" style="width: 500px; height: 500px"></iframe>';
top.ICEcoder.showHide('show',top.get('blackMask'));
},
@@ -1780,8 +1783,14 @@ var ICEcoder = {
top.ICEcoder.showHide('show',top.get('blackMask'));
},
// Show the plugins manager
pluginsManager: function() {
top.get('mediaContainer').innerHTML = '<iframe src="lib/plugins-manager.php" class="whiteGlow" style="width: 800px; height: 450px"></iframe>';
top.ICEcoder.showHide('show',top.get('blackMask'));
},
// Update the settings used when we make a change to them
useNewSettings: function(themeURL,codeAssist,lockedNav,tagWrapperCommand,autoComplete,visibleTabs,fontSize,lineWrapping,indentWithTabs,indentSize,refreshFM) {
useNewSettings: function(themeURL,codeAssist,lockedNav,tagWrapperCommand,autoComplete,visibleTabs,fontSize,lineWrapping,indentWithTabs,indentSize,pluginPanelAligned,refreshFM) {
var styleNode, strCSS, cMCSS, activeLineBG;
// Add new stylesheet for selected theme
@@ -1833,6 +1842,9 @@ var ICEcoder = {
top.ICEcoder.autoComplete = autoComplete;
}
top.get('plugins').style.left = pluginPanelAligned == "left" ? "0" : "auto";
top.get('plugins').style.right = pluginPanelAligned == "right" ? "0" : "auto";
// Finally, refresh the file manager if we need to
if (refreshFM) {top.ICEcoder.refreshFileManager()};
},

35
lib/ice-coder.min.js vendored
View File

@@ -39,11 +39,11 @@ b+"?")&&(top.ICEcoder.serverQueue("add","lib/file-control.php?action=delete&file
a[0].lastIndexOf("|"));top.ICEcoder.pasteFiles(a);"undefined"!=typeof b&&(top.ICEcoder.copiedFiles=b)},uploadFilesSelect:function(a){top.get("uploadDir").value=a;top.get("fileInput").click()},uploadFilesSubmit:function(a){""!=top.get("fileInput").value&&(top.ICEcoder.showHide("show",top.get("loadingMask")),top.get("uploadFilesForm").submit(),event.preventDefault())},showMenu:function(a){var b,c;0!=top.ICEcoder.selectedFiles.length&&-1!=top.ICEcoder.selectedFiles.indexOf(top.ICEcoder.rightClickedFile.replace(/\//g,
"|"))||top.ICEcoder.selectFileFolder(a);a=129;c=window.innerHeight;"undefined"!=typeof top.ICEcoder.thisFileFolderLink&&""!=top.ICEcoder.thisFileFolderLink&&(b=-1<top.ICEcoder.selectedFiles[0].indexOf(".")?"file":"folder",top.get("folderMenuItems").style.display="folder"==b&&1==top.ICEcoder.selectedFiles.length?"block":"none","folder"==b&&1==top.ICEcoder.selectedFiles.length&&(a+=67,"block"==top.get("fmMenuPasteOption").style.display&&(a+=19)),top.get("singleFileMenuItems").style.display=1<top.ICEcoder.selectedFiles.length?
"none":"block",1==top.ICEcoder.selectedFiles.length&&(a+=43),top.get("fileMenu").style.display="inline-block",setTimeout(function(){top.get("fileMenu").style.opacity="1"},4),top.get("fileMenu").style.left=top.ICEcoder.mouseX+20+"px",b=top.ICEcoder.mouseY-top.ICEcoder.filesFrame.contentWindow.document.body.scrollTop-10,b+a>c&&(b-=b+a-c),top.get("fileMenu").style.top=b+"px");return!1},showFileMenu:function(){top.get("fileMenu").style.display="inline-block";setTimeout(function(){top.get("fileMenu").style.opacity=
"1"},4)},hideFileMenu:function(){top.get("fileMenu").style.display="none";top.get("fileMenu").style.opacity="0"},updateFileManagerList:function(a,b,c,d,e,f){var g,m,h,k,p,n,l,q;if("add"==a&&!top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c)){g=-1<c.indexOf(".")?"file":"folder";m="file"==g?"pft-file ext-"+c.substr(c.indexOf(".")+1):"pft-directory";d="file"==g?664:705;b||(b="/");b=b.replace(top.iceRoot,"");h=top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\//g,
"|"));k=h.parentNode.parentNode.nextSibling;p=document.createTextNode("\n");n='<a nohref title="'+b.replace(/\/$/,"")+"/"+c+'" onMouseOver="top.ICEcoder.overFileFolder(\''+g+"','"+b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c+"')\" onMouseOut=\"top.ICEcoder.overFileFolder('"+g+'\',\'\')" style="position: relative; left:-22px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span id="'+b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c+'">'+c+'</span> <span style="color: #888; font-size: 8px" id="'+b.replace(/\/$/,
"").replace(/\//g,"|")+"|"+c+'_perms">'+d+"</span></a>";if(3>k.childNodes.length)l=document.createElement("ul"),k=h.parentNode.parentNode,k.parentNode.insertBefore(l,k.nextSibling),l=document.createElement("li"),l.className=m,l.draggable=!0,l.ondrag=function(a){top.ICEcoder.draggingWithKeyTest(a);top.ICEcoder.getcMInstance()&&top.ICEcoder.getcMInstance().focus()},l.ondragend=function(){top.ICEcoder.dropFile(this)},l.innerHTML=n,k.nextSibling.appendChild(l),k.nextSibling.appendChild(p);else for(h=
0;h<k.childNodes.length;h++)if(k.childNodes[h].className&&(l=0<k.childNodes[h].className.indexOf("directory")?"folder":"file",q=k.childNodes[h].getElementsByTagName("span")[0].innerHTML,l==g&&q>c||"folder"==g&&"file"==l||h==k.childNodes.length-1)){l=document.createElement("li");l.className=m;l.draggable=!0;l.ondrag=function(a){top.ICEcoder.draggingWithKeyTest(a);top.ICEcoder.getcMInstance()&&top.ICEcoder.getcMInstance().focus()};l.ondragend=function(){top.ICEcoder.dropFile(this)};l.innerHTML=n;h==
k.childNodes.length-1?(k.appendChild(l),k.appendChild(p)):(k.insertBefore(l,k.childNodes[h]),k.insertBefore(p,k.childNodes[h+1]));break}"file"!=g||f||(top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1]=b+c)}"rename"==a&&(f=e.replace(/\//g,"|"),h=top.get("filesFrame").contentWindow.document.getElementById(f),h.innerHTML=c,h.id=b.replace(/\//g,"|")+"|"+c,h.parentNode.title=h.id.replace(/\|/g,"/"),targetElemPerms=top.get("filesFrame").contentWindow.document.getElementById(f+"_perms"),targetElemPerms.id=
"1"},4)},hideFileMenu:function(){top.get("fileMenu").style.display="none";top.get("fileMenu").style.opacity="0"},updateFileManagerList:function(a,b,c,d,e,f){var g,m,h,l,n,p,k,q;if("add"==a&&!top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c)){g=-1<c.indexOf(".")?"file":"folder";m="file"==g?"pft-file ext-"+c.substr(c.indexOf(".")+1):"pft-directory";d="file"==g?664:705;b||(b="/");b=b.replace(top.iceRoot,"");h=top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\//g,
"|"));l=h.parentNode.parentNode.nextSibling;n=document.createTextNode("\n");p='<a nohref title="'+b.replace(/\/$/,"")+"/"+c+'" onMouseOver="top.ICEcoder.overFileFolder(\''+g+"','"+b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c+"')\" onMouseOut=\"top.ICEcoder.overFileFolder('"+g+'\',\'\')" style="position: relative; left:-22px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span id="'+b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c+'">'+c+'</span> <span style="color: #888; font-size: 8px" id="'+b.replace(/\/$/,
"").replace(/\//g,"|")+"|"+c+'_perms">'+d+"</span></a>";if(3>l.childNodes.length)k=document.createElement("ul"),l=h.parentNode.parentNode,l.parentNode.insertBefore(k,l.nextSibling),k=document.createElement("li"),k.className=m,k.draggable=!0,k.ondrag=function(a){top.ICEcoder.draggingWithKeyTest(a);top.ICEcoder.getcMInstance()&&top.ICEcoder.getcMInstance().focus()},k.ondragend=function(){top.ICEcoder.dropFile(this)},k.innerHTML=p,l.nextSibling.appendChild(k),l.nextSibling.appendChild(n);else for(h=
0;h<l.childNodes.length;h++)if(l.childNodes[h].className&&(k=0<l.childNodes[h].className.indexOf("directory")?"folder":"file",q=l.childNodes[h].getElementsByTagName("span")[0].innerHTML,k==g&&q>c||"folder"==g&&"file"==k||h==l.childNodes.length-1)){k=document.createElement("li");k.className=m;k.draggable=!0;k.ondrag=function(a){top.ICEcoder.draggingWithKeyTest(a);top.ICEcoder.getcMInstance()&&top.ICEcoder.getcMInstance().focus()};k.ondragend=function(){top.ICEcoder.dropFile(this)};k.innerHTML=p;h==
l.childNodes.length-1?(l.appendChild(k),l.appendChild(n)):(l.insertBefore(k,l.childNodes[h]),l.insertBefore(n,l.childNodes[h+1]));break}"file"!=g||f||(top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1]=b+c)}"rename"==a&&(f=e.replace(/\//g,"|"),h=top.get("filesFrame").contentWindow.document.getElementById(f),h.innerHTML=c,h.id=b.replace(/\//g,"|")+"|"+c,h.parentNode.title=h.id.replace(/\|/g,"/"),targetElemPerms=top.get("filesFrame").contentWindow.document.getElementById(f+"_perms"),targetElemPerms.id=
b.replace(/\//g,"|")+"|"+c+"_perms");"move"==a&&(top.ICEcoder.updateFileManagerList("add",b,c),top.ICEcoder.updateFileManagerList("delete",e.substr(0,e.lastIndexOf("/")),c));"chmod"==a&&(f=top.ICEcoder.rightClickedFile.replace(/\|/g,"/"),h=top.get("filesFrame").contentWindow.document.getElementById(f.replace(/\//g,"|")+"_perms"),h.innerHTML=d);"delete"==a&&(h=top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c).parentNode.parentNode,top.ICEcoder.openCloseDir(h.childNodes[0],
!1),h.parentNode.removeChild(h))},fMIcon:function(a){"save"==a&&0<ICEcoder.openFiles.length&&top.ICEcoder.saveFile();1==ICEcoder.selectedFiles.length&&(top.ICEcoder.rightClickedFile=top.ICEcoder.thisFileFolderLink=top.ICEcoder.selectedFiles[0].replace("|","/"),"open"==a&&-1<ICEcoder.selectedFiles[0].indexOf(".")?(top.ICEcoder.thisFileFolderType="file",top.ICEcoder.openFile()):"newFile"==a?top.ICEcoder.newFile():"newFolder"==a?top.ICEcoder.newFolder():"rename"==a&&top.ICEcoder.renameFile(top.ICEcoder.rightClickedFile));
"delete"==a&&0<ICEcoder.selectedFiles.length&&top.ICEcoder.deleteFiles()},refreshFileManager:function(){top.ICEcoder.showHide("show",top.get("loadingMask"));top.ICEcoder.filesFrame.src="files.php";top.ICEcoder.filesFrame.style.opacity="0";top.ICEcoder.filesFrame.onload=function(){top.ICEcoder.filesFrame.style.opacity="1";top.ICEcoder.showHide("hide",top.get("loadingMask"))}},draggingWithKeyTest:function(a){var b;b=a.keyCode?a.keyCode:a.which?a.which:a.charCode;if(224==b||91==b||93==b)top.ICEcoder.cmdKey=
@@ -69,9 +69,9 @@ top.ICEcoder.tabDragMove());if(top.ICEcoder.ready&&(top.ICEcoder.mouseDown||(top
a}},serverMessage:function(a){var b;b=top.get("serverMessage");a?(b.innerHTML=a,b.style.left="0"):setTimeout(function(){b.style.left="2000px"},200);b.style.opacity=a?1:0},cssColorPreview:function(){var a,b,c,d;if(a=ICEcoder.getcMInstance()){b=a.getLine(a.getCursor().line);for(c=/(#[\da-f]{3}(?:[\da-f]{3})?\b|\b(?:rgb|hsl)a?\([\s\d%,.-]+\)|\b[a-z]+\b)/gi;(d=c.exec(b))&&a.getCursor().ch>d.index+d[0].length;);(b=top.get("content").contentWindow.document.getElementById("cssColor"))&&b.parentNode.removeChild(b);
top.ICEcoder.codeAssist&&"CSS"==top.ICEcoder.caretLocType&&(b=top.document.createElement("div"),b.id="cssColor",b.style.position="absolute",b.style.display="block",b.style.width=b.style.height="20px",b.style.zIndex="1000",b.style.background=d?d[0]:"",b.style.cursor="pointer",b.onclick=function(){top.ICEcoder.showColorPicker(d[0])},""==b.style.backgroundColor&&(b.style.display="none"),top.get("header").appendChild(b),a.addWidget(a.getCursor(),top.get("cssColor"),!0))}},showColorPicker:function(a){top.get("blackMask").style.visibility=
"visible";top.get("mediaContainer").innerHTML='<div id="picker" class="picker"></div><br><br><input type="text" id="color" name="color" value="#000" class="colorValue"><input type="button" onClick="top.ICEcoder.insertColorValue(top.get(\'color\').value)" value="insert &gt;" class="insertColorValue"><br><input type="text" id="colorRGB" name="colorRGB" value="rgb(0,0,0)" class="colorValue"><input type="button" onClick="top.ICEcoder.insertColorValue(top.get(\'colorRGB\').value)" value="insert &gt;" class="insertColorValue">';
farbtastic("picker","color");a&&top.get("picker").farbtastic.setColor(a)},drawCanvasImage:function(a){var b,c,d,e,f,g,m,h,k,p,n;b=top.get("canvasPicker").getContext("2d");c=new Image;c.src=a.src;c.onload=function(){top.get("canvasPicker").width=a.width;top.get("canvasPicker").height=a.height;b.drawImage(c,0,0,a.width,a.height)};top.get("canvasPicker").onmousemove=function(a){d=a.pageX-this.offsetLeft;e=a.pageY-this.offsetTop;f=b.getImageData(d,e,1,1).data;g=f[0];m=f[1];h=f[2];k=g+","+m+","+h;p=top.ICEcoder.rgbToHex(g,
m,h);top.get("rgbMouseXY").value=k;top.get("hexMouseXY").value="#"+p;top.get("hexMouseXY").style.backgroundColor=top.get("rgbMouseXY").style.backgroundColor="#"+p;n=128>g||128>m||128>h&&200>g&&200>m&&50<h?"#fff":"#000";top.get("hexMouseXY").style.color=top.get("rgbMouseXY").style.color=n};top.get("canvasPicker").onclick=function(){top.get("rgb").value=top.get("rgbMouseXY").value;top.get("hex").value=top.get("hexMouseXY").value;top.get("hex").style.backgroundColor=top.get("rgb").style.backgroundColor=
top.get("hex").value;top.get("hex").style.color=top.get("rgb").style.color=n}},rgbToHex:function(a,b,c){return top.ICEcoder.toHex(a)+top.ICEcoder.toHex(b)+top.ICEcoder.toHex(c)},toHex:function(a){a=parseInt(a,10);if(isNaN(a))return"00";a=Math.max(0,Math.min(a,255));return"0123456789abcdef".charAt((a-a%16)/16)+"0123456789abcdef".charAt(a%16)},insertColorValue:function(a){var b,c;b=ICEcoder.getcMInstance();c=b.getTokenAt(b.getCursor());b.replaceRange(a,{line:b.getCursor().line,ch:c.start},{line:b.getCursor().line,
farbtastic("picker","color");a&&top.get("picker").farbtastic.setColor(a)},drawCanvasImage:function(a){var b,c,d,e,f,g,m,h,l,n,p;b=top.get("canvasPicker").getContext("2d");c=new Image;c.src=a.src;c.onload=function(){top.get("canvasPicker").width=a.width;top.get("canvasPicker").height=a.height;b.drawImage(c,0,0,a.width,a.height)};top.get("canvasPicker").onmousemove=function(a){d=a.pageX-this.offsetLeft;e=a.pageY-this.offsetTop;f=b.getImageData(d,e,1,1).data;g=f[0];m=f[1];h=f[2];l=g+","+m+","+h;n=top.ICEcoder.rgbToHex(g,
m,h);top.get("rgbMouseXY").value=l;top.get("hexMouseXY").value="#"+n;top.get("hexMouseXY").style.backgroundColor=top.get("rgbMouseXY").style.backgroundColor="#"+n;p=128>g||128>m||128>h&&200>g&&200>m&&50<h?"#fff":"#000";top.get("hexMouseXY").style.color=top.get("rgbMouseXY").style.color=p};top.get("canvasPicker").onclick=function(){top.get("rgb").value=top.get("rgbMouseXY").value;top.get("hex").value=top.get("hexMouseXY").value;top.get("hex").style.backgroundColor=top.get("rgb").style.backgroundColor=
top.get("hex").value;top.get("hex").style.color=top.get("rgb").style.color=p}},rgbToHex:function(a,b,c){return top.ICEcoder.toHex(a)+top.ICEcoder.toHex(b)+top.ICEcoder.toHex(c)},toHex:function(a){a=parseInt(a,10);if(isNaN(a))return"00";a=Math.max(0,Math.min(a,255));return"0123456789abcdef".charAt((a-a%16)/16)+"0123456789abcdef".charAt(a%16)},insertColorValue:function(a){var b,c;b=ICEcoder.getcMInstance();c=b.getTokenAt(b.getCursor());b.replaceRange(a,{line:b.getCursor().line,ch:c.start},{line:b.getCursor().line,
ch:c.end})},fMIconVis:function(a,b){var c;if(c=top.get(a))c.style.opacity=b},isOpen:function(a){a=a.replace(/\|/g,"/").replace(top.docRoot+top.iceRoot,"");a=top.ICEcoder.openFiles.indexOf(a);return-1!=a?a:!1},startPluginIntervals:function(a,b,c,d){top.ICEcoder["plugTimer"+a]=-1<["_parent","_top","_self",""].indexOf(c)?top.ICEcoder["plugTimer"+a]=setInterval("window.location='"+b+"'",6E4*d):0==c.indexOf("fileControl")?top.ICEcoder["plugTimer"+a]=setInterval(function(){top.ICEcoder.serverQueue("add",
b);top.ICEcoder.serverMessage(c.split(":")[1])},6E4*d):top.ICEcoder["plugTimer"+a]=setInterval("window.open('"+b+"','"+c+"')",6E4*d);top.ICEcoder.pluginIntervalRefs.push(a)},codeAssistToggle:function(){var a;ICEcoder.getcMInstance();top.ICEcoder.codeAssist=!top.ICEcoder.codeAssist;top.get("codeAssistDisplay").style.backgroundPosition=top.ICEcoder.codeAssist?"0 0":"-16px 0";top.ICEcoder.cssColorPreview();top.ICEcoder.focus();for(i=0;i<top.ICEcoder.cMInstances.length;i++)-1<top.ICEcoder.openFiles[i].indexOf(".js")&&
(a=top.ICEcoder.content.contentWindow["cM"+top.ICEcoder.cMInstances[i]],top.ICEcoder.codeAssist?a.setOption("lintWith",top.ICEcoder.content.contentWindow.CodeMirror.javascriptValidator):(a.clearGutter("CodeMirror-lint-markers"),a.setOption("lintWith",!1)))},serverQueue:function(a,b){var c,d,e;c=ICEcoder.getcMInstance();for(e=d=0;e<ICEcoder.serverQueueItems.length;e++)0<ICEcoder.serverQueueItems[e].indexOf("action=save")&&d++;d++;if("add"==a)ICEcoder.serverQueueItems.push(b),0<b.indexOf("action=save")&&
@@ -79,15 +79,16 @@ b);top.ICEcoder.serverMessage(c.split(":")[1])},6E4*d):top.ICEcoder["plugTimer"+
setTimeout(function(){top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href=ICEcoder.serverQueueItems[0]},1)},cancelAllActions:function(){window.stop();0<ICEcoder.serverQueueItems.length&&ICEcoder.serverQueueItems.splice(1,ICEcoder.serverQueueItems.length);top.ICEcoder.showHide("hide",top.get("loadingMask"));top.ICEcoder.serverMessage('<b style="color: #d00">Cancelled tasks</b>');setTimeout(function(){top.ICEcoder.serverMessage()},2E3)},setPreviousFiles:function(){var a;a=top.ICEcoder.openFiles.join(",").replace(/\//g,
"|").replace(/(\|\[NEW\])|(,\|\[NEW\])/g,"").replace(/(^,)|(,$)/g,"");""==a&&(a="CLEAR");top.ICEcoder.serverQueue("add","lib/settings.php?saveFiles="+a)},autoOpenFiles:function(){if(0<top.ICEcoder.previousFiles.length&&top.ICEcoder.ask("Open previous files?\n\n"+top.ICEcoder.previousFiles.length+" files:\n"+top.ICEcoder.previousFiles.join("\n").replace(/\|/g,"/").replace(RegExp(top.docRoot+top.iceRoot,"gi"),"")))for(var a=0;a<top.ICEcoder.previousFiles.length;a++)top.ICEcoder.rightClickedFile=top.ICEcoder.thisFileFolderLink=
top.ICEcoder.previousFiles[a].replace("|","/"),top.ICEcoder.thisFileFolderType="file",top.ICEcoder.openFile()},settingsScreen:function(a){a||(top.get("mediaContainer").innerHTML='<iframe src="lib/settings-screen.php" class="whiteGlow" style="width: 970px; height: 610px"></iframe>');top.ICEcoder.showHide(a?"hide":"show",top.get("blackMask"))},helpScreen:function(){top.get("mediaContainer").innerHTML='<iframe src="lib/help.php" class="whiteGlow" style="width: 800px; height: 450px"></iframe>';top.ICEcoder.showHide("show",
top.get("blackMask"))},showManual:function(a){top.get("mediaContainer").innerHTML='<iframe src="http://icecoder.net/manual?version='+a+'" class="whiteGlow" style="width: 500px; height: 500px"></iframe>';top.ICEcoder.showHide("show",top.get("blackMask"))},propertiesScreen:function(a){top.get("mediaContainer").innerHTML='<iframe src="lib/properties.php?fileName='+a.replace(/\//g,"|")+'" class="whiteGlow" style="width: 660px; height: 330px"></iframe>';top.ICEcoder.showHide("show",top.get("blackMask"))},
useNewSettings:function(a,b,c,d,e,f,g,m,h,k,p){var n;top.ICEcoder.theme=a.slice(a.lastIndexOf("/")+1,a.lastIndexOf("."));"editor"==top.ICEcoder.theme&&(top.ICEcoder.theme="icecoder");n=document.createElement("link");n.setAttribute("rel","stylesheet");n.setAttribute("type","text/css");n.setAttribute("href",a);top.ICEcoder.content.contentWindow.document.getElementsByTagName("head")[0].appendChild(n);a=-1<"3024-day base16-light eclipse elegant neat paraiso-light solarized xq-light".split(" ").indexOf(top.ICEcoder.theme)?
"#ccc":"#000";top.ICEcoder.switchTab(top.ICEcoder.selectedTab);b!=top.ICEcoder.codeAssist&&(top.get("codeAssist").checked=b,top.ICEcoder.codeAssistToggle());c!=top.ICEcoder.lockedNav&&top.ICEcoder.lockUnlockNav();c||(ICEcoder.changeFilesW("contract"),top.ICEcoder.hideFileMenu());c=ICEcoder.content.contentWindow.document.styleSheets[4];b=c.rules?"rules":"cssRules";c[b][0].style.fontSize=g;c[b][4].style["border-left-width"]=f?"1px":"0";c[b][4].style["margin-left"]=f?"-1px":"0";c[b][2].style.cssText=
"background-color: "+a+" !important";top.ICEcoder.lineWrapping=m;top.ICEcoder.indentWithTabs=h;top.ICEcoder.indentSize=k;for(f=0;f<ICEcoder.cMInstances.length;f++)ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("lineWrapping",top.ICEcoder.lineWrapping),ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("indentWithTabs",top.ICEcoder.indentWithTabs),ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("indentUnit",top.ICEcoder.indentSize),
ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("tabSize",top.ICEcoder.indentSize);d!=top.ICEcoder.tagWrapperCommand&&(top.ICEcoder.tagWrapperCommand=d);e!=top.ICEcoder.autoComplete&&(top.ICEcoder.autoComplete=e);p&&top.ICEcoder.refreshFileManager()},updateResultsDisplay:function(a){ICEcoder.findReplace(top.get("find").value,!0,!1);top.get("results").style.display="show"==a?"inline-block":"none"},fullScreenSwitcher:function(){"undefined"!=typeof document.cancelFullScreen?document.fullScreen?
document.cancelFullScreen():document.body.requestFullScreen():"undefined"!=typeof document.mozCancelFullScreen?document.mozFullScreen?document.mozCancelFullScreen():document.body.mozRequestFullScreen():"undefined"!=typeof document.webkitCancelFullScreen&&(document.webkitIsFullScreen?document.webkitCancelFullScreen():document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT))},zipIt:function(a){a=a.replace(/\//g,"|");top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href="plugins/zip-it/index.php?zip="+
a},downloadFile:function(a){a=a.replace(/\//g,"|");top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href="lib/download.php?file="+a},chmod:function(a,b){a=a.replace(top.iceRoot,"");top.ICEcoder.showHide("hide",top.get("blackMask"));top.ICEcoder.serverQueue("add","lib/file-control.php?action=perms&file="+a+"&perms="+b);top.ICEcoder.serverMessage("<b>chMod "+b+" on </b><br>"+a)},openPreviewWindow:function(){if(0<top.ICEcoder.openFiles.length){var a,b,c;b=top.ICEcoder.openFiles[top.ICEcoder.selectedTab-
1];c=b.substr(b.lastIndexOf("/")+1);c=c.substr(c.lastIndexOf(".")+1);a=ICEcoder.getcMInstance();top.ICEcoder.previewWindow=window.open(b,"previewWindow");-1<["md"].indexOf(c)&&(top.ICEcoder.previewWindow.onload=function(){top.ICEcoder.previewWindow.document.documentElement.innerHTML=mmd(a.getValue())})}},openTerminal:function(){top.ICEcoder.demoMode?top.ICEcoder.message("Sorry, you need to be logged in to use the terminal"):window.open("terminal")},logout:function(){window.location+="?logout"},message:function(a){alert(a)},
ask:function(a){return confirm(a)},getInput:function(a,b){return prompt(a,b)},dataMessage:function(a){var b;b=top.ICEcoder.content.contentWindow.document.getElementById("dataMessage");b.style.display="block";b.innerHTML=a},update:function(){confirm("Updating is currently an experimental feature. While it should work fine, please note there may be issues here, plus the following isn't yet part of this:\n\n- Settings not ported to new version\n- Plugins not ported to new version\n- Any mods you've made not ported to new version\n\nIf you have write access on the whole of ICEcoder (ie, running locally) it should work fine. If tho you need to recover ICEcoder for any reason, you'll find this current version in its tmp dir.\n\nClick OK to proceed with an auto-update or cancel to visit the ICEcoder site so you can grab the zip and update manually")?
top.get("blackMask"))},showManual:function(a,b){var c;c=b?"#"+b:"";top.get("mediaContainer").innerHTML='<iframe src="http://icecoder.net/manual?version='+a+c+'" class="whiteGlow" style="width: 500px; height: 500px"></iframe>';top.ICEcoder.showHide("show",top.get("blackMask"))},propertiesScreen:function(a){top.get("mediaContainer").innerHTML='<iframe src="lib/properties.php?fileName='+a.replace(/\//g,"|")+'" class="whiteGlow" style="width: 660px; height: 330px"></iframe>';top.ICEcoder.showHide("show",
top.get("blackMask"))},pluginsManager:function(){top.get("mediaContainer").innerHTML='<iframe src="lib/plugins-manager.php" class="whiteGlow" style="width: 800px; height: 450px"></iframe>';top.ICEcoder.showHide("show",top.get("blackMask"))},useNewSettings:function(a,b,c,d,e,f,g,m,h,l,n,p){var k;top.ICEcoder.theme=a.slice(a.lastIndexOf("/")+1,a.lastIndexOf("."));"editor"==top.ICEcoder.theme&&(top.ICEcoder.theme="icecoder");k=document.createElement("link");k.setAttribute("rel","stylesheet");k.setAttribute("type",
"text/css");k.setAttribute("href",a);top.ICEcoder.content.contentWindow.document.getElementsByTagName("head")[0].appendChild(k);a=-1<"3024-day base16-light eclipse elegant neat paraiso-light solarized xq-light".split(" ").indexOf(top.ICEcoder.theme)?"#ccc":"#000";top.ICEcoder.switchTab(top.ICEcoder.selectedTab);b!=top.ICEcoder.codeAssist&&(top.get("codeAssist").checked=b,top.ICEcoder.codeAssistToggle());c!=top.ICEcoder.lockedNav&&top.ICEcoder.lockUnlockNav();c||(ICEcoder.changeFilesW("contract"),
top.ICEcoder.hideFileMenu());c=ICEcoder.content.contentWindow.document.styleSheets[4];b=c.rules?"rules":"cssRules";c[b][0].style.fontSize=g;c[b][4].style["border-left-width"]=f?"1px":"0";c[b][4].style["margin-left"]=f?"-1px":"0";c[b][2].style.cssText="background-color: "+a+" !important";top.ICEcoder.lineWrapping=m;top.ICEcoder.indentWithTabs=h;top.ICEcoder.indentSize=l;for(f=0;f<ICEcoder.cMInstances.length;f++)ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("lineWrapping",top.ICEcoder.lineWrapping),
ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("indentWithTabs",top.ICEcoder.indentWithTabs),ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("indentUnit",top.ICEcoder.indentSize),ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("tabSize",top.ICEcoder.indentSize);d!=top.ICEcoder.tagWrapperCommand&&(top.ICEcoder.tagWrapperCommand=d);e!=top.ICEcoder.autoComplete&&(top.ICEcoder.autoComplete=e);top.get("plugins").style.left="left"==n?
"0":"auto";top.get("plugins").style.right="right"==n?"0":"auto";p&&top.ICEcoder.refreshFileManager()},updateResultsDisplay:function(a){ICEcoder.findReplace(top.get("find").value,!0,!1);top.get("results").style.display="show"==a?"inline-block":"none"},fullScreenSwitcher:function(){"undefined"!=typeof document.cancelFullScreen?document.fullScreen?document.cancelFullScreen():document.body.requestFullScreen():"undefined"!=typeof document.mozCancelFullScreen?document.mozFullScreen?document.mozCancelFullScreen():
document.body.mozRequestFullScreen():"undefined"!=typeof document.webkitCancelFullScreen&&(document.webkitIsFullScreen?document.webkitCancelFullScreen():document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT))},zipIt:function(a){a=a.replace(/\//g,"|");top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href="plugins/zip-it/index.php?zip="+a},downloadFile:function(a){a=a.replace(/\//g,"|");top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href="lib/download.php?file="+
a},chmod:function(a,b){a=a.replace(top.iceRoot,"");top.ICEcoder.showHide("hide",top.get("blackMask"));top.ICEcoder.serverQueue("add","lib/file-control.php?action=perms&file="+a+"&perms="+b);top.ICEcoder.serverMessage("<b>chMod "+b+" on </b><br>"+a)},openPreviewWindow:function(){if(0<top.ICEcoder.openFiles.length){var a,b,c;b=top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1];c=b.substr(b.lastIndexOf("/")+1);c=c.substr(c.lastIndexOf(".")+1);a=ICEcoder.getcMInstance();top.ICEcoder.previewWindow=window.open(b,
"previewWindow");-1<["md"].indexOf(c)&&(top.ICEcoder.previewWindow.onload=function(){top.ICEcoder.previewWindow.document.documentElement.innerHTML=mmd(a.getValue())})}},openTerminal:function(){top.ICEcoder.demoMode?top.ICEcoder.message("Sorry, you need to be logged in to use the terminal"):window.open("terminal")},logout:function(){window.location+="?logout"},message:function(a){alert(a)},ask:function(a){return confirm(a)},getInput:function(a,b){return prompt(a,b)},dataMessage:function(a){var b;b=
top.ICEcoder.content.contentWindow.document.getElementById("dataMessage");b.style.display="block";b.innerHTML=a},update:function(){confirm("Updating is currently an experimental feature. While it should work fine, please note there may be issues here, plus the following isn't yet part of this:\n\n- Settings not ported to new version\n- Plugins not ported to new version\n- Any mods you've made not ported to new version\n\nIf you have write access on the whole of ICEcoder (ie, running locally) it should work fine. If tho you need to recover ICEcoder for any reason, you'll find this current version in its tmp dir.\n\nClick OK to proceed with an auto-update or cancel to visit the ICEcoder site so you can grab the zip and update manually")?
(top.ICEcoder.showHide("show",top.get("loadingMask")),window.location="lib/updater.php"):window.open("http://icecoder.net")},switchTab:function(a,b){var c;ICEcoder.selectedTab=a;if(c=ICEcoder.getcMInstance()){ICEcoder.switchMode();for(var d=0;d<ICEcoder.cMInstances.length;d++)ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[d]].getWrapperElement().style.display="none";c.setOption("theme",top.ICEcoder.theme);c.getWrapperElement().style.display="block";b||setTimeout(function(){top.ICEcoder.focus()},
4);c.refresh();ICEcoder.redoTabHighlight(ICEcoder.selectedTab);top.ICEcoder.findMode=!1;ICEcoder.findReplace(top.get("find").value,!0,!1);top.ICEcoder.getCaretPosition();top.ICEcoder.updateCharDisplay();top.ICEcoder.updateByteDisplay()}},newTab:function(){var a;ICEcoder.cMInstances.push(ICEcoder.nextcMInstance);ICEcoder.selectedTab=ICEcoder.cMInstances.length;ICEcoder.showHide("show",ICEcoder.content);ICEcoder.content.contentWindow.createNewCMInstance(ICEcoder.nextcMInstance);ICEcoder.setLayout();
ICEcoder.thisFileFolderType="file";ICEcoder.thisFileFolderLink="/[NEW]";ICEcoder.openFile();a=ICEcoder.getcMInstance("new");ICEcoder.switchTab(ICEcoder.openFiles.length);a.removeLineClass(ICEcoder["cMActiveLine"+ICEcoder.cMInstances[top.ICEcoder.selectedTab-1]],"background");ICEcoder["cMActiveLine"+ICEcoder.selectedTab]=a.addLineClass(0,"background","cm-s-activeLine");ICEcoder.nextcMInstance++},createNewTab:function(){var a;top.ICEcoder.openFiles.push(top.ICEcoder.shortURL);top.get("tab"+top.ICEcoder.openFiles.length).style.display=

42
lib/login.php Normal file
View File

@@ -0,0 +1,42 @@
<?php
include("settings.php");
?>
<!DOCTYPE html>
<html>
<head>
<title>ICEcoder <?php
echo $ICEcoder["versionNo"]." : ";
echo $ICEcoder["password"] == "" && !$ICEcoder["multiUser"] ? "Setup" : "Login";
?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="robots" content="noindex, nofollow">
<link rel="stylesheet" type="text/css" href="ice-coder.css">
<link rel="icon" type="image/png" href="../favicon.png">
</head>
<body onLoad="document.settingsUpdate.<?php echo $ICEcoder["multiUser"] ? "username" : "password";?>.focus()">
<div class="screenContainer" style="background-color: #141414">
<div class="screenVCenter">
<div class="screenCenter">
<img src="../images/ice-coder.png" style="margin-right: 22px" alt="ICEcoder">
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div>
<form name="settingsUpdate" action="login.php" method="POST">
<?php if ($ICEcoder["multiUser"]) {echo ' <input type="text" name="username" class="password"><br><br>'.PHP_EOL;};?>
<input type="password" name="password" class="password"><br><br>
<input type="submit" name="submit" value="<?php if ($ICEcoder["multiUser"]) {echo "set password / login";} else {echo $ICEcoder["password"] == "" ? "set password" : "login";}; ?>" class="button">
<?php
if ($ICEcoder["password"] == "" || $ICEcoder["multiUser"]) {
echo '<div class="text"><input type="checkbox" name="checkUpdates" value="true" checked> auto-check for updates</div>';
}
if (!$ICEcoder["multiUser"]) { echo '<div class="text"><a href="javascript:alert(\'To put into multi-user mode, open lib/config___settings.php and change multiUser to true then reload this page\')">multi-user?</a></div>';};
?>
</form>
</div>
</div>
</div>
</body>
</html>

View File

@@ -113,7 +113,7 @@ if (startTab!=top.ICEcoder.selectedTab) {
$r = 0;
function phpGrep($q, $path, $base) {
$fp = opendir($path);
global $r, $ICEcoder, $serverType, $selectedFiles, $context;
global $r, $ICEcoder, $serverType, $selectedFiles, $docRoot, $ICEcoderDir, $context;
if (!isset($ret)) {$ret="";};
$slash = $serverType == strpos($path,"\\")>-1 ? "\\" : "/";
while($f = readdir($fp)) {
@@ -124,9 +124,16 @@ if (startTab!=top.ICEcoder.selectedTab) {
} else if(stristr(toUTF8noBOM(file_get_contents($fullPath,false,$context),false), $q)) {
$bFile = false;
$foundInSelFile = false;
// Exclude banned files
for ($i=0;$i<count($ICEcoder['bannedFiles']);$i++) {
if (strpos($f,$ICEcoder['bannedFiles'][$i])!==false) {$bFile = true;};
}
// Exclude the folder ICEcoder is running from
$rootPrefix = '/'.str_replace("/","\/",preg_quote(str_replace("\\","/",$docRoot))).'/';
$localPath = preg_replace($rootPrefix, '', $fullPath, 1);
if (strpos($localPath, $ICEcoderDir)===0) {
$bFile = true;
}
$findPath = str_replace($base,"",$fullPath);
for ($i=0;$i<count($selectedFiles);$i++) {
$stringExtra = $selectedFiles[$i] != "|" ? "/" : "";

40
lib/plugins-display.php Normal file
View File

@@ -0,0 +1,40 @@
<?php
$onLoadExtras = "";
$pluginsDisplay = "";
// Show plugins
if ($_SESSION['loggedIn']) {
// Work out the plugins to display to the user
$pluginsDisplay = "";
for ($i=0;$i<count($ICEcoder["plugins"]);$i++) {
$target = explode(":",$ICEcoder["plugins"][$i][4]);
$pluginsDisplay .= '<a href="'.$ICEcoder["plugins"][$i][3].'" title="'.$ICEcoder["plugins"][$i][0].'" target="'.$target[0].'"><img src="'.$ICEcoder["plugins"][$i][1].'" style="'.$ICEcoder["plugins"][$i][2].'" alt="'.$ICEcoder["plugins"][$i][0].'"></a><br><br>';
};
// If we're updating plugins, update those shown
if (isset($_GET['updatedPlugins'])) {
echo "<script>top.document.getElementById('pluginsOptional').innerHTML = '".$pluginsDisplay."';</script>";
}
// Work out what plugins we'll need to set on a setInterval
$onLoadExtras = "";
for ($i=0;$i<count($ICEcoder["plugins"]);$i++) {
if ($ICEcoder["plugins"][$i][5]!="") {
$onLoadExtras .= ";top.ICEcoder.startPluginIntervals(".$i.",'".$ICEcoder["plugins"][$i][3]."','".$ICEcoder["plugins"][$i][4]."','".$ICEcoder["plugins"][$i][5]."')";
};
};
// If we're updating our plugins, clear existing setIntervals & the array refs, then start new ones
if (isset($_GET['updatedPlugins'])) {
?>
<script>
for (i=0;i<=top.ICEcoder.pluginIntervalRefs.length-1;i++) {
clearInterval(top.ICEcoder['plugTimer'+top.ICEcoder.pluginIntervalRefs[i]]);
}
top.ICEcoder.pluginIntervalRefs = [];
<?php echo $onLoadExtras.PHP_EOL; ?>
</script>
<?php
}
}
?>

36
lib/plugins-manager.css Normal file
View File

@@ -0,0 +1,36 @@
/* First, reset everything to a standard */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
border: 0;
margin: 0;
padding: 0;
outline: 0;
font-size: 12px;
vertical-align: top;
}
body {overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
h1 {font-size: 36px; font-weight: normal; color: #888; margin-bottom: 20px}
a {color: #fff; text-decoration: none}
input {padding: 4px; border: 1px solid #555; background-color: #444; color: #fff}
input:focus {
outline: none;
-webkit-box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
-moz-box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
}
.pluginsManager {font-family: arial, verdana, helvetica, sans-serif; background-color: #1c1c19; color: #fff; padding: 20px}

243
lib/plugins-manager.php Normal file
View File

@@ -0,0 +1,243 @@
<?php
include("settings.php");
// Set the plugin data source
$pluginsDataSrc = "http://icecoder.net/plugin-data?format=JSON";
// Now get our plugin data and put into a PHP array
$pluginsDataJS = file_get_contents($pluginsDataSrc, false, $context);
$pluginsData = json_decode($pluginsDataJS, true);
// If we have an action to perform
if (isset($_GET['action'])) {
// Get our old plugin & user settings
$oldPlugins = $ICEcoder["plugins"];
$settingsContents = file_get_contents($settingsFile,false,$context);
// ==========
// INSTALLING
// ==========
if ($_GET['action']=="install") {
// Store the plugin zip to the tmp dir
$target = '../plugins/';
$zipFile = "../tmp/".basename($pluginsData[$_GET['plugin']]['zipURL']);
$client = curl_init($pluginsData[$_GET['plugin']]['zipURL']);
curl_setopt($client, CURLOPT_RETURNTRANSFER, 1); //fixed this line
$fileData = curl_exec($client);
file_put_contents($zipFile, $fileData);
// Now unpack the zip
$zip = new ZipArchive;
$zip->open($zipFile);
// Create all files & dirs, in 1kb chunks
for($i=0; $i<$zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
// Determine output filename
$file = $target.$name;
// Create the directories if necessary
$dir = dirname($file);
if (!is_dir($dir)) mkdir($dir, 0777, true);
// Read from zip and write to disk
$fpr = $zip->getStream($name);
if (!is_dir($file)) {
$fpw = fopen($file, 'w');
while ($data = fread($fpr, 1024)) {
fwrite($fpw, $data);
}
fclose($fpw);
}
fclose($fpr);
}
$zip->close();
// Remove the tmp zip file
unlink($zipFile);
// Start creating a new chunk for the plugins settings
$settingsNew = '"plugins" => array('.PHP_EOL;
// Set all the old plugins
for ($i=0; $i<count($oldPlugins); $i++) {
$settingsNew .= ' array("'.$oldPlugins[$i][0].'","'.$oldPlugins[$i][1].'","'.$oldPlugins[$i][2].'","'.$oldPlugins[$i][3].'","'.$oldPlugins[$i][4].'","'.$oldPlugins[$i][5].'"),'.PHP_EOL;
}
// Then add the new one
$settingsNew .= ' array("'.$pluginsData[$_GET['plugin']]['name'].'","'.$pluginsData[$_GET['plugin']]['icon'].'","'.$pluginsData[$_GET['plugin']]['style'].'","'.$pluginsData[$_GET['plugin']]['URL'].'","'.$pluginsData[$_GET['plugin']]['target'].'","'.$pluginsData[$_GET['plugin']]['timer'].'")'.PHP_EOL;
$settingsNew .= ' ),'.PHP_EOL;
}
// ============
// UNINSTALLING
// ============
if ($_GET['action']=="uninstall") {
// Start creating a new chunk for the plugins settings
$settingsNew = '"plugins" => array('.PHP_EOL;
// Set all the old plugins
for ($i=0; $i<count($oldPlugins); $i++) {
// As long as it's not the one we want to remove
if ($oldPlugins[$i][0] != $pluginsData[$_GET['plugin']]['name']) {
$settingsNew .= ' array("'.$oldPlugins[$i][0].'","'.$oldPlugins[$i][1].'","'.$oldPlugins[$i][2].'","'.$oldPlugins[$i][3].'","'.$oldPlugins[$i][4].'","'.$oldPlugins[$i][5].'"),'.PHP_EOL;
}
}
// Rtrim off the last comma
$settingsNew = rtrim($settingsNew,','.PHP_EOL).PHP_EOL;
$settingsNew .= ' ),'.PHP_EOL;
// Finally, delete the plugin itself
$target = '../plugins/';
$dirName = basename($pluginsData[$_GET['plugin']]['zipURL'],".zip");
deletePlugin($target.$dirName."/");
}
// ========
// UPDATING
// ========
if ($_GET['action']=="update") {
// Start creating a new chunk for the plugins settings
$settingsNew = '"plugins" => array('.PHP_EOL;
// Redo the arrays using the form data
for ($i=0; $i<count($oldPlugins); $i++) {
$settingsNew .= ' array("'.$_POST['name'.$i].'","'.$_POST['icon'.$i].'","'.$_POST['style'.$i].'","'.$_POST['URL'.$i].'","'.$_POST['target'.$i].'","'.$_POST['timer'.$i].'"),'.PHP_EOL;
}
$settingsNew .= ' ),'.PHP_EOL;
}
// Now we have a new settingsNew string to use and files installed/uninstalled
// we can update the plugin arrays in the settings file
// Identify the bit to replace
$repPosStart = strpos($settingsContents,'"plugins"');
$repPosEnd = strpos($settingsContents,'"previousFiles"');
// Compile our new settings
$settingsContents = substr($settingsContents,0,$repPosStart).$settingsNew.substr($settingsContents,$repPosEnd,strlen($settingsContents));
// Now update the config file
if (is_writeable($settingsFile)) {
$fh = fopen($settingsFile, 'w');
fwrite($fh, $settingsContents);
fclose($fh);
// Finally, reload the iFrame screen for the user
header("Location: plugins-manager.php?updatedPlugins");
die('saving plugins...');
} else {
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
}
}
// Function to delete the plugin dir & files/dirs inside
function deletePlugin($dir) {
$mydir = opendir($dir);
while(false !== ($file = readdir($mydir))) {
if($file != "." && $file != "..") {
chmod($dir.$file, 0777);
if(is_dir($dir.$file)) {
chdir('.');
deletePlugin($dir.$file.'/');
rmdir($dir.$file) or DIE("couldn't delete $dir$file<br />");
}
else
unlink($dir.$file) or DIE("couldn't delete $dir$file<br />");
}
}
closedir($mydir);
rmdir($dir);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>ICEcoder <?php echo $ICEcoder["versionNo"];?> plugins manager</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="robots" content="noindex, nofollow">
<link rel="stylesheet" type="text/css" href="plugins-manager.css">
</head>
<body class="pluginsManager">
<h1>plugins</h1>
<a href="javascript:top.ICEcoder.showManual('<?php echo $ICEcoder["versionNo"];?>','writingPlugins')" style="position: absolute; top: 26px; right: 20px"><div style="padding: 10px; background: #333; color: #fff; font-size: 18px">Guide to writing plugins</div></a>
<div style="display: inline-block; width: 760px; height: 340px; overflow-y: auto">
<?php
$plugins = $ICEcoder[plugins];
if (count($plugins) > 0) {
?>
<div style="display: inline-block; width: 740px; margin-bottom: 30px">
<h2>Manage Installed</h2><br>
<form id="pluginUpdateForm" action="plugins-manager.php?action=update" method="POST">
<table>
<tr>
<td colspan="2"></td>
<td style="padding-left: 5px">URL</td>
<td style="padding-left: 5px">Target</td>
<td style="padding-left: 5px">Timer</td>
</tr>
<?php
for ($i=0; $i<count($plugins); $i++) {
echo '<tr>';
echo '<td style="padding: 0 10px 8px 0; width: 28px; text-align: center"><img src="../'.$plugins[$i][1].'" alt="'.$plugins[$i][0].'"><input type="hidden" name="name'.$i.'" value="'.$plugins[$i][0].'"><input type="hidden" name="icon'.$i.'" value="'.$plugins[$i][1].'"><input type="hidden" name="style'.$i.'" value="'.$plugins[$i][2].'"></td>';
echo '<td style="padding: 8px 10px 8px 0; width: 250px; white-space: nowrap">'.$plugins[$i][0].'</td>';
echo '<td style="padding: 0 10px 8px 0"><input type="text" name="URL'.$i.'" value="'.$plugins[$i][3].'" style="width: 280px"></td>';
echo '<td style="padding: 0 10px 8px 0"><input type="text" name="target'.$i.'" value="'.$plugins[$i][4].'" style="width: 70px"></td>';
echo '<td style="padding: 0 0 8px 0"><input type="text" name="timer'.$i.'" value="'.$plugins[$i][5].'" style="width: 50px"></td>';
echo '</tr>';
}
echo '<td colspan="4"></td>';
echo '<td style="padding: 3px 0 8px 0"><div style="padding: 5px; background: #2187e7; color: #fff; font-size: 12px; cursor: pointer" onclick="document.getElementById(\'pluginUpdateForm\').submit()">Update</div></td>';
?>
</table>
</form>
</div>
<?php
;};
?>
<div style="display: inline-block; width: 740px">
<h2>Install / Uninstall</h2><br>
<table>
<?php
for ($i=0; $i<count($pluginsData); $i++) {
if ($i % 2 == 0) {
echo '<tr>'.PHP_EOL;
}
$installUninstallButton = '<div style="display: inline-block; padding: 5px; background: #2187e7; color: #fff; font-size: 12px; cursor: pointer" onclick="window.location=\'plugins-manager.php?action=install&plugin='.$i.'\'">Install</div>';
for ($j=0; $j<count($plugins); $j++) {
if ($pluginsData[$i]['name'] == $plugins[$j][0]) {
$installUninstallButton = '<div style="display: inline-block; padding: 5px; background: #333; color: #fff; font-size: 12px; cursor: pointer" onclick="window.location=\'plugins-manager.php?action=uninstall&plugin='.$i.'\'">Uninstall</div>';
}
}
echo '<td style="padding: 0 10px 8px 0; width: 28px; text-align: center"><img src="http://icecoder.net/'.$pluginsData[$i]['icon'].'" alt="'.$pluginsData[$i]['name'].'"></td>';
echo '<td style="padding: 8px 10px 8px 0; width: 250px; white-space: nowrap">'.$pluginsData[$i]['name'].'</td>';
$styleExtra = ($i % 2 == 1 || $i == count($pluginsData)-1) ? "0" : "30px";
echo '<td style="padding: 3px '.$styleExtra.' 8px 0">'.$installUninstallButton.'</td>';
if ($i % 2 == 1 || $i == count($pluginsData)-1) {
echo PHP_EOL.'</tr>'.PHP_EOL;
}
}
?>
</table>
</div>
</div>
</body>
</html>

88
lib/settings-common.php Normal file
View File

@@ -0,0 +1,88 @@
<?php
// Don't display, but log all errors
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', dirname(__FILE__).'/../error-log.txt');
error_reporting(-1);
// Set our default timezone and supress warning with @
@date_default_timezone_set(date_default_timezone_get());
// Set a stream context timeout for file reading
$context = stream_context_create(array('http'=>
array(
'timeout' => 60 // secs
)
));
// Set our security related headers, none activated
// header("frame-options: SAMEORIGIN");
// header("XSS-Protection: 1; mode=block");
// Start a session if we haven't already
if(!isset($_SESSION)) {@session_start();}
// Logout if that's the action we're taking
if (isset($_GET['logout'])) {
include(dirname(__FILE__)."/../processes/on-user-logout.php");
$_SESSION['loggedIn']=false;
$_SESSION['username']=false;
session_destroy();
header("Location: dirname(__FILE__)./?loggedOut");
}
// If magic quotes are still on (attempted to switch off in php.ini)
if (get_magic_quotes_gpc ()) {
function stripslashes_deep($value) {
$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
return $value;
}
$_POST = (isset($_POST) && !empty($_POST)) ? array_map('stripslashes_deep', $_POST) : array();
$_GET = (isset($_GET) && !empty($_GET)) ? array_map('stripslashes_deep', $_GET) : array();
$_COOKIE = (isset($_COOKIE) && !empty($_COOKIE)) ? array_map('stripslashes_deep', $_COOKIE) : array();
$_REQUEST = (isset($_REQUEST) && !empty($_REQUEST)) ? array_map('stripslashes_deep', $_REQUEST) : array();
}
// Function to handle salted hashing
define('SALT_LENGTH',12);
function generateHash($plainText,$salt=null) {
if ($salt === null) {
$salt = substr(md5(uniqid(rand(), true)),0,SALT_LENGTH);
} else {
$salt = substr($salt,0,SALT_LENGTH);
}
return $salt.sha1($salt.$plainText);
}
// returns converted entities which have HTML entity equivalents
function strClean($var) {
return htmlentities($var, ENT_QUOTES, "UTF-8");
}
// returns a number, whole or decimal or null
function numClean($var) {
return is_numeric($var) ? floatval($var) : false;
}
// returns a UTF8 based string with any UFT8 BOM removed
function toUTF8noBOM($string,$message) {
// Attempt to detect encoding
if (function_exists('mb_detect_encoding')) {
$encType = mb_detect_encoding($string);
// Get rid of any UTF-8 BOM
$string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);
// Test for any bad characters
$teststring = $string;
$teststringBroken = utf8_decode($teststring);
$teststringConverted = iconv("UTF-8", "UTF-8//IGNORE", $teststringBroken);
// If we have a matching length, UTF8 encode it
if ($encType != "ASCII" && $encType != "UTF-8" && strlen($teststringConverted) == strlen($teststringBroken)) {
$string = utf8_encode($string);
if ($message) {
echo "top.ICEcoder.message('Your document doesn\'t appear to be in UTF-8 encoding so has been converted.');";
}
}
}
return $string;
}
?>

View File

@@ -0,0 +1,56 @@
<?php
// Save the currently opened files for next time
if ($_SESSION['loggedIn'] && isset($_GET["saveFiles"]) && $_GET['saveFiles']) {
$settingsContents = file_get_contents($settingsFile,false,$context);
// Replace our previousFiles var with the the current
$repPosStart = strpos($settingsContents,'previousFiles" => "')+20;
$repPosEnd = strpos($settingsContents,'",',$repPosStart)-$repPosStart;
if (!$demoMode) {
if ($_GET['saveFiles']!="CLEAR") {
$saveFiles=strClean($_GET['saveFiles']);
$saveFilesArray = explode(",",$saveFiles);
$saveFiles="";
for ($i=0;$i<count($saveFilesArray);$i++) {
$saveFilesArray[$i] = str_replace("/","|",$docRoot).$saveFilesArray[$i];
$saveFiles .= $saveFilesArray[$i].",";
}
$saveFiles = rtrim($saveFiles,",");
} else {
$saveFilesArray = array();
$saveFiles = "";
}
$settingsContents = substr($settingsContents,0,$repPosStart).$saveFiles.substr($settingsContents,($repPosStart+$repPosEnd),strlen($settingsContents));
// Now update the config file
if (is_writeable($settingsFile)) {
$fh = fopen($settingsFile, 'w');
fwrite($fh, $settingsContents);
fclose($fh);
} else {
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
}
// Update our last10Files var?
$last10FilesArray = explode(",",$ICEcoder["last10Files"]);
for ($i=0;$i<count($saveFilesArray);$i++) {
$inLast10Files = in_array($saveFilesArray[$i],$last10FilesArray);
if (!$inLast10Files && $saveFilesArray[$i] !="") {
$repPosStart = strpos($settingsContents,'last10Files" => "')+18;
$repPosEnd = strpos($settingsContents,'"',$repPosStart)-$repPosStart;
$commaExtra = $ICEcoder["last10Files"]!="" ? "," : "";
if (count($last10FilesArray)>=10) {$ICEcoder["last10Files"]=substr($ICEcoder["last10Files"],0,strrpos($ICEcoder["last10Files"],','));};
$settingsContents = substr($settingsContents,0,$repPosStart).$saveFilesArray[$i].$commaExtra.$ICEcoder["last10Files"].substr($settingsContents,($repPosStart+$repPosEnd),strlen($settingsContents));
// Now update the config file
if (is_writeable($settingsFile)) {
$fh = fopen($settingsFile, 'w');
fwrite($fh, $settingsContents);
fclose($fh);
} else {
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
}
}
}
}
echo '<script>top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);</script>';
}
?>

View File

@@ -42,5 +42,4 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
-moz-box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
}
.settings .plugins {font-family: arial, verdana, helvetica, sans-serif; width: 410px; height: 95px; overflow: auto}
.settings .update {position: absolute; bottom: 0; right: 20px; padding: 5px 10px; font-size: 18px; background-color: rgba(0,198,255,0.7); opacity: 0.1; cursor: pointer}

View File

@@ -73,7 +73,7 @@ for ($i=0;$i<count($themeArray);$i++) {
Thanks go to the following people who have inspired me to create this or provided feedback, code or testing:<br>
<?php
$peopleArray = array("marijnjh", "maettig", "a_harris88", "emmetio", "prinzhorn", "wimtibackx", "jakubvrana", "davidwalshblog", "vicen_herrera", "abstractba", "themximum");
$peopleArray = array("marijnjh", "maettig", "a_harris88", "emmetio", "prinzhorn", "wimtibackx", "jakubvrana", "davidwalshblog", "vicen_herrera", "abstractba", "themximum", "anagnam");
function makeURL(&$value) {
$value = '<a href="http://www.twitter.com/'.$value.'" style="font-size: 10px" target="_blank">@'.$value.'</a>';
};
@@ -129,18 +129,6 @@ ip addresses<br>
</div>
<div class="settingsColumn2">
<h2>plugins</h2>
plugins array <span style="font-size: 10px; color: #888">name, img src, style, url, target, setInterval (mins)</span><br>
<textarea name="plugins" class="plugins" onkeydown="showButton()"><?php
for($i=0;$i<count($ICEcoder["plugins"]);$i++) {
echo '"'.implode('",'.PHP_EOL.'"', $ICEcoder["plugins"][$i]).'"';
if ($i<count($ICEcoder["plugins"])-1) {
echo PHP_EOL."====================".PHP_EOL;
}
}
?></textarea>
<br><br>
<h2>style</h2>
theme<br>
<select onchange="selectTheme();showButton()" id="select" name="theme" style="width: 95px">
@@ -195,7 +183,15 @@ function findSequence(goal) {
}</textarea>
<br>
<span style="position: absolute; top: 510px">
<span style="position: absolute; top: 360px">
<h2>layout</h2>
plugin panel aligned<br>
<select onchange="showButton()" name="pluginPanelAligned">
<option value="left"<?php if($ICEcoder["pluginPanelAligned"] == "left") {echo " selected";};?>>left</option>
<option value="right"<?php if($ICEcoder["pluginPanelAligned"] == "right") {echo " selected";};?>>right</option>
</select>
<br><br>
<h2>file manager</h2>
root <span style="font-size: 10px; color: #888">slash prefixed</span><br>
<input type="text" name="root" style="width: 200px" onkeydown="document.settings.changedFileSettings.value='true';showButton()" value="<?php echo $ICEcoder["root"];?>">

66
lib/settings-update.php Normal file
View File

@@ -0,0 +1,66 @@
<?php
// Update this config file?
if (!$demoMode && isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] && isset($_POST["theme"]) && $_POST["theme"]) {
$settingsContents = file_get_contents($settingsFile,false,$context);
// Replace our settings vars
$repPosStart = strpos($settingsContents,'"root"');
$repPosEnd = strpos($settingsContents,'"plugins"');
// Prepare all our vars
$ICEcoder["root"] = strClean($_POST['root']);
$ICEcoder["checkUpdates"] = isset($_POST['checkUpdates']) && $_POST['checkUpdates'] ? "true" : "false";
$ICEcoder["openLastFiles"] = isset($_POST['openLastFiles']) && $_POST['openLastFiles'] ? "true" : "false";
$ICEcoder["findFilesExclude"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['findFilesExclude']))).'")';
$ICEcoder["codeAssist"] = isset($_POST['codeAssist']) && $_POST['codeAssist'] ? "true" : "false";
$ICEcoder["visibleTabs"] = isset($_POST['visibleTabs']) && $_POST['visibleTabs'] ? "true" : "false";
$ICEcoder["lockedNav"] = isset($_POST['lockedNav']) && $_POST['lockedNav'] ? "true" : "false";
$ICEcoder["tagWrapperCommand"] = strClean($_POST['tagWrapperCommand']);
$ICEcoder["autoComplete"] = strClean($_POST['autoComplete']);
if ($_POST['password']!="") {$ICEcoder["password"] = generateHash(strClean($_POST['password']));};
$ICEcoder["bannedFiles"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedFiles']))).'")';
$ICEcoder["bannedPaths"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedPaths']))).'")';
$ICEcoder["allowedIPs"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['allowedIPs']))).'")';
$ICEcoder["theme"] = strClean($_POST['theme']);
$ICEcoder["fontSize"] = strClean($_POST['fontSize']);
$ICEcoder["lineWrapping"] = strClean($_POST['lineWrapping']);
$ICEcoder["indentWithTabs"] = strClean($_POST['indentWithTabs']);
$ICEcoder["indentSize"] = numClean($_POST['indentSize']);
$ICEcoder["pluginPanelAligned"] = strClean($_POST['pluginPanelAligned']);
$settingsArray = array("root","checkUpdates","openLastFiles","findFilesExclude","codeAssist","visibleTabs","lockedNav","tagWrapperCommand","autoComplete","password","bannedFiles","bannedPaths","allowedIPs","theme","fontSize","lineWrapping","indentWithTabs","indentSize","pluginPanelAligned");
$settingsNew = "";
for ($i=0;$i<count($settingsArray);$i++) {
$settingsNew .= '"'.$settingsArray[$i].'"'.PHP_EOL.' => ';
// Wrap certain values in double quotes
$settingWrap = $settingsArray[$i]=="root"||$settingsArray[$i]=="password"||$settingsArray[$i]=="theme"||$settingsArray[$i]=="fontSize"||$settingsArray[$i]=="tagWrapperCommand"||$settingsArray[$i]=="autoComplete"||$settingsArray[$i]=="pluginPanelAligned" ? '"' : '';
$settingsNew .= $settingWrap.$ICEcoder[$settingsArray[$i]].$settingWrap.','.PHP_EOL.PHP_EOL;
}
// Compile our new settings
$settingsContents = substr($settingsContents,0,$repPosStart).$settingsNew.substr($settingsContents,($repPosEnd),strlen($settingsContents));
// Now update the config file
if (is_writeable($settingsFile)) {
$fh = fopen($settingsFile, 'w');
fwrite($fh, $settingsContents);
fclose($fh);
} else {
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
}
// OK, now the config file has been updated, update our current session with new arrays
$settingsArray = array("findFilesExclude","bannedFiles","allowedIPs");
for ($i=0;$i<count($settingsArray);$i++) {
$_SESSION[$settingsArray[$i]] = $ICEcoder[$settingsArray[$i]] = explode(",",str_replace(" ","",strClean($_POST[$settingsArray[$i]])));
}
// Work out the theme to use now
$ICEcoder["theme"]=="default" ? $themeURL = 'lib/editor.css' : $themeURL = $ICEcoder["codeMirrorDir"].'/theme/'.$ICEcoder["theme"].'.css';
// Do we need a file manager refresh?
$refreshFM = $_POST['changedFileSettings']=="true" ? "true" : "false";
// With all that worked out, we can now hide the settings screen and apply the new settings
echo "<script>top.ICEcoder.settingsScreen('hide');top.ICEcoder.useNewSettings('".$themeURL."',".$ICEcoder["codeAssist"].",".$ICEcoder["lockedNav"].",'".$ICEcoder["tagWrapperCommand"]."','".$ICEcoder["autoComplete"]."',".$ICEcoder["visibleTabs"].",'".$ICEcoder["fontSize"]."',".$ICEcoder["lineWrapping"].",".$ICEcoder["indentWithTabs"].",".$ICEcoder["indentSize"].",'".$ICEcoder["pluginPanelAligned"]."',".$refreshFM.");</script>";
}
?>

View File

@@ -1,189 +1,58 @@
<?php
// Don't display, but log all errors
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', dirname(__FILE__).'/../error-log.txt');
error_reporting(-1);
// Set our default timezone and supress warning with @
@date_default_timezone_set(date_default_timezone_get());
// Set a stream context timeout for file reading
$context = stream_context_create(array('http'=>
array(
'timeout' => 60 // secs
)
));
// Set our security related headers, none activated
// header("frame-options: SAMEORIGIN");
// header("XSS-Protection: 1; mode=block");
// Start a session if we haven't already
if(!isset($_SESSION)) {@session_start();}
// Logout if that's the action we're taking
if (isset($_GET['logout'])) {
include(dirname(__FILE__)."/../processes/on-user-logout.php");
$_SESSION['loggedIn']=false;
$_SESSION['username']=false;
session_destroy();
header("Location: dirname(__FILE__)./?loggedOut");
}
// If magic quotes are still on (attempted to switch off in php.ini)
if (get_magic_quotes_gpc ()) {
function stripslashes_deep($value) {
$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
return $value;
}
$_POST = (isset($_POST) && !empty($_POST)) ? array_map('stripslashes_deep', $_POST) : array();
$_GET = (isset($_GET) && !empty($_GET)) ? array_map('stripslashes_deep', $_GET) : array();
$_COOKIE = (isset($_COOKIE) && !empty($_COOKIE)) ? array_map('stripslashes_deep', $_COOKIE) : array();
$_REQUEST = (isset($_REQUEST) && !empty($_REQUEST)) ? array_map('stripslashes_deep', $_REQUEST) : array();
}
// Function to handle salted hashing
define('SALT_LENGTH',12);
function generateHash($plainText,$salt=null) {
if ($salt === null) {
$salt = substr(md5(uniqid(rand(), true)),0,SALT_LENGTH);
} else {
$salt = substr($salt,0,SALT_LENGTH);
}
return $salt.sha1($salt.$plainText);
}
// returns converted entities which have HTML entity equivalents
function strClean($var) {
return htmlentities($var, ENT_QUOTES, "UTF-8");
}
// returns a number, whole or decimal or null
function numClean($var) {
return is_numeric($var) ? floatval($var) : false;
}
// returns a UTF8 based string with any UFT8 BOM removed
function toUTF8noBOM($string,$message) {
// Attempt to detect encoding
if (function_exists('mb_detect_encoding')) {
$encType = mb_detect_encoding($string);
// Get rid of any UTF-8 BOM
$string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);
// Test for any bad characters
$teststring = $string;
$teststringBroken = utf8_decode($teststring);
$teststringConverted = iconv("UTF-8", "UTF-8//IGNORE", $teststringBroken);
// If we have a matching length, UTF8 encode it
if ($encType != "ASCII" && $encType != "UTF-8" && strlen($teststringConverted) == strlen($teststringBroken)) {
$string = utf8_encode($string);
if ($message) {
echo "top.ICEcoder.message('Your document doesn\'t appear to be in UTF-8 encoding so has been converted.');";
}
}
}
return $string;
}
// Load system settings
// Establish settings and users template filenames
$configSettings = 'config___settings.php';
$configUsersTemplate = 'config___users-template.php';
// Load config settings
include(dirname(__FILE__)."/".$configSettings);
// Settings are stored in this file
$configUsersTemplate = 'config___users-template.php';
// Load common functions
include(dirname(__FILE__)."/settings-common.php");
// Establish user settings file
$username = "";
if (isset($_POST['username']) && $_POST['username'] != "") {$username = strClean($_POST['username']."-");};
if (isset($_SESSION['username']) && $_SESSION['username'] != "") {$username = strClean($_SESSION['username']."-");};
$settingsFile = 'config-'.$username.str_replace(".","_",str_replace("www.","",$_SERVER['SERVER_NAME'])).'.php';
// Login is default
$setPWorLogin = "login";
// Create user settings file if it doesn't exist
if (!file_exists(dirname(__FILE__)."/".$settingsFile)) {
if (!copy(dirname(__FILE__)."/".$configUsersTemplate, dirname(__FILE__)."/".$settingsFile)) {
die("Couldn't create $settingsFile. Maybe you need write permissions on the lib folder?");
}
$setPWorLogin = "set password";
}
// Load user settings
include(dirname(__FILE__)."/".$settingsFile);
// On mismatch of settings file to system, rename to .old and reload
If ($ICEcoderUserSettings["versionNo"] != $ICEcoderSettings["versionNo"]) {
rename(dirname(__FILE__)."/".$settingsFile,dirname(__FILE__)."/".str_replace(".php",".old",$settingsFile));
header("Location: settings.php");
die('Found old settings file, reloading...');
}
// Join ICEcoder settings and user settings together to make our final ICEcoder array
$ICEcoder = $ICEcoderSettings + $ICEcoderUserSettings;
$onLoadExtras = "";
$pluginsDisplay = "";
if ($ICEcoder['demoMode'] && $ICEcoder['password']!="") {$_SESSION['loggedIn']=true;};
// Login not required or we're in demo mode and have password set in our settings, log us straight in
if ((!$ICEcoder['loginRequired'] || $ICEcoder['demoMode']) && $ICEcoder['password']!="") {$_SESSION['loggedIn']=true;};
$demoMode = $ICEcoder['demoMode'];
// Update this config file?
if (!$demoMode && isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] && isset($_POST["theme"]) && $_POST["theme"]) {
$settingsContents = file_get_contents($settingsFile,false,$context);
// Replace our settings vars
$repPosStart = strpos($settingsContents,'"root"');
$repPosEnd = strpos($settingsContents,'"previousFiles"');
include(dirname(__FILE__)."/settings-update.php");
// Prepare all our vars
$ICEcoder["root"] = strClean($_POST['root']);
$ICEcoder["checkUpdates"] = isset($_POST['checkUpdates']) && $_POST['checkUpdates'] ? "true" : "false";
$ICEcoder["openLastFiles"] = isset($_POST['openLastFiles']) && $_POST['openLastFiles'] ? "true" : "false";
$ICEcoder["findFilesExclude"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['findFilesExclude']))).'")';
$ICEcoder["codeAssist"] = isset($_POST['codeAssist']) && $_POST['codeAssist'] ? "true" : "false";
$ICEcoder["visibleTabs"] = isset($_POST['visibleTabs']) && $_POST['visibleTabs'] ? "true" : "false";
$ICEcoder["lockedNav"] = isset($_POST['lockedNav']) && $_POST['lockedNav'] ? "true" : "false";
$ICEcoder["tagWrapperCommand"] = strClean($_POST['tagWrapperCommand']);
$ICEcoder["autoComplete"] = strClean($_POST['autoComplete']);
if ($_POST['password']!="") {$ICEcoder["password"] = generateHash(strClean($_POST['password']));};
$ICEcoder["bannedFiles"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedFiles']))).'")';
$ICEcoder["bannedPaths"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedPaths']))).'")';
$ICEcoder["allowedIPs"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['allowedIPs']))).'")';
$ICEcoder["plugins"] = 'array('.PHP_EOL.' array('.PHP_EOL.' '.str_replace('====================','),'.PHP_EOL.' array(',str_replace("\\","\\\\",$_POST['plugins'])).'))';
$ICEcoder["theme"] = strClean($_POST['theme']);
$ICEcoder["fontSize"] = strClean($_POST['fontSize']);
$ICEcoder["lineWrapping"] = strClean($_POST['lineWrapping']);
$ICEcoder["indentWithTabs"] = strClean($_POST['indentWithTabs']);
$ICEcoder["indentSize"] = numClean($_POST['indentSize']);
$settingsArray = array("root","checkUpdates","openLastFiles","findFilesExclude","codeAssist","visibleTabs","lockedNav","tagWrapperCommand","autoComplete","password","bannedFiles","bannedPaths","allowedIPs","plugins","theme","fontSize","lineWrapping","indentWithTabs","indentSize");
$settingsNew = "";
for ($i=0;$i<count($settingsArray);$i++) {
$settingsNew .= '"'.$settingsArray[$i].'"'.PHP_EOL.' => ';
$settingWrap = $settingsArray[$i]=="root"||$settingsArray[$i]=="password"||$settingsArray[$i]=="theme"||$settingsArray[$i]=="fontSize"||$settingsArray[$i]=="tagWrapperCommand"||$settingsArray[$i]=="autoComplete" ? '"' : '';
$settingsNew .= $settingWrap.$ICEcoder[$settingsArray[$i]].$settingWrap.','.PHP_EOL.PHP_EOL;
}
// Compile our new settings
$settingsContents = substr($settingsContents,0,$repPosStart).$settingsNew.substr($settingsContents,($repPosEnd),strlen($settingsContents));
// Now update the config file
if (is_writeable($settingsFile)) {
$fh = fopen($settingsFile, 'w');
fwrite($fh, $settingsContents);
fclose($fh);
} else {
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
}
// OK, now the config file has been updated, update our current session with new arrays
$settingsArray = array("findFilesExclude","bannedFiles","allowedIPs");
for ($i=0;$i<count($settingsArray);$i++) {
$_SESSION[$settingsArray[$i]] = $ICEcoder[$settingsArray[$i]] = explode(",",str_replace(" ","",strClean($_POST[$settingsArray[$i]])));
}
// Work out the theme to use now
$ICEcoder["theme"]=="default" ? $themeURL = 'lib/editor.css' : $themeURL = $ICEcoder["codeMirrorDir"].'/theme/'.$ICEcoder["theme"].'.css';
// Do we need a file manager refresh?
$refreshFM = $_POST['changedFileSettings']=="true" ? "true" : "false";
// With all that worked out, we can now hide the settings screen and apply the new settings
echo "<script>top.ICEcoder.settingsScreen('hide');top.ICEcoder.useNewSettings('".$themeURL."',".$ICEcoder["codeAssist"].",".$ICEcoder["lockedNav"].",'".$ICEcoder["tagWrapperCommand"]."','".$ICEcoder["autoComplete"]."',".$ICEcoder["visibleTabs"].",'".$ICEcoder["fontSize"]."',".$ICEcoder["lineWrapping"].",".$ICEcoder["indentWithTabs"].",".$ICEcoder["indentSize"].",".$refreshFM.");</script>";
}
// Establish our user level
// Set loggedIn and username to false if not set as yet
if (!isset($_SESSION['loggedIn'])) {$_SESSION['loggedIn'] = false;};
if (!isset($_SESSION['username'])) {$_SESSION['username'] = false;};
// Attempt a login with password
if(isset($_POST['submit']) && $setPWorLogin=="login") {
// On success, set username if multiUser, loggedIn to true and redirect
if (generateHash(strClean($_POST['password']),$ICEcoder["password"])==$ICEcoder["password"]) {
if ($ICEcoder["multiUser"]) {
$_SESSION['username'] = $_POST['username'];
@@ -191,10 +60,13 @@ if(isset($_POST['submit']) && $setPWorLogin=="login") {
$_SESSION['loggedIn'] = true;
include(dirname(__FILE__)."/../processes/on-user-login.php");
header('Location: ../');
die('Logging you in...');
} else {
include(dirname(__FILE__)."/../processes/on-user-login-fail.php");
}
};
// Re-establish our loggedIn state and username
$_SESSION['loggedIn'] = $_SESSION['loggedIn'];
$_SESSION['username'] = $_SESSION['username'];
@@ -206,6 +78,11 @@ if ($_SESSION['loggedIn']) {
echo "<script>top.docRoot='".$docRoot."';top.iceRoot='".$iceRoot."'</script>";
}
// Establish the dir ICEcoders running from
$ICEcoderDirFullPath = rtrim(str_replace("\\","/",dirname($_SERVER['SCRIPT_FILENAME'])),"/lib");
$rootPrefix = '/'.str_replace("/","\/",preg_quote(str_replace("\\","/",$docRoot))).'/';
$ICEcoderDir = preg_replace($rootPrefix, '', $ICEcoderDirFullPath, 1);
// Setup our file security vars
$settingsArray = array("findFilesExclude","bannedFiles","allowedIPs");
for ($i=0;$i<count($settingsArray);$i++) {
@@ -219,126 +96,30 @@ for($i=0;$i<count($_SESSION['allowedIPs']);$i++) {
$allowedIP = true;
}
}
// If user not allowed to view, boot to site root
// If user not allowed to view, display message
if (!$allowedIP) {
echo '<script>top.window.location="/";</script>';
die('Sorry, access not permitted');
};
// Save the currently opened files for next time
if ($_SESSION['loggedIn'] && isset($_GET["saveFiles"]) && $_GET['saveFiles']) {
$settingsContents = file_get_contents($settingsFile,false,$context);
// Save currently opened files in previousFiles and last10Files arrays
include(dirname(__FILE__)."/settings-save-current-files.php");
// Replace our previousFiles var with the the current
$repPosStart = strpos($settingsContents,'previousFiles" => "')+20;
$repPosEnd = strpos($settingsContents,'",',$repPosStart)-$repPosStart;
if (!$demoMode) {
if ($_GET['saveFiles']!="CLEAR") {
$saveFiles=strClean($_GET['saveFiles']);
$saveFilesArray = explode(",",$saveFiles);
$saveFiles="";
for ($i=0;$i<count($saveFilesArray);$i++) {
$saveFilesArray[$i] = str_replace("/","|",$docRoot).$saveFilesArray[$i];
$saveFiles .= $saveFilesArray[$i].",";
}
$saveFiles = rtrim($saveFiles,",");
} else {
$saveFilesArray = array();
$saveFiles = "";
}
$settingsContents = substr($settingsContents,0,$repPosStart).$saveFiles.substr($settingsContents,($repPosStart+$repPosEnd),strlen($settingsContents));
// Now update the config file
if (is_writeable($settingsFile)) {
$fh = fopen($settingsFile, 'w');
fwrite($fh, $settingsContents);
fclose($fh);
} else {
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
}
// Display the plugins
include(dirname(__FILE__)."/plugins-display.php");
// Update our last10Files var?
$last10FilesArray = explode(",",$ICEcoder["last10Files"]);
for ($i=0;$i<count($saveFilesArray);$i++) {
$inLast10Files = in_array($saveFilesArray[$i],$last10FilesArray);
if (!$inLast10Files && $saveFilesArray[$i] !="") {
$repPosStart = strpos($settingsContents,'last10Files" => "')+18;
$repPosEnd = strpos($settingsContents,'"',$repPosStart)-$repPosStart;
$commaExtra = $ICEcoder["last10Files"]!="" ? "," : "";
if (count($last10FilesArray)>=10) {$ICEcoder["last10Files"]=substr($ICEcoder["last10Files"],0,strrpos($ICEcoder["last10Files"],','));};
$settingsContents = substr($settingsContents,0,$repPosStart).$saveFilesArray[$i].$commaExtra.$ICEcoder["last10Files"].substr($settingsContents,($repPosStart+$repPosEnd),strlen($settingsContents));
// Now update the config file
if (is_writeable($settingsFile)) {
$fh = fopen($settingsFile, 'w');
fwrite($fh, $settingsContents);
fclose($fh);
} else {
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
}
}
}
}
echo '<script>top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);</script>';
}
// If we're updating, do/redo plugins
if ($_SESSION['loggedIn']) {
// If we're updating, we need to recreate the plugins array
if (isset($_POST["theme"]) && $_POST["theme"]) {
$ICEcoder["plugins"] = array();
$pluginsArray = explode("====================",str_replace("\"","",str_replace("\r","",str_replace("\n","",$_POST['plugins']))));
for ($i=0;$i<count($pluginsArray);$i++) {
array_push($ICEcoder["plugins"], explode(",",$pluginsArray[$i]));
}
}
// Work out the plugins to display to the user
$pluginsDisplay = "";
for ($i=0;$i<count($ICEcoder["plugins"]);$i++) {
$target = explode(":",$ICEcoder["plugins"][$i][4]);
$pluginsDisplay .= '<a href="'.$ICEcoder["plugins"][$i][3].'" title="'.$ICEcoder["plugins"][$i][0].'" target="'.$target[0].'"><img src="'.$ICEcoder["plugins"][$i][1].'" style="'.$ICEcoder["plugins"][$i][2].'" alt="'.$ICEcoder["plugins"][$i][0].'"></a><br><br>';
};
// If we're updating, replace the plugin display with our newly established one
echo "<script>if(top.document.getElementById('pluginsContainer')) {top.document.getElementById('pluginsContainer').innerHTML = '".$pluginsDisplay."'};</script>";
// Work out what plugins we'll need to set on a setInterval
$onLoadExtras = "";
for ($i=0;$i<count($ICEcoder["plugins"]);$i++) {
if ($ICEcoder["plugins"][$i][5]!="") {
$onLoadExtras .= ";top.ICEcoder.startPluginIntervals(".$i.",'".$ICEcoder["plugins"][$i][3]."','".$ICEcoder["plugins"][$i][4]."','".$ICEcoder["plugins"][$i][5]."')";
};
};
// If we're updating our settings, clear existing setIntervals & the array refs, then start new ones
if (isset($_POST["theme"]) && $_POST["theme"]) {
?>
<script>
for (i=0;i<=top.ICEcoder.pluginIntervalRefs.length-1;i++) {
clearInterval(top.ICEcoder['plugTimer'+top.ICEcoder.pluginIntervalRefs[i]]);
}
top.ICEcoder.pluginIntervalRefs = [];
<?php echo $onLoadExtras.PHP_EOL; ?>
</script>
<?php
}
// Finally, show server data
$onLoadExtras .= ";top.ICEcoder.content.style.visibility='visible'";
}
if ((!$_SESSION['loggedIn'] || $ICEcoder["password"] == "") && !strpos($_SERVER['SCRIPT_NAME'],"lib/settings.php")) {
if (file_exists('lib/settings.php')) {
header('Location: lib/settings.php');
die();
// If loggedIn is false or we don't have a password set yet and we're not on login screen, boot user to that
if ((!$_SESSION['loggedIn'] || $ICEcoder["password"] == "") && !strpos($_SERVER['SCRIPT_NAME'],"lib/login.php")) {
if (file_exists('lib/login.php')) {
header('Location: lib/login.php');
} else {
header('Location: settings.php');
die();
header('Location: login.php');
}
// If we're due to show the settings screen
die('Redirecting to login...');
// If we are on the login screen and not logged in
} elseif (!$_SESSION['loggedIn']) {
// If the password hasn't been set and we're setting it
if ($ICEcoder["password"] == "" && isset($_POST['submit']) && (strpos($_POST['submit'],"set password")>-1)) {
$password = generateHash(strClean($_POST['password']));
$settingsFile = $settingsFile;
$settingsContents = file_get_contents($settingsFile,false,$context);
// Replace our empty password with the one submitted by user
$settingsContents = str_replace('"password" => "",','"password" => "'.$password.'",',$settingsContents);
@@ -359,49 +140,17 @@ if ((!$_SESSION['loggedIn'] || $ICEcoder["password"] == "") && !strpos($_SERVER[
include(dirname(__FILE__)."/../processes/on-user-new.php");
// Finally, load again as now this file has changed and auto login
header('Location: ../');
die('Logging you in...');
}
?>
<!DOCTYPE html>
<html>
<head>
<title>ICEcoder <?php
echo $ICEcoder["versionNo"]." : ";
echo $ICEcoder["password"] == "" && !$ICEcoder["multiUser"] ? "Setup" : "Login";
?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="robots" content="noindex, nofollow">
<link rel="stylesheet" type="text/css" href="ice-coder.css">
<link rel="icon" type="image/png" href="../favicon.png">
</head>
<body onLoad="document.settingsUpdate.<?php echo $ICEcoder["multiUser"] ? "username" : "password";?>.focus()">
<div class="screenContainer" style="background-color: #141414">
<div class="screenVCenter">
<div class="screenCenter">
<img src="../images/ice-coder.png" style="margin-right: 22px">
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div>
<form name="settingsUpdate" action="settings.php" method="POST">
<?php if ($ICEcoder["multiUser"]) {echo '<input type="text" name="username" class="password"><br><br>';};?>
<input type="password" name="password" class="password"><br><br>
<input type="submit" name="submit" value="<?php if ($ICEcoder["multiUser"]) {echo "set password / login";} else {echo $ICEcoder["password"] == "" ? "set password" : "login";}; ?>" class="button">
<?php
if ($ICEcoder["password"] == "" || $ICEcoder["multiUser"]) {
echo '<div class="text"><input type="checkbox" name="checkUpdates" value="true" checked> auto-check for updates</div>';
}
if (!$ICEcoder["multiUser"]) { echo '<div class="text"><a href="javascript:alert(\'To put into multi-user mode, open lib/config___settings.php and change multiUser to true then reload this page\')">multi-user?</a></div>';};
?>
</form>
</div>
</div>
</div>
</body>
</html>
<?php
} elseif ($_SESSION['loggedIn'] && $ICEcoder["password"]=="") {
// ===================================================
// We're likely showing the login screen at this point
// ===================================================
} elseif ($ICEcoder['loginRequired'] && $_SESSION['loggedIn'] && $ICEcoder["password"]=="") {
header("Location: ../?logout");
die('Logging you out...');
} else {
// ==================================
// Continue with whatever we're doing
// ==================================
}
?>

0
plugins/.gitkeep Normal file
View File

File diff suppressed because one or more lines are too long

View File

@@ -1,62 +0,0 @@
/* CSS by Brade - www.bradezone.com */
*{margin:0;padding:0}
body{font:13px/18px Helvetica,Arial,sans-serif;background:#fff;color:#333}
/* generic */
a,a:visited{color:#06c;text-decoration:none;border-bottom:1px dotted}
a:hover{border-bottom:1px solid #06c;background:#06c;color:#fff}
p{padding-bottom:4px;margin-bottom:4px}
h1{font-size:18px;font-weight:bold;padding-bottom:0px;height:40px;padding:0 0 8px 0;color:#666;border:0}
h2{font:32px Georgia,serif;padding:10px 0 8px;margin:0;background:transparent;border:0;color:#333}
h3{font-size:18px;font-weight:bold;padding:4px 0;margin:0}
form#form{overflow:hidden}
fieldset{float:left;min-height:48px;padding:0 4px 4px 4px;border:1px solid #ccc;margin-bottom:8px;margin-right:4px}
fieldset div{margin-top:4px}
input,select,textarea{font:13px Helvetica,Arial,sans-serif;color:#555;border:1px solid #999;padding:3px}
input[type=submit]{background:#ccc;padding:2px;cursor:pointer;color:#333}
input[type=submit]:hover{background:#bbb}
input[type=image],input[type=checkbox]{border:0;padding:0}
label input[type=checkbox],td input[type=radio],td span select{margin-right:4px}
select{border:1px solid #999;padding:2px}
fieldset select{margin-right:4px}
option{padding:0 5px}
optgroup{font-size:11px}
code{background:#eee;padding:2px 4px;font:16px/20px Courier,monospace}
code a:hover{background:transparent}
table{margin:4px 0 8px;border:1px solid #ccc;font-size:inherit}
tbody tr:hover td,tbody tr:hover th{background:#eee}
thead tr:hover td,thead tr:hover th{background:#ddd}
th,td{text-align:left;padding:2px 4px;vertical-align:top;font-weight:normal;border:1px dotted #ccc;border-width:0 0 0 1px;
margin:0;background:inherit}
thead th,thead td{white-space:nowrap;font-weight:bold;background:#ddd;border-color:#ddd}
th:first-child,td:first-child{border-color:transparent;white-space:nowrap}
td[align=right]{text-align:right}
table code{font-size:13px;line-height:18px}
.hidden{display:none}
.error,.message{padding:0;background:transparent;font-weight:bold}
.error{color:#c00}
.message{color:#090}
/* specific */
#content{margin:0 0 0 320px;padding:50px 20px 40px 0;height:100%}
#content:after{content:'.';clear:both;height:0;overflow:hidden;display:block}
#lang{background:#333;color:#fff;position:fixed;top:0;left:0;width:100%;padding:0 20px 0 40px;line-height:40px;height:40px}
#lang select{border-color:#333}
#menu{background:#eee;position:fixed;top:60px;bottom:20px;overflow:auto;left:20px;width:240px;padding:10px 15px;
border:5px solid #ccc;margin:0}
#menu a{color:#333;margin-right:4px}
#menu a:hover{background:#333;color:#fff;border-color:#333}
#menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0;
outline:0;background:url(http://www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px}
#menu p{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;width:100%;line-height:40px;padding:0;z-index:1;margin:0}
#breadcrumb a{color:#ff9}
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}
#schema .table{padding:4px 8px;background:#f3f3f3}
/* IE hacks */
*+html th:first-child,*+html td:first-child{border-color:inherit;white-space:inherit}
* html #lang,* html #menu,* html #breadcrumb{position:absolute}
* html #lang{padding-top:10px;height:30px}
* html form#form{height:100%}
#logins a,#tables a{background: none}
#logout{color:#333;text-decoration:none;border-bottom:1px dotted}
#logout:hover{border-color:#333;background:#333;color:#fff}
.js .column{background:#ddd}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -1,45 +0,0 @@
<script>
/*
Copyright (C) 2013 Sencha Inc.
Copyright (C) 2012 Sencha Inc.
Copyright (C) 2011 Sencha Inc.
Author: Ariya Hidayat.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
/*jslint continue: true, indent: 4 */
/*global exports:true, module:true, window:true */
(function(){function p(m,p){function q(a){return" "===a||"\n"===a||"\t"===a||"\r"===a||"\f"===a}function t(a){return"a"<=b&&"z">=b||"A"<=b&&"Z">=b||"0"<=b&&"9">=b||0<="-_*.:#".indexOf(a)}function r(){var b;for(b=g;0<b;b-=1)a+=h.indent}function u(){a=f(a);v?a+=" {":(a+="\n",r(),a+="{");"\n"!==d&&(a+="\n");g+=1}function n(){var b;g-=1;a=f(a);w&&(b=a.charAt(a.length-1),";"!==b&&"{"!==b&&(a+=";"));a+="\n";r();a+="}";k.push(a);a=""}var h,e=0,x=m.length,k,a="",b,d,c,g,l,s,v=!0,w=!1,f;h=1<arguments.length?
p:{};"undefined"===typeof h.indent&&(h.indent=" ");"string"===typeof h.openbrace&&(v="end-of-line"===h.openbrace);"boolean"===typeof h.autosemicolon&&(w=h.autosemicolon);f=String.prototype.trimRight?function(a){return a.trimRight()}:function(a){return a.replace(/\s+$/,"")};c=g=0;s=!1;k=[];for(m=m.replace(/\r\n/g,"\n");e<x;)if(b=m.charAt(e),d=m.charAt(e+1),e+=1,"'"===l||'"'===l)a+=b,b===l&&(l=null),"\\"===b&&d===l&&(a+=d,e+=1);else if("'"===b||'"'===b)a+=b,l=b;else if(s)a+=b,"*"===b&&"/"===d&&(s=
!1,a+=d,e+=1);else if("/"===b&&"*"===d)s=!0,a+=b,a+=d,e+=1;else{if(0===c){if(0===k.length&&q(b)&&0===a.length)continue;if(" ">=b||128<=b.charCodeAt(0)){c=0;a+=b;continue}if(t(b)||"["===b||"@"===b){c=f(a);if(0===c.length)0<k.length&&(a="\n\n");else if("}"===c.charAt(c.length-1)||";"===c.charAt(c.length-1))a=c+"\n\n";else for(;;){d=a.charAt(a.length-1);if(" "!==d&&9!==d.charCodeAt(0))break;a=a.substr(0,a.length-1)}a+=b;c="@"===b?1:3;continue}}if(1===c)";"===b?(a+=b,c=0):"{"===b?(c=f(a),u(),c="@font-face"===
c?4:2):a+=b;else if(2===c)if(t(b)){c=f(a);if(0===c.length)0<k.length&&(a="\n\n");else if("}"===c.charAt(c.length-1))a=c+"\n\n";else for(;;){d=a.charAt(a.length-1);if(" "!==d&&9!==d.charCodeAt(0))break;a=a.substr(0,a.length-1)}r();a+=b;c=3}else"}"===b?(n(),c=0):a+=b;else if(3===c)"{"===b?(u(),c=4):"}"===b?(n(),c=0):a+=b;else if(4===c)"}"===b?(n(),c=0,0<g&&(c=2)):"\n"===b?(a=f(a),a+="\n"):q(b)?a+=b:(a=f(a),a+="\n",r(),a+=b,c=5);else if(5===c)":"===b?(a=f(a),a+=": ",c=7,q(d)&&(c=6)):"}"===b?(n(),c=0,
0<g&&(c=2)):a+=b;else if(6===c)if(!q(b))a+=b,c=7;else{if("'"===d||'"'===d)c=7}else 7===c?"}"===b?(n(),c=0,0<g&&(c=2)):";"===b?(a=f(a),a+=";\n",c=4):(a+=b,"("===b&&"l"===a.charAt(a.length-2)&&"r"===a.charAt(a.length-3)&&"u"===a.charAt(a.length-4)&&(c=8)):8===c&&")"===b&&a.charAt("\\"!==a.length-1)?(a+=b,c=7):a+=b}return a=k.join("")+a}"undefined"!==typeof exports?module.exports=exports=p:"object"===typeof window&&(window.cssbeautify=p)})();
cM = top.ICEcoder.getcMInstance();
if (cM && top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1].indexOf('.css') > -1) {
cM.setValue(cssbeautify(cM.getValue(), {
indent: ' ',
openbrace: 'end-of-line',
autosemicolon: false
}));
}
</script>

View File

@@ -1,313 +0,0 @@
var _=function(){function f(a,b,c){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual&&k.isFunction(a.isEqual))return a.isEqual(b);if(b.isEqual&&k.isFunction(b.isEqual))return b.isEqual(a);var g=e.call(a);if(g!=e.call(b))return!1;switch(g){case "[object String]":return a==String(b);case "[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case "[object Date]":case "[object Boolean]":return+a==+b;case "[object RegExp]":return a.source==
b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return!1;for(var d=c.length;d--;)if(c[d]==a)return!0;c.push(a);var d=0,j=!0;if(g=="[object Array]"){if(d=a.length,j=d==b.length)for(;d--;)if(!(j=d in a==d in b&&f(a[d],b[d],c)))break}else{if("constructor"in a!="constructor"in b||a.constructor!=b.constructor)return!1;for(var h in a)if(k.has(a,h)&&(d++,!(j=k.has(b,h)&&f(a[h],b[h],c))))break;if(j){for(h in b)if(k.has(b,h)&&!d--)break;
j=!d}}c.pop();return j}var d=this,h=d._,i={},b=Array.prototype,c=Object.prototype,a=b.slice,g=b.unshift,e=c.toString,j=c.hasOwnProperty,n=b.forEach,o=b.map,l=b.reduce,m=b.reduceRight,p=b.filter,r=b.every,q=b.some,u=b.indexOf,s=b.lastIndexOf,c=Array.isArray,v=Object.keys,w=Function.prototype.bind,k=function(a){return new x(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=k;exports._=k}else d._=k;k.VERSION="1.3.3";var t=k.each=k.forEach=function(a,
b,e){if(a!=null)if(n&&a.forEach===n)a.forEach(b,e);else if(a.length===+a.length)for(var c=0,g=a.length;c<g;c++){if(c in a&&b.call(e,a[c],c,a)===i)break}else for(c in a)if(k.has(a,c)&&b.call(e,a[c],c,a)===i)break};k.map=k.collect=function(a,b,e){var c=[];if(a==null)return c;if(o&&a.map===o)return a.map(b,e);t(a,function(a,g,k){c[c.length]=b.call(e,a,g,k)});if(a.length===+a.length)c.length=a.length;return c};k.reduce=k.foldl=k.inject=function(a,b,c,e){var g=arguments.length>2;a==null&&(a=[]);if(l&&
a.reduce===l)return e&&(b=k.bind(b,e)),g?a.reduce(b,c):a.reduce(b);t(a,function(a,k,d){g?c=b.call(e,c,a,k,d):(c=a,g=!0)});if(!g)throw new TypeError("Reduce of empty array with no initial value");return c};k.reduceRight=k.foldr=function(a,b,c,e){var g=arguments.length>2;a==null&&(a=[]);if(m&&a.reduceRight===m)return e&&(b=k.bind(b,e)),g?a.reduceRight(b,c):a.reduceRight(b);var d=k.toArray(a).reverse();e&&!g&&(b=k.bind(b,e));return g?k.reduce(d,b,c,e):k.reduce(d,b)};k.find=k.detect=function(a,b,c){var e;
D(a,function(a,g,k){if(b.call(c,a,g,k))return e=a,!0});return e};k.filter=k.select=function(a,b,e){var c=[];if(a==null)return c;if(p&&a.filter===p)return a.filter(b,e);t(a,function(a,g,k){b.call(e,a,g,k)&&(c[c.length]=a)});return c};k.reject=function(a,b,c){var e=[];if(a==null)return e;t(a,function(a,g,k){b.call(c,a,g,k)||(e[e.length]=a)});return e};k.every=k.all=function(a,b,e){var c=!0;if(a==null)return c;if(r&&a.every===r)return a.every(b,e);t(a,function(a,g,k){if(!(c=c&&b.call(e,a,g,k)))return i});
return!!c};var D=k.some=k.any=function(a,b,c){b||(b=k.identity);var e=!1;if(a==null)return e;if(q&&a.some===q)return a.some(b,c);t(a,function(a,g,k){if(e||(e=b.call(c,a,g,k)))return i});return!!e};k.include=k.contains=function(a,b){var e=!1;return a==null?e:u&&a.indexOf===u?a.indexOf(b)!=-1:e=D(a,function(a){return a===b})};k.invoke=function(b,e){var c=a.call(arguments,2);return k.map(b,function(a){return(k.isFunction(e)?e||a:a[e]).apply(a,c)})};k.pluck=function(a,b){return k.map(a,function(a){return a[b]})};
k.max=function(a,b,e){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!b&&k.isEmpty(a))return-Infinity;var c={computed:-Infinity};t(a,function(a,g,k){g=b?b.call(e,a,g,k):a;g>=c.computed&&(c={value:a,computed:g})});return c.value};k.min=function(a,b,e){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!b&&k.isEmpty(a))return Infinity;var c={computed:Infinity};t(a,function(a,g,k){g=b?b.call(e,a,g,k):a;g<c.computed&&(c={value:a,computed:g})});return c.value};k.shuffle=
function(a){var b=[],e;t(a,function(a,c){e=Math.floor(Math.random()*(c+1));b[c]=b[e];b[e]=a});return b};k.sortBy=function(a,b,e){var c=k.isFunction(b)?b:function(a){return a[b]};return k.pluck(k.map(a,function(a,b,g){return{value:a,criteria:c.call(e,a,b,g)}}).sort(function(a,b){var e=a.criteria,c=b.criteria;return e===void 0?1:c===void 0?-1:e<c?-1:e>c?1:0}),"value")};k.groupBy=function(a,b){var e={},c=k.isFunction(b)?b:function(a){return a[b]};t(a,function(a,b){var g=c(a,b);(e[g]||(e[g]=[])).push(a)});
return e};k.sortedIndex=function(a,b,e){e||(e=k.identity);for(var c=0,g=a.length;c<g;){var d=c+g>>1;e(a[d])<e(b)?c=d+1:g=d}return c};k.toArray=function(b){return!b?[]:k.isArray(b)?a.call(b):k.isArguments(b)?a.call(b):b.toArray&&k.isFunction(b.toArray)?b.toArray():k.values(b)};k.size=function(a){return k.isArray(a)?a.length:k.keys(a).length};k.first=k.head=k.take=function(b,e,c){return e!=null&&!c?a.call(b,0,e):b[0]};k.initial=function(b,e,c){return a.call(b,0,b.length-(e==null||c?1:e))};k.last=function(b,
e,c){return e!=null&&!c?a.call(b,Math.max(b.length-e,0)):b[b.length-1]};k.rest=k.tail=function(b,e,c){return a.call(b,e==null||c?1:e)};k.compact=function(a){return k.filter(a,function(a){return!!a})};k.flatten=function(a,b){return k.reduce(a,function(a,e){if(k.isArray(e))return a.concat(b?e:k.flatten(e));a[a.length]=e;return a},[])};k.without=function(b){return k.difference(b,a.call(arguments,1))};k.uniq=k.unique=function(a,b,e){var e=e?k.map(a,e):a,c=[];a.length<3&&(b=!0);k.reduce(e,function(e,g,
d){if(b?k.last(e)!==g||!e.length:!k.include(e,g))e.push(g),c.push(a[d]);return e},[]);return c};k.union=function(){return k.uniq(k.flatten(arguments,!0))};k.intersection=k.intersect=function(b){var e=a.call(arguments,1);return k.filter(k.uniq(b),function(a){return k.every(e,function(b){return k.indexOf(b,a)>=0})})};k.difference=function(b){var e=k.flatten(a.call(arguments,1),!0);return k.filter(b,function(a){return!k.include(e,a)})};k.zip=function(){for(var b=a.call(arguments),e=k.max(k.pluck(b,"length")),
c=Array(e),g=0;g<e;g++)c[g]=k.pluck(b,""+g);return c};k.indexOf=function(a,b,e){if(a==null)return-1;var c;if(e)return e=k.sortedIndex(a,b),a[e]===b?e:-1;if(u&&a.indexOf===u)return a.indexOf(b);e=0;for(c=a.length;e<c;e++)if(e in a&&a[e]===b)return e;return-1};k.lastIndexOf=function(a,b){if(a==null)return-1;if(s&&a.lastIndexOf===s)return a.lastIndexOf(b);for(var e=a.length;e--;)if(e in a&&a[e]===b)return e;return-1};k.range=function(a,b,e){arguments.length<=1&&(b=a||0,a=0);for(var e=arguments[2]||1,
c=Math.max(Math.ceil((b-a)/e),0),g=0,k=Array(c);g<c;)k[g++]=a,a+=e;return k};var E=function(){};k.bind=function(b,e){var c,g;if(b.bind===w&&w)return w.apply(b,a.call(arguments,1));if(!k.isFunction(b))throw new TypeError;g=a.call(arguments,2);return c=function(){if(!(this instanceof c))return b.apply(e,g.concat(a.call(arguments)));E.prototype=b.prototype;var k=new E,d=b.apply(k,g.concat(a.call(arguments)));return Object(d)===d?d:k}};k.bindAll=function(b){var e=a.call(arguments,1);e.length==0&&(e=k.functions(b));
t(e,function(a){b[a]=k.bind(b[a],b)});return b};k.memoize=function(a,b){var e={};b||(b=k.identity);return function(){var c=b.apply(this,arguments);return k.has(e,c)?e[c]:e[c]=a.apply(this,arguments)}};k.delay=function(b,e){var c=a.call(arguments,2);return setTimeout(function(){return b.apply(null,c)},e)};k.defer=function(b){return k.delay.apply(k,[b,1].concat(a.call(arguments,1)))};k.throttle=function(a,b){var e,c,g,d,j,f,h=k.debounce(function(){j=d=!1},b);return function(){e=this;c=arguments;var k;
g||(g=setTimeout(function(){g=null;j&&a.apply(e,c);h()},b));d?j=!0:f=a.apply(e,c);h();d=!0;return f}};k.debounce=function(a,b,e){var c;return function(){var g=this,k=arguments;e&&!c&&a.apply(g,k);clearTimeout(c);c=setTimeout(function(){c=null;e||a.apply(g,k)},b)}};k.once=function(a){var b=!1,e;return function(){if(b)return e;b=!0;return e=a.apply(this,arguments)}};k.wrap=function(b,e){return function(){var c=[b].concat(a.call(arguments,0));return e.apply(this,c)}};k.compose=function(){var a=arguments;
return function(){for(var b=arguments,e=a.length-1;e>=0;e--)b=[a[e].apply(this,b)];return b[0]}};k.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};k.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],e;for(e in a)k.has(a,e)&&(b[b.length]=e);return b};k.values=function(a){return k.map(a,k.identity)};k.functions=k.methods=function(a){var b=[],e;for(e in a)k.isFunction(a[e])&&b.push(e);return b.sort()};k.extend=function(b){t(a.call(arguments,
1),function(a){for(var e in a)b[e]=a[e]});return b};k.pick=function(b){var e={};t(k.flatten(a.call(arguments,1)),function(a){a in b&&(e[a]=b[a])});return e};k.defaults=function(b){t(a.call(arguments,1),function(a){for(var e in a)b[e]==null&&(b[e]=a[e])});return b};k.clone=function(a){return!k.isObject(a)?a:k.isArray(a)?a.slice():k.extend({},a)};k.tap=function(a,b){b(a);return a};k.isEqual=function(a,b){return f(a,b,[])};k.isEmpty=function(a){if(a==null)return!0;if(k.isArray(a)||k.isString(a))return a.length===
0;for(var b in a)if(k.has(a,b))return!1;return!0};k.isElement=function(a){return!!(a&&a.nodeType==1)};k.isArray=c||function(a){return e.call(a)=="[object Array]"};k.isObject=function(a){return a===Object(a)};k.isArguments=function(a){return e.call(a)=="[object Arguments]"};if(!k.isArguments(arguments))k.isArguments=function(a){return!(!a||!k.has(a,"callee"))};k.isFunction=function(a){return e.call(a)=="[object Function]"};k.isString=function(a){return e.call(a)=="[object String]"};k.isNumber=function(a){return e.call(a)==
"[object Number]"};k.isFinite=function(a){return k.isNumber(a)&&isFinite(a)};k.isNaN=function(a){return a!==a};k.isBoolean=function(a){return a===!0||a===!1||e.call(a)=="[object Boolean]"};k.isDate=function(a){return e.call(a)=="[object Date]"};k.isRegExp=function(a){return e.call(a)=="[object RegExp]"};k.isNull=function(a){return a===null};k.isUndefined=function(a){return a===void 0};k.has=function(a,b){return j.call(a,b)};k.noConflict=function(){d._=h;return this};k.identity=function(a){return a};
k.times=function(a,b,e){for(var c=0;c<a;c++)b.call(e,c)};k.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};k.result=function(a,b){if(a==null)return null;var e=a[b];return k.isFunction(e)?e.call(a):e};k.mixin=function(a){t(k.functions(a),function(b){F(b,k[b]=a[b])})};var G=0;k.uniqueId=function(a){var b=G++;return a?a+b:b};k.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,
escape:/<%-([\s\S]+?)%>/g};var z=/.^/,y={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},A;for(A in y)y[y[A]]=A;var H=/\\|'|\r|\n|\t|\u2028|\u2029/g,I=/\\(\\|'|r|n|t|u2028|u2029)/g,B=function(a){return a.replace(I,function(a,b){return y[b]})};k.template=function(a,b,e){e=k.defaults(e||{},k.templateSettings);a="__p+='"+a.replace(H,function(a){return"\\"+y[a]}).replace(e.escape||z,function(a,b){return"'+\n_.escape("+B(b)+")+\n'"}).replace(e.interpolate||z,function(a,b){return"'+\n("+
B(b)+")+\n'"}).replace(e.evaluate||z,function(a,b){return"';\n"+B(b)+"\n;__p+='"})+"';\n";e.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",c=new Function(e.variable||"obj","_",a);if(b)return c(b,k);b=function(a){return c.call(this,a,k)};b.source="function("+(e.variable||"obj")+"){\n"+a+"}";return b};k.chain=function(a){return k(a).chain()};var x=function(a){this._wrapped=a};k.prototype=x.prototype;
var C=function(a,b){return b?k(a).chain():a},F=function(b,e){x.prototype[b]=function(){var b=a.call(arguments);g.call(b,this._wrapped);return C(e.apply(k,b),this._chain)}};k.mixin(k);t(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var e=b[a];x.prototype[a]=function(){var b=this._wrapped;e.apply(b,arguments);var c=b.length;(a=="shift"||a=="splice")&&c===0&&delete b[0];return C(b,this._chain)}});t(["concat","join","slice"],function(a){var e=b[a];x.prototype[a]=function(){return C(e.apply(this._wrapped,
arguments),this._chain)}});x.prototype.chain=function(){this._chain=!0;return this};x.prototype.value=function(){return this._wrapped};return k}.call({}),emmet=function(f){function d(a,b,d){var f;f=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};_.extend(f,a);c.prototype=a.prototype;f.prototype=new c;b&&_.extend(f.prototype,b);d&&_.extend(f,d);f.prototype.constructor=f;f.__super__=a.prototype;return f}function h(c){!(c in b)&&a&&a(c);return b[c]}if(typeof _=="undefined")try{_=
f.require("underscore")}catch(i){}if(typeof _=="undefined")throw"Cannot access to Underscore.js lib";var b={_:_},c=function(){},a=null;return{define:function(a,e){a in b||(b[a]=_.isFunction(e)?this.exec(e):e)},require:h,exec:function(a,b){return a.call(b||f,_.bind(h,this),_,this)},extend:function(a,b){var c=d(this,a,b);c.extend=this.extend;if(a.hasOwnProperty("toString"))c.prototype.toString=a.toString;return c},expandAbbreviation:function(a,b,c,d){if(!a)return"";var b=b||"html",f=h("filters"),i=
h("abbreviationParser"),c=h("profile").get(c,b);h("tabStops").resetTabstopIndex();a=f.extractFromAbbreviation(a);d=i.parse(a[0],{syntax:b,contextNode:d});b=f.composeList(b,c,a[1]);f.apply(d,b,c);return d.toString()},defaultSyntax:function(){return"html"},defaultProfile:function(){return"plain"},log:function(){f.console&&f.console.log&&f.console.log.apply(f.console,arguments)},setModuleLoader:function(b){a=b}}}(this);
if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=emmet;exports.emmet=emmet}typeof define!=="undefined"&&define(emmet);
emmet.define("abbreviationParser",function(f,d){function h(){this.parent=null;this.children=[];this._attributes=[];this.abbreviation="";this.counter=1;this._name=null;this._text="";this.repeatCount=1;this.hasImplicitRepeat=!1;this._data={};this.padding=this.content=this.end=this.start=""}function i(a){return a.substring(1,a.length-1)}function b(a){for(var a=f("utils").trim(a),e=new h,c=e.addChild(),g,j=f("stringStream").create(a),a=1E3,n;!j.eol()&&--a>0;)switch(g=j.peek(),g){case "(":j.start=j.pos;
if(j.skipToPair("(",")"))g=b(i(j.current())),(n=j.match(/^\*(\d+)?/,!0))&&c._setRepeat(n[1]),d.each(g.children,function(a){c.addChild(a)});else throw'Invalid abbreviation: mo matching ")" found for character at '+j.pos;break;case ">":c=c.addChild();j.next();break;case "+":c=c.parent.addChild();j.next();break;case "^":g=c.parent||c;c=(g.parent||g).addChild();j.next();break;default:j.start=j.pos,j.eatWhile(function(a){if(a=="["||a=="{"){if(j.skipToPair(a,p[a]))return j.backUp(1),!0;throw'Invalid abbreviation: mo matching "'+
p[a]+'" found for character at '+j.pos;}return a=="+"?(j.next(),a=j.eol()||~"+>^*".indexOf(j.peek()),j.backUp(1),a):a!="("&&o(a)}),c.setAbbreviation(j.current()),j.start=j.pos}if(a<1)throw"Endless loop detected";return e}function c(a){var a=f("utils").trim(a),b=[],a=f("stringStream").create(a);for(a.eatSpace();!a.eol();)if(a.start=a.pos,a.eatWhile(m)){var e=a.current(),c="";if(a.peek()=="="){a.next();a.start=a.pos;var g=a.peek();if(g=='"'||g=="'"){a.next();a:{for(var c=a,d=void 0;d=c.next();)if(d===
g){c=!0;break a}c=!1}if(c)c=a.current(),c=c.substring(1,c.length-1);else throw"Invalid attribute value";}else if(a.eatWhile(/[^\s\]]/))c=a.current();else throw"Invalid attribute value";}b.push({name:e,value:c});a.eatSpace()}else break;return b}function a(a){for(var b=[],e={"#":"id",".":"class"},d=null,j=f("stringStream").create(a);!j.eol();)switch(j.peek()){case "#":case ".":if(d===null)d=j.pos;var h=e[j.peek()];j.next();j.start=j.pos;j.eatWhile(m);b.push({name:h,value:j.current()});break;case "[":if(d===
null)d=j.pos;j.start=j.pos;if(!j.skipToPair("[","]"))throw"Invalid attribute set definition";b=b.concat(c(i(j.current())));break;default:j.next()}return!b.length?null:{element:a.substring(0,d),attributes:g(b)}}function g(a){var a=d.map(a,function(a){return d.clone(a)}),b={};return d.filter(a,function(a){if(!(a.name in b))return b[a.name]=a;var e=b[a.name];a.name.toLowerCase()=="class"?e.value+=(e.value.length?" ":"")+a.value:e.value=a.value;return!1})}function e(a){if(!~a.indexOf("{"))return null;
for(var b=f("stringStream").create(a);!b.eol();)switch(b.peek()){case "[":case "(":b.skipToPair(b.peek(),p[b.peek()]);break;case "{":return b.start=b.pos,b.skipToPair("{","}"),{element:a.substring(0,b.start),text:i(b.current())};default:b.next()}}function j(a){for(var b=a.children.length-1,e,c,g;b>=0;b--)if(c=a.children[b],c.isRepeating()){g=e=c.repeatCount;c.repeatCount=1;c.updateProperty("counter",1);for(c.updateProperty("maxCount",g);--e>0;)c.parent.addChild(c.clone(),b+1).updateProperty("counter",
e+1).updateProperty("maxCount",g)}d.each(a.children,j);return a}function n(a){for(var b=a.children.length-1;b>=0;b--){var e=a.children[b];e.isGroup()?e.replace(n(e).children):e.isEmpty()&&e.remove()}d.each(a.children,n);return a}function o(a){var b=a.charCodeAt(0);return b>64&&b<91||b>96&&b<123||b>47&&b<58||"#.*:$-_!@|%".indexOf(a)!=-1}var l=/^[\w\-\$\:@\!%]+\+?$/i,m=/[\w\-:\$@]/,p={"[":"]","(":")","{":"}"},r=Array.prototype.splice,q=[],u=[],s=[];h.prototype={addChild:function(a,b){a=a||new h;a.parent=
this;d.isUndefined(b)?this.children.push(a):this.children.splice(b,0,a);return a},clone:function(){var a=new h;d.each(["abbreviation","counter","_name","_text","repeatCount","hasImplicitRepeat","start","end","content","padding"],function(b){a[b]=this[b]},this);a._attributes=d.map(this._attributes,function(a){return d.clone(a)});a._data=d.clone(this._data);a.children=d.map(this.children,function(b){b=b.clone();b.parent=a;return b});return a},remove:function(){if(this.parent)this.parent.children=d.without(this.parent.children,
this);return this},replace:function(){var a=this.parent,b=d.indexOf(a.children,this),e=d.flatten(arguments);r.apply(a.children,[b,1].concat(e));d.each(e,function(b){b.parent=a})},updateProperty:function(a,b){this[a]=b;d.each(this.children,function(e){e.updateProperty(a,b)});return this},find:function(a){return this.findAll(a)[0]},findAll:function(a){if(!d.isFunction(a))var b=a.toLowerCase(),a=function(a){return a.name().toLowerCase()==b};var e=[];d.each(this.children,function(b){a(b)&&e.push(b);e=
e.concat(b.findAll(a))});return d.compact(e)},data:function(a,b){if(arguments.length==2&&(this._data[a]=b,a=="resource"&&f("elements").is(b,"snippet")&&(this.content=b.data,this._text)))this.content=f("abbreviationUtils").insertChildContent(b.data,this._text);return this._data[a]},name:function(){var a=this.matchedResource();return f("elements").is(a,"element")?a.name:this._name},attributeList:function(){var a=[],b=this.matchedResource();f("elements").is(b,"element")&&d.isArray(b.attributes)&&(a=
a.concat(b.attributes));return g(a.concat(this._attributes))},attribute:function(a,b){if(arguments.length==2){var e=d.indexOf(d.pluck(this._attributes,"name"),a.toLowerCase());~e?this._attributes[e].value=b:this._attributes.push({name:a,value:b})}return(d.find(this.attributeList(),function(b){return b.name==a})||{}).value},matchedResource:function(){return this.data("resource")},index:function(){return this.parent?d.indexOf(this.parent.children,this):-1},_setRepeat:function(a){a?this.repeatCount=
parseInt(a,10)||1:this.hasImplicitRepeat=!0},setAbbreviation:function(b){var c=this;this.abbreviation=b=(b||"").replace(/\*(\d+)?$/,function(a,b){c._setRepeat(b);return""});var g=e(b);if(g)b=g.element,this.content=this._text=g.text;if(g=a(b))b=g.element,this._attributes=g.attributes;if((this._name=b)&&!l.test(this._name))throw"Invalid abbreviation";},toString:function(){var a=f("utils"),b=this.start,e=this.end,c=this.content,g=this;d.each(s,function(a){b=a(b,g,"start");c=a(c,g,"content");e=a(e,g,
"end")});var j=d.map(this.children,function(a){return a.toString()}).join(""),c=f("abbreviationUtils").insertChildContent(c,j,{keepVariable:!1});return b+a.padString(c,this.padding)+e},hasEmptyChildren:function(){return!!d.find(this.children,function(a){return a.isEmpty()})},hasImplicitName:function(){return!this._name&&!this.isTextNode()},isGroup:function(){return!this.abbreviation},isEmpty:function(){return!this.abbreviation&&!this.children.length},isRepeating:function(){return this.repeatCount>
1||this.hasImplicitRepeat},isTextNode:function(){return!this.name()&&!this.attributeList().length},isElement:function(){return!this.isEmpty()&&!this.isTextNode()},deepestChild:function(){if(!this.children.length)return null;for(var a=this;a.children.length;)a=d.last(a.children);return a}};s.push(function(a,b){return f("utils").replaceCounter(a,b.counter,b.maxCount)});return{parse:function(a,e){var e=e||{},c=b(a);if(e.contextNode){c._name=e.contextNode.name;var g={};d.each(c._attributes,function(a){g[a.name]=
a});d.each(e.contextNode.attributes,function(a){a.name in g?g[a.name].value=a.value:(a=d.clone(a),c._attributes.push(a),g[a.name]=a)})}d.each(q,function(a){a(c,e)});c=n(j(c));d.each(u,function(a){a(c,e)});return c},AbbreviationNode:h,addPreprocessor:function(a){d.include(q,a)||q.push(a)},removeFilter:function(a){preprocessor=d.without(q,a)},addPostprocessor:function(a){d.include(u,a)||u.push(a)},removePostprocessor:function(a){u=d.without(u,a)},addOutputProcessor:function(a){d.include(s,a)||s.push(a)},
removeOutputProcessor:function(a){s=d.without(s,a)},isAllowedChar:function(a){a=String(a);return o(a)||~">+^[](){}".indexOf(a)}}});
emmet.exec(function(f,d){function h(i,b){var c=f("resources"),a=f("elements"),g=f("abbreviationParser");d.each(d.clone(i.children),function(e){var j=c.getMatchedResource(e,b);if(d.isString(j))e.data("resource",a.create("snippet",j));else if(a.is(j,"reference")){j=g.parse(j.data,{syntax:b});if(e.repeatCount>1){var f=j.findAll(function(a){return a.hasImplicitRepeat});d.each(f,function(a){a.repeatCount=e.repeatCount;a.hasImplicitRepeat=!1})}var i=j.deepestChild();i&&d.each(e.children,function(a){i.addChild(a)});
d.each(j.children,function(a){d.each(e.attributeList(),function(b){a.attribute(b.name,b.value)})});e.replace(j.children)}else e.data("resource",j);h(e,b)})}f("abbreviationParser").addPreprocessor(function(d,b){var c=b.syntax||emmet.defaultSyntax();h(d,c)})});
emmet.exec(function(f,d){function h(a){for(var b=f("range"),c=[],a=f("stringStream").create(a);!a.eol();){if(a.peek()=="\\")a.next();else if(a.start=a.pos,a.match(g,!0)){c.push(b.create(a.start,g));continue}a.next()}return c}function i(a,b){var c=f("utils"),g=h(a);g.reverse();d.each(g,function(g){a=c.replaceSubstring(a,b,g)});return a}function b(a){return h(a.content).length?!0:!!d.find(a.attributeList(),function(a){return!!h(a.value).length})}function c(a,c,g){var h=a.findAll(function(a){return b(a)});
b(a)&&h.unshift(a);h.length?d.each(h,function(a){a.content=i(a.content,c);d.each(a._attributes,function(a){a.value=i(a.value,c)})}):(a=a.deepestChild()||a,a.content=g?c:f("abbreviationUtils").insertChildContent(a.content,c))}var a=f("abbreviationParser"),g="$#";a.addPreprocessor(function(a,b){if(b.pastedContent){var c=f("utils"),g=d.map(c.splitByLines(b.pastedContent,!0),c.trim);a.findAll(function(a){if(a.hasImplicitRepeat)return a.data("paste",g),a.repeatCount=g.length})}});a.addPostprocessor(function(a,
b){!a.findAll(function(a){var b=a.data("paste"),e="";d.isArray(b)?e=b[a.counter-1]:d.isFunction(b)?e=b(a.counter-1,a.content):b&&(e=b);e&&c(a,e,!!a.data("pasteOverwrites"));a.data("paste",null);return!!b}).length&&b.pastedContent&&c(a,b.pastedContent)})});emmet.exec(function(f,d){function h(i){var b=f("tagName");d.each(i.children,function(c){if(c.hasImplicitName()||c.data("forceNameResolving"))c._name=b.resolve(c.parent.name());h(c)});return i}f("abbreviationParser").addPostprocessor(h)});
emmet.define("cssParser",function(f,d){function h(a){return typeof a!=="undefined"}function i(){return{"char":e.chnum,line:e.linenum}}function b(a,b,c){var g=e,c=c||{};j.push({charstart:h(c["char"])?c["char"]:g.chnum,charend:h(c.charend)?c.charend:g.chnum,linestart:h(c.line)?c.line:g.linenum,lineend:h(c.lineend)?c.lineend:g.linenum,value:a,type:b||a})}function c(a,b){var c=e,g=b||{},d=h(g["char"])?g["char"]:c.chnum,g=h(g.line)?g.line:c.linenum;return{name:"ParseError",message:a+" at line "+(g+1)+
" char "+(d+1),walker:c,tokens:j}}function a(a){var c=e,g=c.ch,d=i(),j=a?a+g:g,g=c.nextChar();for(a&&(d["char"]-=a.length);o(g)||l(g);)j+=g,g=c.nextChar();b(j,"identifier",d)}function g(){var g=e.ch;if(g===" "||g==="\t"){for(var d=e.ch,j="",f=i();d===" "||d==="\t";)j+=d,d=e.nextChar();b(j,"white",f)}else{if(g==="/"){var d=e,g=f=d.ch,h,s=i();h=d.nextChar();if(h!=="*")s.charend=s["char"],s.lineend=s.line,j=b(g,g,s);else{for(;!(f==="*"&&h==="/");)g+=h,f=h,h=d.nextChar();g+=h;d.nextChar();b(g,"comment",
s)}return j}if(g==='"'||g==="'"){d=e;g=f=j=d.ch;s=i();for(j=d.nextChar();j!==f;){if(j==="\n")if(h=d.nextChar(),h==="\\")g+=j+h;else throw c("Unterminated string",s);else g+=j==="\\"?j+d.nextChar():j;j=d.nextChar()}g+=j;d.nextChar();b(g,"string",s)}else if(g==="("){d=e;j=d.ch;f=0;g=j;h=i();for(j=d.nextChar();j!==")"&&!f;){if(j==="(")f++;else if(j===")")f--;else if(j===!1)throw c("Unterminated brace",h);g+=j;j=d.nextChar()}g+=j;d.nextChar();b(g,"brace",h)}else{if(g==="-"||g==="."||l(g)){j=e;f=j.ch;
g=i();h=f;var s=h===".",v,f=j.nextChar();v=!l(f);if(s&&v)g.charend=g["char"],g.lineend=g.line,d=b(h,".",g);else if(h==="-"&&v)d=a("-");else{for(;f!==!1&&(l(f)||!s&&f===".");)f==="."&&(s=!0),h+=f,f=j.nextChar();b(h,"number",g)}return d}if(o(g))return a();if(n(g))return d=e,g=d.ch,j=i(),h=d.nextChar(),h==="="&&n(g,!0)?(g+=h,b(g,"match",j),d.nextChar(),f=void 0):(j.charend=j["char"]+1,j.lineend=j.line,b(g,g,j)),f;if(g==="\n")b("line"),e.nextChar();else throw c("Unrecognized character");}}}var e,j=[],
n,o,l;e={lines:null,total_lines:0,linenum:-1,line:"",ch:"",chnum:-1,init:function(a){var b=e;b.lines=a.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n");b.total_lines=b.lines.length;b.chnum=-1;b.linenum=-1;b.ch="";b.line="";b.nextLine();b.nextChar()},nextLine:function(){this.linenum+=1;this.line=this.total_lines<=this.linenum?!1:this.lines[this.linenum];if(this.chnum!==-1)this.chnum=0;return this.line},nextChar:function(){for(this.chnum+=1;this.line.charAt(this.chnum)==="";){if(this.nextLine()===
!1)return this.ch=!1;this.chnum=-1;return this.ch="\n"}return this.ch=this.line.charAt(this.chnum)},peek:function(){return this.line.charAt(this.chnum+1)}};o=function(a){return a=="&"||a==="_"||a==="-"||a>="a"&&a<="z"||a>="A"&&a<="Z"};l=function(a){return a!==!1&&a>="0"&&a<="9"};n=function(){for(var a="{}[]()+*=.,;:>~|\\%$#@^!".split(""),b="*^|$~".split(""),c={},e={},g=0;g<a.length;g+=1)c[a[g]]=!0;for(g=0;g<b.length;g+=1)e[b[g]]=!0;return function(a,b){return b?!!e[a]:!!c[a]}}();return{lex:function(a){e.init(a);
for(j=[];e.ch!==!1;)g();return j},parse:function(a){var b=0;return d.map(this.lex(a),function(c){if(c.type=="line")c.value=a.charAt(b)=="\r"&&a.charAt(b+1)=="\n"?"\r\n":a.charAt(b);return{type:c.type,start:b,end:b+=c.value.length}})},toSource:function(a){for(var b=0,c=a.length,e,g="";b<c;b+=1)e=a[b],g+=e.type==="line"?"\n":e.value;return g}}});
emmet.define("xmlParser",function(f){function d(a,e){function g(b){e.tokenize=b;return b(a,e)}var d=a.next();if(d=="<")if(a.eat("!"))return a.eat("[")?a.match("CDATA[")?g(b("atom","]]\>")):null:a.match("--")?g(b("comment","--\>")):a.match("DOCTYPE",!0,!0)?(a.eatWhile(/[\w\._\-]/),g(c(1))):null;else if(a.eat("?"))return a.eatWhile(/[\w\._\-]/),e.tokenize=b("meta","?>"),"meta";else{w=a.eat("/")?"closeTag":"openTag";a.eatSpace();for(v="";d=a.eat(/[^\s\u00a0=<>\"\'\/?]/);)v+=d;e.tokenize=h;return"tag"}else return d==
"&"?(a.eat("#")?a.eat("x")?a.eatWhile(/[a-fA-F\d]/)&&a.eat(";"):a.eatWhile(/[\d]/)&&a.eat(";"):a.eatWhile(/[\w\.\-:]/)&&a.eat(";"))?"atom":"error":(a.eatWhile(/[^&<]/),"text")}function h(a,b){var c=a.next();return c==">"||c=="/"&&a.eat(">")?(b.tokenize=d,w=c==">"?"endTag":"selfcloseTag","tag"):c=="="?(w="equals",null):/[\'\"]/.test(c)?(b.tokenize=i(c),b.tokenize(a,b)):(a.eatWhile(/[^\s\u00a0=<>\"\'\/?]/),"word")}function i(a){return function(b,c){for(;!b.eol();)if(b.next()==a){c.tokenize=h;break}return"string"}}
function b(a,b){return function(c,e){for(;!c.eol();){if(c.match(b)){e.tokenize=d;break}c.next()}return a}}function c(a){return function(b,e){for(var g;(g=b.next())!=null;)if(g=="<")return e.tokenize=c(a+1),e.tokenize(b,e);else if(g==">")if(a==1){e.tokenize=d;break}else return e.tokenize=c(a-1),e.tokenize(b,e);return"meta"}}function a(){for(var a=arguments.length-1;a>=0;a--)k.cc.push(arguments[a])}function g(){a.apply(null,arguments);return!0}function e(){if(k.context)k.context=k.context.prev}function j(a){if(a==
"openTag")return k.tagName=v,g(m,n(k.startOfLine));else if(a=="closeTag")return a=!1,k.context?k.context.tagName!=v&&(s.implicitlyClosed.hasOwnProperty(k.context.tagName.toLowerCase())&&e(),a=!k.context||k.context.tagName!=v):a=!0,a&&(t="error"),g(o(a));return g()}function n(a){return function(b){if(b=="selfcloseTag"||b=="endTag"&&s.autoSelfClosers.hasOwnProperty(k.tagName.toLowerCase()))return l(k.tagName.toLowerCase()),g();if(b=="endTag"){l(k.tagName.toLowerCase());var b=k.tagName,c=s.doNotIndent.hasOwnProperty(b)||
k.context&&k.context.noIndent;k.context={prev:k.context,tagName:b,indent:k.indented,startOfLine:a,noIndent:c}}return g()}}function o(a){return function(b){a&&(t="error");if(b=="endTag")return e(),g();t="error";return g(arguments.callee)}}function l(a){for(var b;;){if(!k.context)break;b=k.context.tagName.toLowerCase();if(!s.contextGrabbers.hasOwnProperty(b)||!s.contextGrabbers[b].hasOwnProperty(a))break;e()}}function m(b){if(b=="word")return t="attribute",g(p,m);if(b=="endTag"||b=="selfcloseTag")return a();
t="error";return g(m)}function p(b){if(b=="equals")return g(r,m);s.allowMissing||(t="error");return b=="endTag"||b=="selfcloseTag"?a():g()}function r(b){if(b=="string")return g(q);if(b=="word"&&s.allowUnquoted)return t="string",g();t="error";return b=="endTag"||b=="selfCloseTag"?a():g()}function q(b){return b=="string"?g(q):a()}function u(a,b){if(a.sol())b.startOfLine=!0,b.indented=0;if(a.eatSpace())return null;t=w=v=null;var c=b.tokenize(a,b);b.type=w;if((c||w)&&c!="comment")for(k=b;;)if((b.cc.pop()||
j)(w||c))break;b.startOfLine=!1;return t||c}var s={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!0,allowMissing:!0},v=null,w=null,k=null,t;return{parse:function(a,b){for(var b=b||0,c={tokenize:d,cc:[],indented:0,startOfLine:!0,tagName:null,context:null},e=f("stringStream").create(a),g=[];!e.eol();)g.push({type:u(e,c),start:e.start+b,end:e.pos+b}),e.start=e.pos;return g}}});
emmet.define("string-score",function(){return{score:function(f,d,h){if(f==d)return 1;if(d=="")return 0;for(var i=0,b=d.length,c=f.length,a,g=1,e=0,j,n,o,l;e<b;++e){o=d.charAt(e);j=f.indexOf(o.toLowerCase());n=f.indexOf(o.toUpperCase());l=Math.min(j,n);n=l>-1?l:Math.max(j,n);if(n===-1)if(h){g+=1-h;continue}else return 0;else j=0.1;f[n]===o&&(j+=0.1);n===0?(j+=0.6,e===0&&(a=1)):f.charAt(n-1)===" "&&(j+=0.8);f=f.substring(n+1,c);i+=j}f=i/b;b=(f*(b/c)+f)/2;b/=g;a&&b+0.15<1&&(b+=0.15);return b}}});
emmet.define("utils",function(f,d){function h(b){this._data=[];this.length=0;b&&this.append(b)}var i="${0}";h.prototype={append:function(b){this._data.push(b);this.length+=b.length},toString:function(){return this._data.join("")},valueOf:function(){return this.toString()}};return{reTag:/<\/?[\w:\-]+(?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*\s*(\/?)>$/,endsWithTag:function(b){return this.reTag.test(b)},isNumeric:function(b){typeof b=="string"&&(b=b.charCodeAt(0));return b&&b>47&&
b<58},trim:function(b){return(b||"").replace(/^\s+|\s+$/g,"")},getNewline:function(){var b=f("resources");if(!b)return"\n";b=b.getVariable("newline");return d.isString(b)?b:"\n"},setNewline:function(b){var c=f("resources");c.setVariable("newline",b);c.setVariable("nl",b)},splitByLines:function(b,c){var a=this.getNewline(),a=(b||"").replace(/\r\n/g,"\n").replace(/\n\r/g,"\n").replace(/\r/g,"\n").replace(/\n/g,a).split(a);c&&(a=d.filter(a,function(a){return a.length&&!!this.trim(a)},this));return a},
normalizeNewline:function(b){return this.splitByLines(b).join(this.getNewline())},repeatString:function(b,c){for(var a=[],g=0;g<c;g++)a.push(b);return a.join("")},getStringsPads:function(b){var b=d.map(b,function(a){return d.isString(a)?a.length:+a}),c=d.max(b);return d.map(b,function(a){return(a=c-a)?this.repeatString(" ",a):""},this)},padString:function(b,c){var a=d.isNumber(c)?this.repeatString(f("resources").getVariable("indentation")||"\t",c):c,g=[],e=this.splitByLines(b),j=this.getNewline();
g.push(e[0]);for(var h=1;h<e.length;h++)g.push(j+a+e[h]);return g.join("")},zeroPadString:function(b,c){for(var a="",g=b.length;c>g++;)a+="0";return a+b},unindentString:function(b,c){for(var a=this.splitByLines(b),g=0;g<a.length;g++)a[g].search(c)==0&&(a[g]=a[g].substr(c.length));return a.join(this.getNewline())},replaceUnescapedSymbol:function(b,c,a){for(var g=0,e=b.length,j=c.length,f=0;g<e;)if(b.charAt(g)=="\\")g+=j+1;else if(b.substr(g,j)==c){var h=j;f++;var i=a;if(d.isFunction(a))(i=a(b,c,g,
f))?(h=i[0].length,i=i[1]):i=!1;i===!1?g++:(b=b.substring(0,g)+i+b.substring(g+h),e=b.length,g+=i.length)}else g++;return b},replaceVariables:function(b,c){var c=c||{},a=d.isFunction(c)?c:function(a,b){return b in c?c[b]:null},g=f("resources");return f("tabStops").processText(b,{variable:function(b){var c=a(b.token,b.name,b);c===null&&(c=g.getVariable(b.name));if(c===null||d.isUndefined(c))c=b.token;return c}})},replaceCounter:function(b,c,a){b=String(b);c=String(c);/^\-?\d+$/.test(c)&&(c=+c);var g=
this;return this.replaceUnescapedSymbol(b,"$",function(b,j,f){if(b.charAt(f+1)=="{"||g.isNumeric(b.charAt(f+1)))return!1;for(j=f+1;b.charAt(j)=="$"&&b.charAt(j+1)!="{";)j++;var h=j-f,i=0,m=!1,p;if(p=b.substr(j).match(/^@(\-?)(\d*)/))j+=p[0].length,p[1]&&(m=!0),i=parseInt(p[2]||1)-1;m&&a&&d.isNumber(c)&&(c=a-c+1);c+=i;return[b.substring(f,j),g.zeroPadString(c+"",h)]})},matchesTag:function(b){return this.reTag.test(b||"")},escapeText:function(b){return b.replace(/([\$\\])/g,"\\$1")},unescapeText:function(b){return b.replace(/\\(.)/g,
"$1")},getCaretPlaceholder:function(){return d.isFunction(i)?i.apply(this,arguments):i},setCaretPlaceholder:function(b){i=b},getLinePadding:function(b){return(b.match(/^(\s+)/)||[""])[0]},getLinePaddingFromPosition:function(b,c){return this.getLinePadding(this.findNewlineBounds(b,c).substring(b))},escapeForRegexp:function(b){return b.replace(RegExp("[.*+?|()\\[\\]{}\\\\]","g"),"\\$&")},prettifyNumber:function(b,c){return b.toFixed(typeof c=="undefined"?2:c).replace(/\.?0+$/,"")},stringBuilder:function(b){return new h(b)},
replaceSubstring:function(b,c,a,g){if(d.isObject(a)&&"end"in a)g=a.end,a=a.start;d.isString(g)&&(g=a+g.length);d.isUndefined(g)&&(g=a);return a<0||a>b.length?b:b.substring(0,a)+c+b.substring(g)},narrowToNonSpace:function(b,c,a){c=f("range").create(c,a);for(a=/[\s\n\r\u00a0]/;c.start<c.end;){if(!a.test(b.charAt(c.start)))break;c.start++}for(;c.end>c.start;)if(c.end--,!a.test(b.charAt(c.end))){c.end++;break}return c},findNewlineBounds:function(b,c){for(var a=b.length,g=0,e=a-1,d=c-1;d>0;d--){var h=
b.charAt(d);if(h=="\n"||h=="\r"){g=d+1;break}}for(d=c;d<a;d++)if(h=b.charAt(d),h=="\n"||h=="\r"){e=d;break}return f("range").create(g,e-g)},deepMerge:function(){var b,c,a,g,e,j=arguments[0]||{},f=1,h=arguments.length;for(!d.isObject(j)&&!d.isFunction(j)&&(j={});f<h;f++)if((b=arguments[f])!=null)for(c in b)a=j[c],g=b[c],j!==g&&(g&&(d.isObject(g)||(e=d.isArray(g)))?(e?(e=!1,a=a&&d.isArray(a)?a:[]):a=a&&d.isObject(a)?a:{},j[c]=this.deepMerge(a,g)):g!==void 0&&(j[c]=g));return j}}});
emmet.define("range",function(f,d){function h(b,c,a){switch(a){case "eq":case "==":return b===c;case "lt":case "<":return b<c;case "lte":case "<=":return b<=c;case "gt":case ">":return b>c;case "gte":case ">=":return b>=c}}function i(b,c){d.isObject(b)&&"start"in b?(this.start=Math.min(b.start,b.end),this.end=Math.max(b.start,b.end)):d.isArray(b)?(this.start=b[0],this.end=b[1]):(c=d.isString(c)?c.length:+c,this.start=b,this.end=b+c)}i.prototype={length:function(){return Math.abs(this.end-this.start)},
equal:function(b){return this.cmp(b,"eq","eq")},shift:function(b){this.start+=b;this.end+=b;return this},overlap:function(b){return b.start<=this.end&&b.end>=this.start},intersection:function(b){if(this.overlap(b)){var c=Math.max(b.start,this.start);return new i(c,Math.min(b.end,this.end)-c)}return null},union:function(b){if(this.overlap(b)){var c=Math.min(b.start,this.start);return new i(c,Math.max(b.end,this.end)-c)}return null},inside:function(b){return this.cmp(b,"lte","gt")},contains:function(b){return this.cmp(b,
"lt","gt")},include:function(){return this.cmp(loc,"lte","gte")},cmp:function(b,c,a){var g;b instanceof i?(g=b.start,b=b.end):g=b;return h(this.start,g,c||"<=")&&h(this.end,b,a||">")},substring:function(b){return this.length()>0?b.substring(this.start,this.end):""},clone:function(){return new i(this.start,this.length())},toArray:function(){return[this.start,this.end]},toString:function(){return"{"+this.start+", "+this.length()+"}"}};return{create:function(b,c){if(d.isUndefined(b)||b===null)return null;
if(b instanceof i)return b;if(d.isObject(b)&&"start"in b&&"end"in b)c=b.end-b.start,b=b.start;return new i(b,c)},create2:function(b,c){d.isNumber(b)&&d.isNumber(c)&&(c-=b);return this.create(b,c)}}});
emmet.define("handlerList",function(f,d){function h(){this._list=[]}h.prototype={add:function(f,b){this._list.push(d.extend({order:0},b||{},{fn:f}))},remove:function(f){this._list=d.without(this._list,d.find(this._list,function(b){return b.fn===f}))},list:function(){return d.sortBy(this._list,"order").reverse()},listFn:function(){return d.pluck(this.list(),"fn")},exec:function(f,b){var b=b||[],c=null;d.find(this.list(),function(a){c=a.fn.apply(a,b);if(c!==f)return!0});return c}};return{create:function(){return new h}}});
emmet.define("tokenIterator",function(f,d){function h(d){this.tokens=d;this._position=0;this.reset()}h.prototype={next:function(){if(this.hasNext()){var d=this.tokens[++this._i];this._position=d.start;return d}return null},current:function(){return this.tokens[this._i]},position:function(){return this._position},hasNext:function(){return this._i<this._il-1},reset:function(){this._i=-1;this._il=this.tokens.length},item:function(){return this.tokens[this._i]},itemNext:function(){return this.tokens[this._i+
1]},itemPrev:function(){return this.tokens[this._i-1]},nextUntil:function(f,b){for(var c,a=d.isString(f)?function(a){return a.type==f}:f;c=this.next();)if(b&&b.call(this,c),a.call(this,c))break}};return{create:function(d){return new h(d)}}});
emmet.define("stringStream",function(){function f(d){this.pos=this.start=0;this.string=d}f.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==0},peek:function(){return this.string.charAt(this.pos)},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(d){var f=this.string.charAt(this.pos);if(typeof d=="string"?f==d:f&&(d.test?d.test(f):d(f)))return++this.pos,f},eatWhile:function(d){for(var f=this.pos;this.eat(d););
return this.pos>f},eatSpace:function(){for(var d=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>d},skipToEnd:function(){this.pos=this.string.length},skipTo:function(d){d=this.string.indexOf(d,this.pos);if(d>-1)return this.pos=d,!0},skipToPair:function(d,f){for(var i=0,b,c=this.pos,a=this.string.length;c<a;)if(b=this.string.charAt(c++),b==d)i++;else if(b==f&&(i--,i<1))return this.pos=c,!0;return!1},backUp:function(d){this.pos-=d},match:function(d,f,i){if(typeof d==
"string"){if(i=i?function(b){return b.toLowerCase()}:function(b){return b},i(this.string).indexOf(i(d),this.pos)==this.pos)return f!==!1&&(this.pos+=d.length),!0}else return(d=this.string.slice(this.pos).match(d))&&f!==!1&&(this.pos+=d[0].length),d},current:function(){return this.string.slice(this.start,this.pos)}};return{create:function(d){return new f(d)}}});
emmet.define("resources",function(f,d){function h(a,c,g){var d=f("utils"),c=d.replaceUnescapedSymbol(c,"|",d.getCaretPlaceholder());if(g=="snippets")return f("elements").create("snippet",c);if(g=="abbreviations"){g=c;f("utils").trim(a);var a=f("elements"),h;return(h=b.exec(g))?a.create("element",h[1],h[2],h[4]=="/"):a.create("reference",g)}}var i={},b=/^<(\w+\:?[\w\-]*)((?:\s+[\w\:\-]+\s*=\s*(['"]).*?\3)*)\s*(\/?)>/,c={},a={},g=f("handlerList").create();return{setVocabulary:function(b,g){i={};g==
"system"?c=b:a=b},getVocabulary:function(b){return b=="system"?c:a},getMatchedResource:function(a,b){return g.exec(null,d.toArray(arguments))||this.findSnippet(b,a.name())},getVariable:function(a){return(this.getSection("variables")||{})[a]},setVariable:function(a,b){var c=this.getVocabulary("user")||{};if(!("variables"in c))c.variables={};c.variables[a]=b;this.setVocabulary(c,"user")},hasSyntax:function(a){return a in this.getVocabulary("user")||a in this.getVocabulary("system")},addResolver:function(a,
b){g.add(a,b)},removeResolver:function(a){g.remove(a)},getSection:function(b){if(!b)return null;b in i||(i[b]=f("utils").deepMerge({},c[b],a[b]));for(var g=i[b],h=d.rest(arguments),o;g&&(o=h.shift());)if(o in g)g=g[o];else return null;return g},findItem:function(a,b){for(var c=this.getSection(a);c;){if(b in c)return c[b];c=this.getSection(c["extends"])}},findSnippet:function(a,b,c){if(!a||!b)return null;var c=c||[],g=[b];~b.indexOf("-")&&g.push(b.replace(/\-/g,":"));var f=this.getSection(a),i=null;
d.find(["snippets","abbreviations"],function(b){var c=this.getSection(a,b);if(c)return d.find(g,function(a){if(c[a])return i=h(a,c[a],b)})},this);c.push(a);return!i&&f["extends"]&&!d.include(c,f["extends"])?this.findSnippet(f["extends"],b,c):i},fuzzyFindSnippet:function(a,b,c){var c=c||0.3,a=this.getAllSnippets(a),g=f("string-score"),b=b.replace(/:$/,"").replace(/:/g,"-"),h=d.map(a,function(a,c){return{key:c,score:g.score(a.nk,b,0.1)}});if((h=d.last(d.sortBy(h,"score")))&&h.score>=c)return a[h.key].parsedValue},
getAllSnippets:function(a){var b="all-"+a;if(!i[b]){var c=[],g=[];do{var f=this.getSection(a);if(!f)break;d.each(["snippets","abbreviations"],function(a){var b={};d.each(f[a]||null,function(c,g){b[g]={nk:g.replace(/:$/,"").replace(/:/g,"-"),value:c,parsedValue:h(g,c,a),type:a}});c.push(b)});g.push(a);a=f["extends"]}while(a&&!d.include(g,a));i[b]=d.extend.apply(d,c.reverse())}return i[b]}}});
emmet.define("actions",function(f,d){function h(b){return f("utils").trim(b.charAt(0).toUpperCase()+b.substring(1).replace(/_[a-z]/g,function(b){return" "+b.charAt(1).toUpperCase()}))}var i={};return{add:function(b,c,a){b=b.toLowerCase();a=a||{};if(!a.label)a.label=h(b);i[b]={name:b,fn:c,options:a}},get:function(b){return i[b.toLowerCase()]},run:function(b,c){d.isArray(c)||(c=d.rest(arguments));var a=this.get(b);return a?a.fn.apply(emmet,c):(emmet.log('Action "%s" is not defined',b),!1)},getAll:function(){return i},
getList:function(){return d.values(this.getAll())},getMenu:function(b){var c=[],b=b||[];d.each(this.getList(),function(a){if(!a.options.hidden&&!d.include(b,a.name)){var g=h(a.name),e=c;if(a.options.label)for(var j=a.options.label.split("/"),g=j.pop(),f,i;f=j.shift();)i=d.find(e,function(a){return a.type=="submenu"&&a.name==f}),i||(i={name:f,type:"submenu",items:[]},e.push(i)),e=i.items;e.push({type:"action",name:a.name,label:g})}});return c},getActionNameForMenuTitle:function(b,c){var a=null;d.find(c||
this.getMenu(),function(c){if(c.type=="action"){if(c.label==b||c.name==b)return a=c.name}else return a=this.getActionNameForMenuTitle(b,c.items)},this);return a||null}}});
emmet.define("profile",function(f,d){function h(a){d.extend(this,g,a)}function i(a,b){switch(String(b||"").toLowerCase()){case "lower":return a.toLowerCase();case "upper":return a.toUpperCase()}return a}function b(b,c){return a[b.toLowerCase()]=new h(c)}function c(){b("xhtml");b("html",{self_closing_tag:!1});b("xml",{self_closing_tag:!0,tag_nl:!0});b("plain",{tag_nl:!1,indent:!1,place_cursor:!1});b("line",{tag_nl:!1,indent:!1,extraFilters:"s"})}var a={},g={tag_case:"asis",attr_case:"asis",attr_quotes:"double",
tag_nl:"decide",tag_nl_leaf:!1,place_cursor:!0,indent:!0,inline_break:3,self_closing_tag:"xhtml",filters:"",extraFilters:""};h.prototype={tagName:function(a){return i(a,this.tag_case)},attributeName:function(a){return i(a,this.attr_case)},attributeQuote:function(){return this.attr_quotes=="single"?"'":'"'},selfClosing:function(){return this.self_closing_tag=="xhtml"?" /":this.self_closing_tag===!0?"/":""},cursor:function(){return this.place_cursor?f("utils").getCaretPlaceholder():""}};c();return{create:function(a,
c){return arguments.length==2?b(a,c):new h(d.defaults(a||{},g))},get:function(b,c){if(!b&&c){var g=f("resources").findItem(c,"profile");g&&(b=g)}return!b?a.plain:b instanceof h?b:d.isString(b)&&b.toLowerCase()in a?a[b.toLowerCase()]:this.create(b)},remove:function(b){b=(b||"").toLowerCase();b in a&&delete a[b]},reset:function(){a={};c()},stringCase:i}});
emmet.define("editorUtils",function(f){return{isInsideTag:function(d,f){for(var i=/^<\/?\w[\w\:\-]*.*?>/,b=f;b>-1;){if(d.charAt(b)=="<")break;b--}return b!=-1&&(i=i.exec(d.substring(b)))&&f>b&&f<b+i[0].length?!0:!1},outputInfo:function(d,f,i){i=i||d.getProfileName();return{syntax:String(f||d.getSyntax()),profile:i?String(i):null,content:String(d.getContent())}},unindent:function(d,h){return f("utils").unindentString(h,this.getCurrentLinePadding(d))},getCurrentLinePadding:function(d){return f("utils").getLinePadding(d.getCurrentLine())}}});
emmet.define("actionUtils",function(f){return{mimeTypes:{gif:"image/gif",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",svg:"image/svg+xml",html:"text/html",htm:"text/html"},extractAbbreviation:function(d){for(var h=d.length,i=-1,b=0,c=0,a=0,g=f("utils"),e=f("abbreviationParser");;){h--;if(h<0){i=0;break}var j=d.charAt(h);if(j=="]")c++;else if(j=="["){if(!c){i=h+1;break}c--}else if(j=="}")a++;else if(j=="{"){if(!a){i=h+1;break}a--}else if(j==")")b++;else if(j=="("){if(!b){i=h+1;break}b--}else if(!c&&
!a&&(!e.isAllowedChar(j)||j==">"&&g.endsWithTag(d.substring(0,h+1)))){i=h+1;break}}return i!=-1&&!a&&!c&&!b?d.substring(i).replace(/^[\*\+\>\^]+/,""):""},getImageSize:function(d){var f=function(){return d.charCodeAt(i++)};if(d.substr(0,8)==="\u0089PNG\r\n\u001a\n"){var i=d.indexOf("IHDR")+4;return{width:f()<<24|f()<<16|f()<<8|f(),height:f()<<24|f()<<16|f()<<8|f()}}else if(d.substr(0,4)==="GIF8")return i=6,{width:f()|f()<<8,height:f()|f()<<8};else if(d.substr(0,2)==="\u00ff\u00d8")for(var i=2,b=d.length;i<
b;){if(f()!=255)break;var c=f();if(c==218)break;var a=f()<<8|f();if(c>=192&&c<=207&&!(c&4)&&!(c&8))return i+=1,{height:f()<<8|f(),width:f()<<8|f()};else i+=a-2}},captureContext:function(d){if(String(d.getSyntax())in{html:1,xml:1,xsl:1}){var h=String(d.getContent()),i=f("htmlMatcher").find(h,d.getCaretPos());if(i&&i.type=="tag"){for(var d=/([\w\-:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,i=i.open,h=i.range.substring(h).replace(/^<[\w\-\:]+/,""),i={name:i.name,attributes:[]},
b;b=d.exec(h);)i.attributes.push({name:b[1],value:b[2]});return i}}return null},findExpressionBounds:function(d,h){for(var i=String(d.getContent()),b=i.length,c=d.getCaretPos()-1,a=c+1;c>=0&&h(i.charAt(c),c,i);)c--;for(;a<b&&h(i.charAt(a),a,i);)a++;if(a>c)return f("range").create([++c,a])},compoundUpdate:function(d,f){if(f){var i=d.getSelectionRange();d.replaceContent(f.data,f.start,f.end,!0);d.createSelection(f.caret,f.caret+i.end-i.start);return!0}return!1},detectSyntax:function(d,h){var i=h||"html";
f("resources").hasSyntax(i)||(i="html");if(i=="html"&&(this.isStyle(d)||this.isInlineCSS(d)))i="css";return i},detectProfile:function(d){var h=d.getSyntax(),i=f("resources").findItem(h,"profile");if(i)return i;switch(h){case "xml":case "xsl":return"xml";case "css":if(this.isInlineCSS(d))return"line";break;case "html":return(i=f("resources").getVariable("profile"))||(i=this.isXHTML(d)?"xhtml":"html"),i}return"xhtml"},isXHTML:function(d){return d.getContent().search(/<!DOCTYPE[^>]+XHTML/i)!=-1},isStyle:function(d){var h=
String(d.getContent()),d=d.getCaretPos();return(h=f("htmlMatcher").tag(h,d))&&h.open.name.toLowerCase()=="style"&&h.innerRange.cmp(d,"lte","gte")},isInlineCSS:function(d){var h=String(d.getContent()),d=d.getCaretPos();return(h=f("xmlEditTree").parseFromPosition(h,d,!0))?(h=h.itemFromPosition(d,!0))&&h.name().toLowerCase()=="style"&&h.valueRange(!0).cmp(d,"lte","gte"):!1}}});
emmet.define("abbreviationUtils",function(f,d){return{isSnippet:function(d){return f("elements").is(d.matchedResource(),"snippet")},isUnary:function(d){var i=d.matchedResource();return d.children.length||this.isSnippet(d)?!1:i&&i.is_empty||f("tagName").isEmptyElement(d.name())},isInline:function(d){return d.isTextNode()||!d.name()||f("tagName").isInlineLevel(d.name())},isBlock:function(d){return this.isSnippet(d)||!this.isInline(d)},isSnippet:function(d){return f("elements").is(d.matchedResource(),
"snippet")},hasTagsInContent:function(d){return f("utils").matchesTag(d.content)},hasBlockChildren:function(f){return this.hasTagsInContent(f)&&this.isBlock(f)||d.any(f.children,function(d){return this.isBlock(d)},this)},insertChildContent:function(h,i,b){var b=d.extend({keepVariable:!0,appendIfNoChild:!0},b||{}),c=!1,a=f("utils"),h=a.replaceVariables(h,function(g,e,d){var f=g;e=="child"&&(f=a.padString(i,a.getLinePaddingFromPosition(h,d.start)),c=!0,b.keepVariable&&(f+=g));return f});!c&&b.appendIfNoChild&&
(h+=i);return h}}});
emmet.define("base64",function(){return{encode:function(f){for(var d=[],h,i,b,c,a,g,e=0,j=f.length;e<j;)c=f.charCodeAt(e++),a=f.charCodeAt(e++),g=f.charCodeAt(e++),h=c&255,i=a&255,b=g&255,c=h>>2,h=(h&3)<<4|i>>4,i=(i&15)<<2|b>>6,b&=63,isNaN(a)?i=b=64:isNaN(g)&&(b=64),d.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(h)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(i)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(b));
return d.join("")},decode:function(f){var d,h,i,b,c,a=0,g=0,e=[],j=f.length;if(!f)return f;f+="";do d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(f.charAt(a++)),h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(f.charAt(a++)),b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(f.charAt(a++)),c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(f.charAt(a++)),i=d<<18|h<<12|b<<6|c,d=i>>16&
255,h=i>>8&255,i&=255,b==64?e[g++]=String.fromCharCode(d):c==64?e[g++]=String.fromCharCode(d,h):e[g++]=String.fromCharCode(d,h,i);while(a<j);return e.join("")}}});
emmet.define("htmlMatcher",function(f,d){function h(b){var e={},d;return{open:function(a){return(a=this.matches(a))&&a.type=="open"?a:null},close:function(a){return(a=this.matches(a))&&a.type=="close"?a:null},matches:function(h){var i="p"+h;if(!(i in e)&&b.charAt(h)=="<"){var l=b.slice(h);e[i]=(d=l.match(c))?{name:d[1],selfClose:!!d[3],range:f("range").create(h,d[0]),type:"open"}:(d=l.match(a))?{name:d[1],range:f("range").create(h,d[0]),type:"close"}:!1}return e[i]},text:function(){return b}}}function i(a,
b,c){return a.substring(b,b+c.length)==c}function b(a,b){for(var c=[],f=null,h=b.text(),l=a.range.end,m=h.length;l<m;l++){if(i(h,l,"<\!--"))for(f=l;f<m;f++)if(i(h,f,"--\>")){l=f+3;break}if(f=b.matches(l))if(f.type=="open"&&!f.selfClose)c.push(f.name);else if(f.type=="close"){if(!c.length)return f.name==a.name?f:null;if(d.last(c)==f.name)c.pop();else{for(var p=!1;c.length&&!p;)c.pop()==f.name&&(p=!0);if(!c.length&&!p)return f.name==a.name?f:null}}}}var c=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
a=/^<\/([\w\:\-]+)[^>]*>/;return{find:function(a,c){for(var j=f("range"),n=h(a),o=null,l=null,m=c;m>=0;m--)if(o=n.open(m))if(o.selfClose){if(o.range.cmp(c,"lt","gt"))break}else{if(l=b(o,n)){if(j.create2(o.range.start,l.range.end).contains(c))break}else if(o.range.contains(c))break;o=null}else if(i(a,m,"--\>"))for(var p=m-1;p>=0;p--)if(i(a,p,"--\>"))break;else{if(i(a,p,"<\!--")){m=p;break}}else if(i(a,m,"<\!--")){p=m+4;for(o=a.length;p<o;p++)if(i(a,p,"--\>")){p+=3;break}o={range:f("range").create(m,
d.isNumber(p)?p-m:p[0]),type:"comment"};break}if(o)return p=m=null,l?(m=j.create2(o.range.start,l.range.end),p=j.create2(o.range.end,l.range.start)):m=p=j.create2(o.range.start,o.range.end),o.type=="comment"&&(j=m.substring(a),p.start+=j.length-j.replace(/^<\!--\s*/,"").length,p.end-=j.length-j.replace(/\s*--\>$/,"").length),{open:o,close:l,type:o.type=="comment"?"comment":"tag",innerRange:p,innerContent:function(){return this.innerRange.substring(a)},outerRange:m,outerContent:function(){return this.outerRange.substring(a)},
range:!p.length()||!p.cmp(c,"lte","gte")?m:p,content:function(){return this.range.substring(a)},source:a}},tag:function(a,b){var c=this.find(a,b);if(c&&c.type=="tag")return c}}});
emmet.define("tabStops",function(f,d){var h=100,i=0,b={replaceCarets:!1,escape:function(b){return"\\"+b},tabstop:function(b){return b.token},variable:function(b){return b.token}};f("abbreviationParser").addOutputProcessor(function(b,a){var g=0,e=f("tabStops"),d=f("utils"),h={tabstop:function(a){var b=parseInt(a.group);if(b==0)return"${0}";b>g&&(g=b);return a.placeholder?(b+=i,a=e.processText(a.placeholder,h),"${"+b+":"+a+"}"):"${"+(b+i)+"}"}},b=e.processText(b,h),b=d.replaceVariables(b,e.variablesResolver(a));
i+=g+1;return b});return{extract:function(c,a){var g=f("utils"),e={carets:""},j=[],a=d.extend({},b,a,{tabstop:function(a){var b=a.token,c="";if(a.placeholder=="cursor")j.push({start:a.start,end:a.start+b.length,group:"carets",value:""});else{if("placeholder"in a)e[a.group]=a.placeholder;a.group in e&&(c=e[a.group]);j.push({start:a.start,end:a.start+b.length,group:a.group,value:c})}return b}});a.replaceCarets&&(c=c.replace(RegExp(g.escapeForRegexp(g.getCaretPlaceholder()),"g"),"${0:cursor}"));var c=
this.processText(c,a),h=g.stringBuilder(),i=0,g=d.map(j,function(a){h.append(c.substring(i,a.start));var b=h.length,g=e[a.group]||"";h.append(g);i=a.end;return{group:a.group,start:b,end:b+g.length}});h.append(c.substring(i));return{text:h.toString(),tabstops:d.sortBy(g,"start")}},processText:function(c,a){for(var a=d.extend({},b,a),g=f("utils").stringBuilder(),e=f("stringStream").create(c),j,h;j=e.next();)if(j=="\\"&&!e.eol())g.append(a.escape(e.next()));else{h=j;if(j=="$")if(e.start=e.pos-1,e.match(/^[0-9]+/))h=
a.tabstop({start:g.length,group:e.current().substr(1),token:e.current()});else if(j=e.match(/^\{([a-z_\-][\w\-]*)\}/))h=a.variable({start:g.length,name:j[1],token:e.current()});else if(j=e.match(/^\{([0-9]+)(:.+?)?\}/,!1)){e.skipToPair("{","}");h={start:g.length,group:j[1],token:e.current()};if(j=h.token.substring(h.group.length+2,h.token.length-1))h.placeholder=j.substr(1);h=a.tabstop(h)}g.append(h)}return g.toString()},upgrade:function(b,a){var g=0,e={tabstop:function(b){var c=parseInt(b.group);
c>g&&(g=c);return b.placeholder?"${"+(c+a)+":"+b.placeholder+"}":"${"+(c+a)+"}"}};d.each(["start","end","content"],function(a){b[a]=this.processText(b[a],e)},this);return g},variablesResolver:function(b){var a={},g=f("resources");return function(e,j){if(j=="child")return e;if(j=="cursor")return f("utils").getCaretPlaceholder();var i=b.attribute(j);if(!d.isUndefined(i)&&i!==e)return i;if(i=g.getVariable(j))return i;a[j]||(a[j]=h++);return"${"+a[j]+":"+j+"}"}},resetTabstopIndex:function(){i=0;h=100}}});
emmet.define("preferences",function(f,d){var h={},i={},b=null,c=null;return{define:function(a,b,c){var f=a;d.isString(a)&&(f={},f[a]={value:b,description:c});d.each(f,function(a,b){i[b]=d.isObject(a)&&"value"in a&&d.keys(a).length<3?a:{value:a}})},set:function(a,b){var c=a;d.isString(a)&&(c={},c[a]=b);d.each(c,function(a,b){if(!(b in i))throw'Property "'+b+'" is not defined. You should define it first with `define` method of current module';if(a!==i[b].value){switch(typeof i[b].value){case "boolean":var c=
a;d.isString(c)?(c=c.toLowerCase(),a=c=="yes"||c=="true"||c=="1"):a=!!c;break;case "number":a=parseInt(a+"",10)||0;break;default:a+=""}h[b]=a}else b in h&&delete h[b]})},get:function(a){if(a in h)return h[a];if(a in i)return i[a].value},getArray:function(a){a=this.get(a);d.isUndefined(a)||(a=d.map(a.split(","),f("utils").trim),a.length||(a=null));return a},getDict:function(a){var b={};d.each(this.getArray(a),function(a){a=a.split(":");b[a[0]]=a[1]});return b},description:function(a){return a in i?
i[a].description:void 0},remove:function(a){d.isArray(a)||(a=[a]);d.each(a,function(a){a in h&&delete h[a];a in i&&delete i[a]})},list:function(){return d.map(d.keys(i).sort(),function(a){return{name:a,value:this.get(a),type:typeof i[a].value,description:i[a].description}},this)},load:function(a){d.each(a,function(a,b){this.set(b,a)},this)},exportModified:function(){return d.clone(h)},reset:function(){h={}},_startTest:function(){b=i;c=h;i={};h={}},_stopTest:function(){i=b;h=c}}});
emmet.define("filters",function(f,d){function h(b){return!b?[]:d.isString(b)?b.split(/[\|,]/g):b}var i={};return{add:function(b,c){i[b]=c},apply:function(b,c,a){var g=f("utils"),a=f("profile").get(a);d.each(h(c),function(c){(c=g.trim(c.toLowerCase()))&&c in i&&(b=i[c](b,a))});return b},composeList:function(b,c,a){c=f("profile").get(c);b=h(c.filters||f("resources").findItem(b,"filters")||"html");c.extraFilters&&(b=b.concat(h(c.extraFilters)));a&&(b=b.concat(h(a)));if(!b||!b.length)b=h("html");return b},
extractFromAbbreviation:function(b){var c="",b=b.replace(/\|([\w\|\-]+)$/,function(a,b){c=b;return""});return[b,h(c)]}}});
emmet.define("elements",function(f,d){function h(a){return{data:a}}var i={},b=/([\w\-]+)\s*=\s*(['"])(.*?)\2/g,c={add:function(a,b){var c=this;i[a]=function(){var d=b.apply(c,arguments);if(d)d.type=a;return d}},get:function(a){return i[a]},create:function(a){var b=[].slice.call(arguments,1),c=this.get(a);return c?c.apply(this,b):null},is:function(a,b){return a&&a.type===b}};c.add("element",function(a,c,e){var f={name:a,is_empty:!!e};if(c)if(f.attributes=[],d.isArray(c))f.attributes=c;else if(d.isString(c))for(;a=
b.exec(c);)f.attributes.push({name:a[1],value:a[3]});else d.each(c,function(a,b){f.attributes.push({name:b,value:a})});return f});c.add("snippet",h);c.add("reference",h);c.add("empty",function(){return{}});return c});
emmet.define("editTree",function(f,d,h){function i(a,b){this.options=d.extend({offset:0},b);this.source=a;this._children=[];this._positions={name:0};this.initialize.apply(this,arguments)}function b(a,b,c){this.parent=a;this._name=b.value;this._value=c?c.value:"";this._positions={name:b.start,value:c?c.start:-1};this.initialize.apply(this,arguments)}var c=f("range").create;i.extend=h.extend;i.prototype={initialize:function(){},_updateSource:function(a,b,e){var j=c(b,d.isUndefined(e)?0:e-b),h=a.length-
j.length(),i=function(a){d.each(a,function(b,c){b>=j.end&&(a[c]+=h)})};i(this._positions);d.each(this.list(),function(a){i(a._positions)});this.source=f("utils").replaceSubstring(this.source,a,j)},add:function(a,c){var d=new b(a,c);this._children.push(d);return d},get:function(a){return d.isNumber(a)?this.list()[a]:d.isString(a)?d.find(this.list(),function(b){return b.name()===a}):a},getAll:function(a){d.isArray(a)||(a=[a]);var b=[],c=[];d.each(a,function(a){d.isString(a)?b.push(a):d.isNumber(a)&&
c.push(a)});return d.filter(this.list(),function(a,f){return d.include(c,f)||d.include(b,a.name())})},value:function(a,b,c){var f=this.get(a);if(f)return f.value(b);if(!d.isUndefined(b))return this.add(a,b,c)},values:function(a){return d.map(this.getAll(a),function(a){return a.value()})},remove:function(a){if(a=this.get(a))this._updateSource("",a.fullRange()),this._children=d.without(this._children,a)},list:function(){return this._children},indexOf:function(a){return d.indexOf(this.list(),this.get(a))},
name:function(a){if(!d.isUndefined(a)&&this._name!==(a=String(a)))this._updateSource(a,this._positions.name,this._positions.name+this._name.length),this._name=a;return this._name},nameRange:function(a){return c(this._positions.name+(a?this.options.offset:0),this.name())},range:function(a){return c(a?this.options.offset:0,this.toString())},itemFromPosition:function(a,b){return d.find(this.list(),function(c){return c.range(b).inside(a)})},toString:function(){return this.source}};b.extend=h.extend;b.prototype=
{initialize:function(){},_pos:function(a,b){return a+(b?this.parent.options.offset:0)},value:function(a){if(!d.isUndefined(a)&&this._value!==(a=String(a)))this.parent._updateSource(a,this.valueRange()),this._value=a;return this._value},name:function(a){if(!d.isUndefined(a)&&this._name!==(a=String(a)))this.parent._updateSource(a,this.nameRange()),this._name=a;return this._name},namePosition:function(a){return this._pos(this._positions.name,a)},valuePosition:function(a){return this._pos(this._positions.value,
a)},range:function(a){return c(this.namePosition(a),this.toString())},fullRange:function(a){return this.range(a)},nameRange:function(a){return c(this.namePosition(a),this.name())},valueRange:function(a){return c(this.valuePosition(a),this.value())},toString:function(){return this.name()+this.value()},valueOf:function(){return this.toString()}};return{EditContainer:i,EditElement:b,createToken:function(a,b,c){a={start:a||0,value:b||"",type:c};a.end=a.start+a.value.length;return a}}});
emmet.define("cssEditTree",function(f,d){function h(a,b){return f("range").create(a,b)}function i(a,b){var b=b||g|e,c=["white","line"];if((b&e)==e)for(;a.length&&d.include(c,d.last(a).type);)a.pop();if((b&g)==g)for(;a.length&&d.include(c,a[0].type);)a.shift();return a}function b(a){var b=["white","line",":"],c=[],f,j;a.nextUntil(function(){return!d.include(b,this.itemNext().type)});for(j=a.current().end;f=a.next();){if(f.type=="}"||f.type==";")return i(c,g|(f.type=="}"?e:0)),c.length?(j=c[0].start,
a=d.last(c).end):a=j,h(j,a-j);c.push(f)}if(c.length)return h(c[0].start,d.last(c).end-c[0].start)}function c(a){var b=f("stringStream").create(a),c=[],g=/[\s\u00a0,]/,e=function(){b.next();c.push(h(b.start,b.current()));b.start=b.pos};b.eatSpace();for(b.start=b.pos;a=b.next();)if(a=='"'||a=="'"){b.next();if(!b.skipTo(a))break;e()}else if(a=="("){b.backUp(1);if(!b.skipToPair("(",")"))break;b.backUp(1);e()}else if(g.test(a))c.push(h(b.start,b.current().length-1)),b.eatWhile(g),b.start=b.pos;e();return d.chain(c).filter(function(a){return!!a.length()}).uniq(!1,
function(a){return a.toString()}).value()}var a={styleBefore:"\n\t",styleSeparator:": ",offset:0},g=1,e=2,j=f("editTree").EditContainer.extend({initialize:function(c){d.defaults(this.options,a);var g=f("editTree"),e=f("tokenIterator").create(f("cssParser").parse(c)),j,r=[],q;for(j=e.position();q=e.next();){if(q.type=="{")break;r.push(q)}i(r);r.length?(j=r[0].start,r=d.last(r).end):r=j;j=h(j,r-j);this._positions.name=j.start;this._name=j.substring(c);if(!e.current()||e.current().type!="{")throw"Invalid CSS rule";
for(this._positions.contentStart=e.position()+1;j=e.next();){if(r=j.type=="identifier")a:{r=e.tokens;q=e._i+1;for(var u=r.length;q<u;q++){if(r[q].type==":"){r=!0;break a}if(r[q].type=="identifier"||r[q].type=="line"){r=!1;break a}}r=!1}r&&(j=h(j),r=b(e),q=e.current()&&e.current().type==";"?h(e.current()):h(r.end,0),this._children.push(new n(this,g.createToken(j.start,j.substring(c)),g.createToken(r.start,r.substring(c)),g.createToken(q.start,q.substring(c)))))}this._saveStyle()},_saveStyle:function(){var a=
this._positions.contentStart,b=this.source,c=f("utils");d.each(this.list(),function(g){g.styleBefore=b.substring(a,g.namePosition());var e=c.splitByLines(g.styleBefore);if(e.length>1)g.styleBefore="\n"+d.last(e);g.styleSeparator=b.substring(g.nameRange().end,g.valuePosition());g.styleBefore=d.last(g.styleBefore.split("*/"));g.styleSeparator=g.styleSeparator.replace(/\/\*.*?\*\//g,"");a=g.range().end})},add:function(a,b,c){var g=this.list(),e=this._positions.contentStart,j=d.pick(this.options,"styleBefore",
"styleSeparator"),h=f("editTree");if(d.isUndefined(c))c=g.length;var i=g[c];if(i)e=i.fullRange().start;else if(i=g[c-1])i.end(";"),e=i.range().end;i&&(j=d.pick(i,"styleBefore","styleSeparator"));a=h.createToken(e+j.styleBefore.length,a);b=h.createToken(a.end+j.styleSeparator.length,b);h=new n(this,a,b,h.createToken(b.end,";"));d.extend(h,j);this._updateSource(h.styleBefore+h.toString(),e);this._children.splice(c,0,h);return h}}),n=f("editTree").EditElement.extend({initialize:function(a,b,c,g){this.styleBefore=
a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;this._end=g.value;this._positions.end=g.start},valueParts:function(a){var b=c(this.value());if(a){var g=this.valuePosition(!0);d.each(b,function(a){a.shift(g)})}return b},end:function(a){if(!d.isUndefined(a)&&this._end!==a)this.parent._updateSource(a,this._positions.end,this._positions.end+this._end.length),this._end=a;return this._end},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+
this.styleSeparator+this.value()+this.end()}});return{parse:function(a,b){return new j(a,b)},parseFromPosition:function(a,b,c){c=this.extractRule(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractRule:function(a,b,c){for(var g="",d=a.length,e=-1,j;b>=0;){j=a.charAt(b);if(j=="{"){e=b;break}else if(j=="}"&&!c){b++;break}b--}for(;b<d;){j=a.charAt(b);if(j=="{")e=b;else if(j=="}"){e!=-1&&(g=a.substring(e,b+1));break}b++}if(g){b=e-1;for(c="";b>=0;){j=a.charAt(b);if("{}/\\<>\n\r".indexOf(j)!=
-1)break;b--}c=a.substring(b+1,e).replace(/^[\s\n\r]+/m,"");return f("range").create(e-c.length,g.length+c.length)}return null},baseName:function(a){return a.replace(/^\s*\-\w+\-/,"")},findParts:c}});
emmet.define("xmlEditTree",function(f,d){var h={styleBefore:" ",styleSeparator:"=",styleQuote:'"',offset:0},i=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/m,b=f("editTree").EditContainer.extend({initialize:function(a){d.defaults(this.options,h);this._positions.name=1;var b=null,e=f("xmlParser").parse(a),j=f("range");d.each(e,function(e){e.value=j.create(e).substring(a);switch(e.type){case "tag":if(/^<[^\/]+/.test(e.value))this._name=e.value.substring(1);
break;case "attribute":b&&this._children.push(new c(this,b));b=e;break;case "string":this._children.push(new c(this,b,e)),b=null}},this);b&&this._children.push(new c(this,b));this._saveStyle()},_saveStyle:function(){var a=this.nameRange().end,b=this.source;d.each(this.list(),function(c){c.styleBefore=b.substring(a,c.namePosition());if(c.valuePosition()!==-1)c.styleSeparator=b.substring(c.namePosition()+c.name().length,c.valuePosition()-c.styleQuote.length);a=c.range().end})},add:function(a,b,e){var j=
this.list(),h=this.nameRange().end,i=f("editTree"),l=d.pick(this.options,"styleBefore","styleSeparator","styleQuote");if(d.isUndefined(e))e=j.length;var m=j[e];if(m)h=m.fullRange().start;else if(m=j[e-1])h=m.range().end;m&&(l=d.pick(m,"styleBefore","styleSeparator","styleQuote"));b=l.styleQuote+b+l.styleQuote;a=new c(this,i.createToken(h+l.styleBefore.length,a),i.createToken(h+l.styleBefore.length+a.length+l.styleSeparator.length,b));d.extend(a,l);this._updateSource(a.styleBefore+a.toString(),h);
this._children.splice(e,0,a);return a}}),c=f("editTree").EditElement.extend({initialize:function(a,b,c){this.styleBefore=a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;b="";a=a.options.styleQuote;if(c)b=c.value,a=b.charAt(0),a=='"'||a=="'"?b=b.substring(1):a="",a&&b.charAt(b.length-1)==a&&(b=b.substring(0,b.length-1));this.styleQuote=a;this._value=b;this._positions.value=c?c.start+a.length:-1},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+
this.styleSeparator+this.styleQuote+this.value()+this.styleQuote}});return{parse:function(a,c){return new b(a,c)},parseFromPosition:function(a,b,c){c=this.extractTag(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractTag:function(a,b,c){var d=a.length,h,o=f("range"),l=Math.min(2E3,d),m=null,p=function(b){var c;if(a.charAt(b)=="<"&&(c=a.substr(b,l).match(i)))return o.create(b,c[0])};for(h=b;h>=0;h--)if(m=p(h))break;if(m&&(m.inside(b)||c))return m;if(!m&&c)return null;
for(h=b;h<d;h++)if(m=p(h))return m}}});
emmet.define("expandAbbreviation",function(f,d){var h=f("handlerList").create(),i=null,b=f("actions");b.add("expand_abbreviation",function(b,a,g){var e=d.toArray(arguments),j=f("editorUtils").outputInfo(b,a,g);e[1]=j.syntax;e[2]=j.profile;return h.exec(!1,e)});b.add("expand_abbreviation_with_tab",function(c,a,d){var e=c.getSelection(),j=f("resources").getVariable("indentation");if(e)return d=f("utils"),a=f("range").create(c.getSelectionRange()),e=d.padString(e,j),c.replaceContent(j+"${0}",c.getCaretPos()),
j=f("range").create(c.getCaretPos(),a.length()),c.replaceContent(e,j.start,j.end,!0),c.createSelection(j.start,j.start+e.length),!0;b.run("expand_abbreviation",c,a,d)||c.replaceContent(j,c.getCaretPos());return!0},{hidden:!0});h.add(function(b,a,d){var e=b.getSelectionRange().end,j=i.findAbbreviation(b);return j&&(a=emmet.expandAbbreviation(j,a,d,f("actionUtils").captureContext(b)))?(b.replaceContent(a,e-j.length,e),!0):!1},{order:-1});return i={addHandler:function(b,a){h.add(b,a)},removeHandler:function(b){h.remove(b,
options)},findAbbreviation:function(b){var a=f("range").create(b.getSelectionRange()),d=String(b.getContent());if(a.length())return a.substring(d);b=b.getCurrentLineRange();return f("actionUtils").extractAbbreviation(d.substring(b.start,a.start))}}});
emmet.define("wrapWithAbbreviation",function(f){var d=null;f("actions").add("wrap_with_abbreviation",function(h,i,b,c){var b=f("editorUtils").outputInfo(h,b,c),a=f("utils"),c=f("editorUtils"),i=i||h.prompt("Enter abbreviation");if(!i)return null;var i=String(i),g=f("range").create(h.getSelectionRange());if(!g.length()){g=f("htmlMatcher").tag(b.content,g.start);if(!g)return!1;g=a.narrowToNonSpace(b.content,g.range)}a=a.escapeText(g.substring(b.content));return(i=d.wrap(i,c.unindent(h,a),b.syntax,b.profile,
f("actionUtils").captureContext(h)))?(h.replaceContent(i,g.start,g.end),!0):!1});return d={wrap:function(d,i,b,c,a){var g=f("filters"),e=f("utils"),b=b||emmet.defaultSyntax(),c=f("profile").get(c,b);f("tabStops").resetTabstopIndex();d=g.extractFromAbbreviation(d);return(i=f("abbreviationParser").parse(d[0],{syntax:b,pastedContent:i,contextNode:a}))?(b=g.composeList(b,c,d[1]),g.apply(i,b,c),e.replaceVariables(i.toString())):null}}});
emmet.exec(function(f,d){function h(b,a){var g=a-(b.options.offset||0),e=/^[\s\n\r]/;return d.find(b.list(),function(a){return a.range().end===g?e.test(b.source.charAt(g)):a.range().inside(g)})}function i(b,a,d,e){for(var j=-1,h=-1;a--;)if(b.substr(a,d.length)==d){j=a;break}if(j!=-1){a=j;for(d=b.length;d>=a++;)if(b.substr(a,e.length)==e){h=a+e.length;break}}return j!=-1&&h!=-1?f("range").create(j,h-j):null}function b(b,a,d,e){function j(b){return b.replace(RegExp("^"+p.escapeForRegexp(a)+"\\s*"),
function(a){l-=a.length;return""}).replace(RegExp("\\s*"+p.escapeForRegexp(d)+"$"),"")}var h=f("editorUtils"),o=h.outputInfo(b).content,l=b.getCaretPos(),m=null,p=f("utils");(m=i(o,l,a,d))&&m.overlap(e)?(e=m,m=j(e.substring(o))):(m=a+" "+e.substring(o).replace(RegExp(p.escapeForRegexp(a)+"\\s*|\\s*"+p.escapeForRegexp(d),"g"),"")+" "+d,l+=a.length+1);return m!==null?(m=p.escapeText(m),b.setCaretPos(e.start),b.replaceContent(h.unindent(b,m),e.start,e.end),b.setCaretPos(l),!0):!1}f("actions").add("toggle_comment",
function(c){var a=f("editorUtils").outputInfo(c);if(a.syntax=="css"){var d=c.getCaretPos(),e=f("htmlMatcher").tag(a.content,d);if(e&&e.open.range.inside(d))a.syntax="html"}if(a.syntax=="css"){e=f("range").create(c.getSelectionRange());a=f("editorUtils").outputInfo(c);if(!e.length()&&(d=f("cssEditTree").parseFromPosition(a.content,c.getCaretPos())))e=(e=h(d,c.getCaretPos()))?e.range(!0):f("range").create(d.nameRange(!0).start,d.source);e.length()||(e=f("range").create(c.getCurrentLineRange()),f("utils").narrowToNonSpace(a.content,
e));c=b(c,"/*","*/",e)}else{a=f("range").create(c.getSelectionRange());d=f("editorUtils").outputInfo(c);if(!a.length()&&(d=f("htmlMatcher").tag(d.content,c.getCaretPos())))a=d.outerRange;c=b(c,"<\!--","--\>",a)}return c})});
emmet.exec(function(f){function d(d,f,b){function c(b){for(var c=b;c>=0;){var d=a.charAt(c);if(d=="\n"||d=="\r")break;c--}return a.substring(c,b)}for(var f=f||1,b=d.getCaretPos()+(b||0),a=String(d.getContent()),d=a.length,g=-1,e=/^\s+$/;b<=d&&b>=0;){b+=f;var j=a.charAt(b),n=a.charAt(b+1),o=a.charAt(b-1);switch(j){case '"':case "'":n==j&&o=="="&&(g=b+1);break;case ">":n=="<"&&(g=b+1);break;case "\n":case "\r":e.test(c(b-1))&&(g=b)}if(g!=-1)break}return g}f=f("actions");f.add("prev_edit_point",function(f){var i=
f.getCaretPos(),b=d(f,-1);b==i&&(b=d(f,-1,-2));return b!=-1?(f.setCaretPos(b),!0):!1},{label:"Previous Edit Point"});f.add("next_edit_point",function(f){var i=d(f,1);return i!=-1?(f.setCaretPos(i),!0):!1})});
emmet.exec(function(f,d){function h(a,b,c,d){var e=f("range"),g=f("editorUtils").outputInfo(a).content,j=g.length,h,i=e.create(-1,0),m=e.create(a.getSelectionRange());h=m.start;for(var n=1E5;h>=0&&h<j&&--n>0;){if(e=c(g,h,b)){if(i.equal(e))break;i=e.clone();if(h=d(e.substring(g),e.start,m.clone()))return a.createSelection(h.start,h.end),!0;else h=b?e.start:e.end-1}h+=b?-1:1}return!1}function i(a){var b=!0;return h(a,!1,function(a,c){if(b){b=!1;var d;a:{d=c;for(var g;d>=0;){if(g=e(a,d)){d=g;break a}d--}d=
null}return d}else return e(a,c)},function(a,b,c){return g(a,b,c,!1)})}function b(a){return h(a,!0,e,function(a,b,c){return g(a,b,c,!0)})}function c(b,c,e){var e=e||0,g=f("range"),h=[],k=-1,i="",m="",n,l;d.each(c,function(c){switch(c.type){case "tag":l=b.substring(c.start,c.end);/^<[\w\:\-]/.test(l)&&h.push(g.create({start:c.start+1,end:c.end}));break;case "attribute":k=c.start;i=b.substring(c.start,c.end);break;case "string":h.push(g.create(k,c.end-k)),n=g.create(c),m=n.substring(b),j(m.charAt(0))&&
n.start++,j(m.charAt(m.length-1))&&n.end--,h.push(n),i=="class"&&(h=h.concat(a(n.substring(b),n.start)))}});d.each(h,function(a){a.shift(e)});return d.chain(h).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}function a(a,b){var b=b||0,c=[],d=f("stringStream").create(a),e=f("range");d.eatSpace();d.start=d.pos;for(var g;g=d.next();)if(/[\s\u00a0]/.test(g))c.push(e.create(d.start+b,d.pos-d.start-1)),d.eatSpace(),d.start=d.pos;c.push(e.create(d.start+b,d.pos-
d.start));return c}function g(a,b,e,g){a=c(a,f("xmlParser").parse(a),b);g&&a.reverse();return(b=d.find(a,function(a){return a.equal(e)}))?(g=d.indexOf(a,b),g<a.length-1?a[g+1]:null):g?d.find(a,function(a){return a.start<e.start}):!b&&(g=d.filter(a,function(a){return a.inside(e.end)}),g.length>1)?g[1]:d.find(a,function(a){return a.end>e.end})}function e(a,b){var c;if(a.charAt(b)=="<"&&(c=a.substring(b,a.length).match(p)))return f("range").create(b,c[0])}function j(a){return a=='"'||a=="'"}function n(a){var b=
a.valueRange(!0),c=[a.range(!0),b],e=f("stringStream"),g=f("cssEditTree"),k=f("range"),j=a.value();d.each(a.valueParts(),function(a){var f=a.clone();c.push(f.shift(b.start));var h=e.create(a.substring(j));if(h.match(/^[\w\-]+\(/,!0)){h.start=h.pos;h.skipToPair("(",")");var i=h.current();c.push(k.create(f.start+h.start,i));d.each(g.findParts(i),function(a){c.push(k.create(f.start+h.start+a.start,a.substring(i)))})}});return d.chain(c).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}
function o(a,b,c){var e=null,g=null,f=a.list(),j,h;c?(f.reverse(),j=function(a){return a.range(!0).start<=b.start},h=function(a){return a.start<b.start}):(j=function(a){return a.range(!0).end>=b.end},h=function(a){return a.end>b.start});for(;e=d.find(f,j);){a=n(e);c&&a.reverse();if(g=d.find(a,function(a){return a.equal(b)})){if(g=d.indexOf(a,g),g!=a.length-1){g=a[g+1];break}}else{g=d.filter(a,function(a){return a.inside(b.end)});if(g.length>1){g=g[1];break}if(g=d.find(a,h))break}g=null;b.start=b.end=
c?e.range(!0).start-1:e.range(!0).end+1}return g}function l(a,b,c){a=f("cssEditTree").parse(a,{offset:b});b=a.nameRange(!0);return c.end<b.end?b:o(a,c,!1)}function m(a,b,c){b=f("cssEditTree").parse(a,{offset:b});a=o(b,c,!0);return!a&&(b=b.nameRange(!0),c.start>b.start)?b:a}var p=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,r=f("actions");r.add("select_next_item",function(a){return a.getSyntax()=="css"?h(a,!1,f("cssEditTree").extractRule,l):i(a)});r.add("select_previous_item",
function(a){return a.getSyntax()=="css"?h(a,!0,f("cssEditTree").extractRule,m):b(a)})});
emmet.exec(function(f){function d(c,a){var a=String((a||"out").toLowerCase()),d=f("editorUtils").outputInfo(c),e=f("range").create(c.getSelectionRange()),d=d.content;b&&!b.range.equal(e)&&(b=null);if(b&&e.length())if(a=="in")if(b.type=="tag"&&!b.close)return!1;else if(b.range.equal(b.outerRange))b.range=b.innerRange;else{var j=f("utils").narrowToNonSpace(d,b.innerRange);if((b=i.find(d,j.start+1))&&b.range.equal(e)&&b.outerRange.equal(e))b.range=b.innerRange}else if(!b.innerRange.equal(b.outerRange)&&
b.range.equal(b.innerRange)&&e.equal(b.range))b.range=b.outerRange;else{if((b=i.find(d,e.start))&&b.range.equal(e)&&b.innerRange.equal(e))b.range=b.outerRange}else b=i.find(d,e.start);if(b&&!b.range.equal(e))return c.createSelection(b.range.start,b.range.end),!0;b=null;return!1}var h=f("actions"),i=f("htmlMatcher"),b=null;h.add("match_pair",d,{hidden:!0});h.add("match_pair_inward",function(b){return d(b,"in")},{label:"HTML/Match Pair Tag (inward)"});h.add("match_pair_outward",function(b){return d(b,
"out")},{label:"HTML/Match Pair Tag (outward)"});h.add("matching_pair",function(b){var a=String(b.getContent()),d=b.getCaretPos();a.charAt(d)=="<"&&d++;return(a=i.tag(a,d))&&a.close?(a.open.range.inside(d)?b.setCaretPos(a.close.range.start):b.setCaretPos(a.open.range.start),!0):!1},{label:"HTML/Go To Matching Tag Pair"})});
emmet.exec(function(f){f("actions").add("remove_tag",function(d){var h=f("utils"),i=f("editorUtils").outputInfo(d),b=f("htmlMatcher").tag(i.content,d.getCaretPos());if(b){if(b.close){var c=h.narrowToNonSpace(i.content,b.innerRange),a=h.findNewlineBounds(i.content,c.start),a=h.getLinePadding(a.substring(i.content)),i=c.substring(i.content),i=h.unindentString(i,a);d.replaceContent(h.getCaretPlaceholder()+h.escapeText(i),b.outerRange.start,b.outerRange.end)}else d.replaceContent(h.getCaretPlaceholder(),
b.range.start,b.range.end);return!0}return!1},{label:"HTML/Remove Tag"})});
emmet.exec(function(f){f("actions").add("split_join_tag",function(d,h){var i=f("htmlMatcher"),b=f("editorUtils").outputInfo(d,null,h),c=f("profile").get(b.profile);if(i=i.tag(b.content,d.getCaretPos())){if(i.close){var b=f("utils"),c=c.selfClosing()||" /",c=i.open.range.substring(i.source).replace(/\s*>$/,c+">"),a=d.getCaretPos();c.length+i.outerRange.start<a&&(a=c.length+i.outerRange.start);c=b.escapeText(c);d.replaceContent(c,i.outerRange.start,i.outerRange.end)}else{var b=f("utils"),g=b.getNewline(),
e=f("resources").getVariable("indentation"),a=d.getCaretPos(),c=c.tag_nl===!0?g+e+g:"",g=i.outerContent().replace(/\s*\/>$/,">"),a=i.outerRange.start+g.length;g+=c+"</"+i.open.name+">";g=b.escapeText(g);d.replaceContent(g,i.outerRange.start,i.outerRange.end)}d.setCaretPos(a);i=!0}else i=!1;return i},{label:"HTML/Split\\Join Tag Declaration"})});
emmet.define("reflectCSSValue",function(f,d){function h(c){var a=f("cssEditTree"),d=f("editorUtils").outputInfo(c),c=c.getCaretPos();if(a=a.parseFromPosition(d.content,c))if(d=a.itemFromPosition(c,!0)){var e=a.source,j=a.options.offset,c=c-j-d.range().start;b.exec(!1,[d]);if(e!==a.source)return{data:a.source,start:j,end:j+e.length,caret:j+d.range().start+c}}}function i(b){var b=f("cssEditTree").baseName(b),a;if(b=="opacity"||b=="filter")return/^(?:\-\w+\-)?(?:opacity|filter)$/;else if(a=b.match(/^border-radius-(top|bottom)(left|right)/))return RegExp("^(?:\\-\\w+\\-)?(?:"+
b+"|border-"+a[1]+"-"+a[2]+"-radius)$");else if(a=b.match(/^border-(top|bottom)-(left|right)-radius/))return RegExp("^(?:\\-\\w+\\-)?(?:"+b+"|border-radius-"+a[1]+a[2]+")$");return RegExp("^(?:\\-\\w+\\-)?"+b+"$")}var b=f("handlerList").create();f("actions").add("reflect_css_value",function(b){return b.getSyntax()!="css"?!1:f("actionUtils").compoundUpdate(b,h(b))},{label:"CSS/Reflect Value"});b.add(function(b){var a=i(b.name());d.each(b.parent.list(),function(d){if(a.test(d.name())){var e;var j=b.name(),
h=b.value(),i=d.name();e=d.value();var l=f("cssEditTree"),m=f("utils"),j=l.baseName(j),i=l.baseName(i);e=j=="opacity"&&i=="filter"?e.replace(/opacity=[^)]*/i,"opacity="+Math.floor(parseFloat(h)*100)):j=="filter"&&i=="opacity"?(j=h.match(/opacity=([^)]*)/i))?m.prettifyNumber(parseInt(j[1])/100):e:h;d.value(e)}})},{order:-1});return{addHandler:function(c,a){b.add(c,a)},removeHandler:function(c){b.remove(c,options)}}});
emmet.exec(function(f){f("actions").add("evaluate_math_expression",function(d){var h=f("actionUtils"),i=f("utils"),b=String(d.getContent()),c=f("range").create(d.getSelectionRange());c.length()||(c=h.findExpressionBounds(d,function(a){return i.isNumeric(a)||".+-*/\\".indexOf(a)!=-1}));if(c&&c.length()){h=c.substring(b);h=h.replace(/([\d\.\-]+)\\([\d\.\-]+)/g,"Math.round($1/$2)");try{var a=i.prettifyNumber((new Function("return "+h))());d.replaceContent(a,c.start,c.end);d.setCaretPos(c.start+a.length);
return!0}catch(g){}}return!1},{label:"Numbers/Evaluate Math Expression"})});
emmet.exec(function(f,d){function h(b,a){var g=f("utils"),e=!1,j=!1,h=f("actionUtils").findExpressionBounds(b,function(a,b,c){return g.isNumeric(a)?!0:a=="."?!g.isNumeric(c.charAt(b+1))?!1:j?!1:j=!0:a=="-"?e?!1:e=!0:!1});if(h&&h.length()){var o=h.substring(String(b.getContent())),l=parseFloat(o);if(!d.isNaN(l)){l=g.prettifyNumber(l+a);if(/^(\-?)0+[1-9]/.test(o)){var m="";RegExp.$1&&(m="-",l=l.substring(1));l=l.split(".");l[0]=g.zeroPadString(l[0],i(o));l=m+l.join(".")}b.replaceContent(l,h.start,h.end);
b.createSelection(h.start,h.start+l.length);return!0}}return!1}function i(b){b=b.replace(/^\-/,"");return~b.indexOf(".")?b.split(".")[0].length:b.length}var b=f("actions");d.each([1,-1,10,-10,0.1,-0.1],function(c){var a=c>0?"increment":"decrement";b.add(a+"_number_by_"+String(Math.abs(c)).replace(".","").substring(0,2),function(a){return h(a,c)},{label:"Numbers/"+a.charAt(0).toUpperCase()+a.substring(1)+" number by "+Math.abs(c)})})});
emmet.exec(function(f,d){var h=f("actions"),i=f("preferences");i.define("css.closeBraceIndentation","\n","Indentation before closing brace of CSS rule. Some users prefere indented closing brace of CSS rule for better readability. This preference\u2019s value will be automatically inserted before closing brace when user adds newline in newly created CSS rule (e.g. when \u201cInsert formatted linebreak\u201d action will be performed in CSS file). If you\u2019re such user, you may want to write put a value like <code>\\n\\t</code> in this preference.");
h.add("insert_formatted_line_break_only",function(b){var c=f("utils"),a=f("resources"),g=f("editorUtils").outputInfo(b),e=b.getCaretPos(),j=c.getNewline();if(d.include(["html","xml","xsl"],g.syntax)){if(a=a.getVariable("indentation"),(g=f("htmlMatcher").tag(g.content,e))&&!g.innerRange.length())return b.replaceContent(j+a+c.getCaretPlaceholder()+j,e),!0}else if(g.syntax=="css"&&(g=g.content,e&&g.charAt(e-1)=="{")){var h=i.get("css.closeBraceIndentation"),a=a.getVariable("indentation"),o=g.charAt(e)==
"}";if(!o)for(var l=e,m=g.length,p;l<m;l++){p=g.charAt(l);if(p=="{")break;if(p=="}"){h="";o=!0;break}}o||(h+="}");c=j+a+c.getCaretPlaceholder()+h;b.replaceContent(c,e);return!0}return!1},{hidden:!0});h.add("insert_formatted_line_break",function(b){if(!h.run("insert_formatted_line_break_only",b)){for(var c=f("utils"),a=f("editorUtils").getCurrentLinePadding(b),d=String(b.getContent()),e=b.getCaretPos(),j=d.length,c=c.getNewline(),i="",o=b.getCurrentLineRange().end+1,l;o<j;o++)if(l=d.charAt(o),l==" "||
l=="\t")i+=l;else break;i.length>a.length?b.replaceContent(c+i,e,e,!0):b.replaceContent(c,e)}return!0},{hidden:!0})});
emmet.exec(function(f){f("actions").add("merge_lines",function(d){var h=f("htmlMatcher"),i=f("utils"),b=f("editorUtils").outputInfo(d),c=f("range").create(d.getSelectionRange());if(!c.length()&&(h=h.find(b.content,d.getCaretPos())))c=h.outerRange;if(c.length()){b=c.substring(b.content);b=i.splitByLines(b);for(h=1;h<b.length;h++)b[h]=b[h].replace(/^\s+/,"");b=b.join("").replace(/\s{2,}/," ");h=b.length;b=i.escapeText(b);d.replaceContent(b,c.start,c.end);d.createSelection(c.start,c.start+h);return!0}return!1})});
emmet.exec(function(f){function d(d,b,c){c=c||0;return b.charAt(c)==d.charAt(0)&&b.substr(c,d.length)==d}function h(d,b,c){var a=f("file"),g=f("actionUtils"),e=d.getFilePath();if(e===null)throw"You should save your file before using this action";var h=a.locateFile(e,b);if(h===null)throw"Can't find "+b+" file";a.read(h,function(e,o){if(e)throw"Unable to read "+h+": "+e;var l=f("base64").encode(String(o));if(!l)throw"Can't encode file content to base64";l="data:"+(g.mimeTypes[String(a.getExt(h))]||
"application/octet-stream")+";base64,"+l;d.replaceContent("$0"+l,c,c+b.length)});return!0}f("actions").add("encode_decode_data_url",function(i){var b=String(i.getSelection()),c=i.getCaretPos();if(!b)for(var a=String(i.getContent());c-- >=0;)if(d("src=",a,c)){if(a=a.substr(c).match(/^(src=(["'])?)([^'"<>\s]+)\1?/))b=a[3],c+=a[1].length;break}else if(d("url(",a,c)){if(a=a.substr(c).match(/^(url\((['"])?)([^'"\)\s]+)\1?/))b=a[3],c+=a[1].length;break}if(b)if(d("data:",b))if(a=String(i.prompt("Enter path to file (absolute or relative)"))){var g=
f("file"),e=g.createPath(i.getFilePath(),a);if(!e)throw"Can't save file";g.save(e,f("base64").decode(b.replace(/^data\:.+?;.+?,/,"")));i.replaceContent("$0"+a,c,c+b.length);i=!0}else i=!1;else i=h(i,b,c);else i=!1;return i},{label:"Encode\\Decode data:URL image"})});
emmet.exec(function(f,d){function h(c){var a=c.getCaretPos(),g=f("editorUtils").outputInfo(c),e=f("xmlEditTree").parseFromPosition(g.content,a,!0);e&&(e.name()||"").toLowerCase()=="img"&&b(c,e.value("src"),function(b){if(b){var g=e.range(!0);e.value("width",b.width);e.value("height",b.height,e.indexOf("width")+1);f("actionUtils").compoundUpdate(c,d.extend(g,{data:e.toString(),caret:a}))}})}function i(c){var a=c.getCaretPos(),g=f("editorUtils").outputInfo(c),e=f("cssEditTree").parseFromPosition(g.content,
a,!0);if(e){var g=e.itemFromPosition(a,!0),h;g&&(h=/url\((["']?)(.+?)\1\)/i.exec(g.value()||""))&&b(c,h[2],function(b){if(b){var g=e.range(!0);e.value("width",b.width+"px");e.value("height",b.height+"px",e.indexOf("width")+1);f("actionUtils").compoundUpdate(c,d.extend(g,{data:e.toString(),caret:a}))}})}}function b(b,a,d){var e=f("actionUtils");if(a){if(/^data:/.test(a))return b=f("base64").decode(a.replace(/^data\:.+?;.+?,/,"")),d(e.getImageSize(b));var h=f("file"),i=h.locateFile(b.getFilePath(),
a);if(i===null)throw"Can't find "+a+" file";h.read(i,function(a,b){if(a)throw"Unable to read "+i+": "+a;d(e.getImageSize(String(b)))})}}f("actions").add("update_image_size",function(b){d.include(["css","less","scss"],String(b.getSyntax()))?i(b):h(b);return!0})});
emmet.define("cssResolver",function(f,d){function h(a){var b=a&&a.charCodeAt(0);return a&&a=="."||b>47&&b<58}function i(a){a=f("utils").trim(a);if(~a.indexOf("/*")||/[\n\r]/.test(a))return!1;if(!/^[a-z0-9\-]+\s*\:/i.test(a))return!1;a=f("tabStops").processText(a,{replaceCarets:!0,tabstop:function(){return"value"}});return a.split(":").length==2}function b(a){a.charAt(0)=="-"&&!/^\-[\.\d]/.test(a)&&(a=a.replace(/^\-+/,""));if(a.charAt(0)=="#"){var b=a.replace(/^#+/,"")||"0";if(b.toLowerCase()=="t")a=
"transparent";else{var d=f("utils").repeatString,a=null;switch(b.length){case 1:a=d(b,6);break;case 2:a=d(b,3);break;case 3:a=b.charAt(0)+b.charAt(0)+b.charAt(1)+b.charAt(1)+b.charAt(2)+b.charAt(2);break;case 4:a=b+b.substr(0,2);break;case 5:a=b+b.charAt(0);break;default:a=b.substr(0,6)}q.get("css.color.short")&&(b=a.split(""),b[0]==b[1]&&b[2]==b[3]&&b[4]==b[5]&&(a=b[0]+b[2]+b[4]));switch(q.get("css.color.case")){case "upper":a=a.toUpperCase();break;case "lower":a=a.toLowerCase()}a="#"+a}}else a=
c(a);return a}function c(a){var b=q.getDict("css.keywordAliases");return a in b?b[a]:a}function a(a){return d.include(q.getArray("css.keywords"),c(a))}function g(a,b){var c=r[b];c||(c=d.find(r,function(a){return a.prefix==b}));return c&&c.supports(a)}function e(a,b){var c=[];d.each(r,function(b,d){g(a,d)&&c.push(d)});!c.length&&!b&&d.each(r,function(a,b){a.obsolete||c.push(b)});return c}function j(a,b){d.isString(b)&&(b={prefix:b});r[a]=d.extend({},p,b)}function n(a,b){if(b){var c=q.get(b+"."+a);
if(!d.isUndefined(c))return c}return q.get("css."+a)}function o(a,b,c){if(!d.isString(a))a=a.data;if(!i(a))return a;b&&(~a.indexOf(";")?a=a.split(";").join(" !important;"):a+=" !important");b=a.indexOf(":");a=a.substring(0,b).replace(/\s+$/,"")+n("valueSeparator",c)+f("utils").trim(a.substring(b+1));return a.replace(/\s*;\s*$/,n("propertyEnd",c))}function l(a){var b=q.getArray(a);d.each(q.getArray(a+"Addon"),function(a){a.charAt(0)=="-"?b=d.without(b,a.substr(1)):(a.charAt(0)=="+"&&(a=a.substr(1)),
b.push(a))});return b}var m=null,p={prefix:"emmet",obsolete:!1,transformName:function(a){return"-"+this.prefix+"-"+a},properties:function(){return l("css."+this.prefix+"Properties")||[]},supports:function(a){return d.include(this.properties(),a)}},r={},q=f("preferences");q.define("css.valueSeparator",": ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations.");q.define("css.propertyEnd",";","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations.");
q.define("stylus.valueSeparator"," ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations in Stylus dialect.");q.define("stylus.propertyEnd","","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations in Stylus dialect.");q.define("sass.propertyEnd","","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations in SASS dialect.");q.define("css.autoInsertVendorPrefixes",
!0,"Automatically generate vendor-prefixed copies of expanded CSS property. By default, Emmet will generate vendor-prefixed properties only when you put dash before abbreviation (e.g. <code>-bxsh</code>). With this option enabled, you don\u2019t need dashes before abbreviations: Emmet will produce vendor-prefixed properties for you.");var u=d.template("A comma-separated list of CSS properties that may have <code><%= vendor %></code> vendor prefix. This list is used to generate a list of prefixed properties when expanding <code>-property</code> abbreviations. Empty list means that all possible CSS values may have <code><%= vendor %></code> prefix."),
s=d.template("A comma-separated list of <em>additional</em> CSS properties for <code>css.<%= vendor %>Preperties</code> preference. You should use this list if you want to add or remove a few CSS properties to original set. To add a new property, simply write its name, to remove it, precede property with hyphen.<br>For example, to add <em>foo</em> property and remove <em>border-radius</em> one, the preference value will look like this: <code>foo, -border-radius</code>.");d.each({webkit:"animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-clip, background-composite, background-origin, background-size, border-fit, border-horizontal-spacing, border-image, border-vertical-spacing, box-align, box-direction, box-flex, box-flex-group, box-lines, box-ordinal-group, box-orient, box-pack, box-reflect, box-shadow, color-correction, column-break-after, column-break-before, column-break-inside, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-span, column-width, dashboard-region, font-smoothing, highlight, hyphenate-character, hyphenate-limit-after, hyphenate-limit-before, hyphens, line-box-contain, line-break, line-clamp, locale, margin-before-collapse, margin-after-collapse, marquee-direction, marquee-increment, marquee-repetition, marquee-style, mask-attachment, mask-box-image, mask-box-image-outset, mask-box-image-repeat, mask-box-image-slice, mask-box-image-source, mask-box-image-width, mask-clip, mask-composite, mask-image, mask-origin, mask-position, mask-repeat, mask-size, nbsp-mode, perspective, perspective-origin, rtl-ordering, text-combine, text-decorations-in-effect, text-emphasis-color, text-emphasis-position, text-emphasis-style, text-fill-color, text-orientation, text-security, text-stroke-color, text-stroke-width, transform, transition, transform-origin, transform-style, transition-delay, transition-duration, transition-property, transition-timing-function, user-drag, user-modify, user-select, writing-mode, svg-shadow, box-sizing, border-radius",
moz:"animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-inline-policy, binding, border-bottom-colors, border-image, border-left-colors, border-right-colors, border-top-colors, box-align, box-direction, box-flex, box-ordinal-group, box-orient, box-pack, box-shadow, box-sizing, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-width, float-edge, font-feature-settings, font-language-override, force-broken-image-icon, hyphens, image-region, orient, outline-radius-bottomleft, outline-radius-bottomright, outline-radius-topleft, outline-radius-topright, perspective, perspective-origin, stack-sizing, tab-size, text-blink, text-decoration-color, text-decoration-line, text-decoration-style, text-size-adjust, transform, transform-origin, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-focus, user-input, user-modify, user-select, window-shadow, background-clip, border-radius",
ms:"accelerator, backface-visibility, background-position-x, background-position-y, behavior, block-progression, box-align, box-direction, box-flex, box-line-progression, box-lines, box-ordinal-group, box-orient, box-pack, content-zoom-boundary, content-zoom-boundary-max, content-zoom-boundary-min, content-zoom-chaining, content-zoom-snap, content-zoom-snap-points, content-zoom-snap-type, content-zooming, filter, flow-from, flow-into, font-feature-settings, grid-column, grid-column-align, grid-column-span, grid-columns, grid-layer, grid-row, grid-row-align, grid-row-span, grid-rows, high-contrast-adjust, hyphenate-limit-chars, hyphenate-limit-lines, hyphenate-limit-zone, hyphens, ime-mode, interpolation-mode, layout-flow, layout-grid, layout-grid-char, layout-grid-line, layout-grid-mode, layout-grid-type, line-break, overflow-style, perspective, perspective-origin, perspective-origin-x, perspective-origin-y, scroll-boundary, scroll-boundary-bottom, scroll-boundary-left, scroll-boundary-right, scroll-boundary-top, scroll-chaining, scroll-rails, scroll-snap-points-x, scroll-snap-points-y, scroll-snap-type, scroll-snap-x, scroll-snap-y, scrollbar-arrow-color, scrollbar-base-color, scrollbar-darkshadow-color, scrollbar-face-color, scrollbar-highlight-color, scrollbar-shadow-color, scrollbar-track-color, text-align-last, text-autospace, text-justify, text-kashida-space, text-overflow, text-size-adjust, text-underline-position, touch-action, transform, transform-origin, transform-origin-x, transform-origin-y, transform-origin-z, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-select, word-break, word-wrap, wrap-flow, wrap-margin, wrap-through, writing-mode",
o:"dashboard-region, animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, border-image, link, link-source, object-fit, object-position, tab-size, table-baseline, transform, transform-origin, transition, transition-delay, transition-duration, transition-property, transition-timing-function, accesskey, input-format, input-required, marquee-dir, marquee-loop, marquee-speed, marquee-style"},
function(a,b){q.define("css."+b+"Properties",a,u({vendor:b}));q.define("css."+b+"PropertiesAddon","",s({vendor:b}))});q.define("css.unitlessProperties","z-index, line-height, opacity, font-weight, zoom","The list of properties whose values \u200b\u200bmust not contain units.");q.define("css.intUnit","px","Default unit for integer values");q.define("css.floatUnit","em","Default unit for float values");q.define("css.keywords","auto, inherit","A comma-separated list of valid keywords that can be used in CSS abbreviations.");
q.define("css.keywordAliases","a:auto, i:inherit, s:solid, da:dashed, do:dotted, t:transparent","A comma-separated list of keyword aliases, used in CSS abbreviation. Each alias should be defined as <code>alias:keyword_name</code>.");q.define("css.unitAliases","e:em, p:%, x:ex, r:rem","A comma-separated list of unit aliases, used in CSS abbreviation. Each alias should be defined as <code>alias:unit_value</code>.");q.define("css.color.short",!0,"Should color values like <code>#ffffff</code> be shortened to <code>#fff</code> after abbreviation with color was expanded.");
q.define("css.color.case","keep","Letter case of color values generated by abbreviations with color (like <code>c#0</code>). Possible values are <code>upper</code>, <code>lower</code> and <code>keep</code>.");q.define("css.fuzzySearch",!0,"Enable fuzzy search among CSS snippet names. When enabled, every <em>unknown</em> snippet will be scored against available snippet names (not values or CSS properties!). The match with best score will be used to resolve snippet value. For example, with this preference enabled, the following abbreviations are equal: <code>ov:h</code> == <code>ov-h</code> == <code>o-h</code> == <code>oh</code>");
q.define("css.fuzzySearchMinScore",0.3,"The minium score (from 0 to 1) that fuzzy-matched abbreviation should achive. Lower values may produce many false-positive matches, higher values may reduce possible matches.");q.define("css.alignVendor",!1,"If set to <code>true</code>, all generated vendor-prefixed properties will be aligned by real property name.");j("w",{prefix:"webkit"});j("m",{prefix:"moz"});j("s",{prefix:"ms"});j("o",{prefix:"o"});var v=["css","less","sass","scss","stylus"];f("resources").addResolver(function(a,
b){return d.include(v,b)&&a.isElement()?m.expandToSnippet(a.abbreviation,b):null});var w=f("expandAbbreviation");w.addHandler(function(a,b,c){if(!d.include(v,b))return!1;var e=a.getSelectionRange().end,g=w.findAbbreviation(a);return g&&(b=emmet.expandAbbreviation(g,b,c))?(g=e-g.length,c=e,a.getContent().charAt(e)==";"&&b.charAt(b.length-1)==";"&&c++,a.replaceContent(b,g,c),!0):!1});return m={addPrefix:j,supportsPrefix:g,prefixed:function(a,b){return g(a,b)?"-"+b+"-"+a:a},listPrefixes:function(){return d.map(r,
function(a){return a.prefix})},getPrefix:function(a){return r[a]},removePrefix:function(a){a in r&&delete r[a]},extractPrefixes:function(a){if(a.charAt(0)!="-")return{property:a,prefixes:null};for(var b=1,c=a.length,d,e=[];b<c;){d=a.charAt(b);if(d=="-"){b++;break}if(d in r)e.push(d);else{e.length=0;b=1;break}b++}if(b==c-1)b=1,e.length=1;return{property:a.substring(b),prefixes:e.length?e:"all"}},findValuesInAbbreviation:function(b,c){for(var c=c||"css",d=0,e=b.length,g="",j;d<e;){j=b.charAt(d);if(h(j)||
j=="#"||j=="-"&&h(b.charAt(d+1))){g=b.substring(d);break}d++}j=b.substring(0,b.length-g.length);d=f("resources");for(e=[];~j.indexOf("-")&&!d.findSnippet(c,j);){j=j.split("-");var i=j.pop();if(!a(i))break;e.unshift(i);j=j.join("-")}return e.join("-")+g},parseValues:function(c){for(var e=f("stringStream").create(c),g=[],j=null;j=e.next();){if(j=="#")e.match(/^t|[0-9a-f]+/i,!0);else if(j=="-"){if(a(d.last(g))||e.start&&h(c.charAt(e.start-1)))e.start=e.pos;e.match(/^\-?[0-9]*(\.[0-9]+)?[a-z%\.]*/,!0)}else e.match(/^[0-9]*(\.[0-9]*)?[a-z%]*/,
!0);g.push(e.current());e.start=e.pos}return d.map(d.compact(g),b)},extractValues:function(a){var b=this.findValuesInAbbreviation(a);return!b?{property:a,values:null}:{property:a.substring(0,a.length-b.length).replace(/-$/,""),values:this.parseValues(b)}},normalizeValue:function(a,b){var b=(b||"").toLowerCase(),c=q.getArray("css.unitlessProperties");return a.replace(/^(\-?[0-9\.]+)([a-z]*)$/,function(a,e,g){if(!g&&(e=="0"||d.include(c,b)))return e;g?(a=q.getDict("css.unitAliases"),e+=g in a?a[g]:
g):e=e.replace(/\.$/,"")+q.get(~e.indexOf(".")?"css.floatUnit":"css.intUnit");return e})},expand:function(a,b,c){var c=c||"css",g=f("resources"),h=q.get("css.autoInsertVendorPrefixes"),j;if(j=/^(.+)\!$/.test(a))a=RegExp.$1;var m=g.findSnippet(c,a);if(m&&!h)return o(m,j,c);var a=this.extractPrefixes(a),l=this.extractValues(a.property),a=d.extend(a,l);m?a.values=null:m=g.findSnippet(c,a.property);!m&&q.get("css.fuzzySearch")&&(m=g.fuzzyFindSnippet(c,a.property,parseFloat(q.get("css.fuzzySearchMinScore"))));
if(m){if(!d.isString(m))m=m.data}else m=a.property+":${1};";if(!i(m))return m;var n=this.splitSnippet(m),v=[];!b&&a.values&&(b=d.map(a.values,function(a){return this.normalizeValue(a,n.name)},this).join(" ")+";");n.value=b||n.value;var b=a.prefixes=="all"||!a.prefixes&&h?e(n.name,h&&a.prefixes!="all"):a.prefixes,p=[],w;d.each(b,function(a){a in r&&(w=r[a].transformName(n.name),p.push(w),v.push(o(w+":"+n.value,j,c)))});v.push(o(n.name+":"+n.value,j,c));p.push(n.name);if(q.get("css.alignVendor"))var s=
f("utils").getStringsPads(p),v=d.map(v,function(a,b){return s[b]+a});return v},expandToSnippet:function(a,b){var c=this.expand(a,null,b);return d.isArray(c)?c.join("\n"):!d.isString(c)?c.data:String(c)},splitSnippet:function(a){var b=f("utils"),a=b.trim(a);if(a.indexOf(":")==-1)return{name:a,value:"${1};"};a=a.split(":");return{name:b.trim(a.shift()),value:b.trim(a.join(":")).replace(/^(\$\{0\}|\$0)(\s*;?)$/,"${1}$2")}},getSyntaxPreference:n,transformSnippet:o}});
emmet.define("cssGradient",function(f,d){function h(a){return f("utils").trim(a).replace(/\s+/g," ")}function i(a){var a=h(a),b=null,a=a.replace(/^(\w+\(.+?\))\s*/,function(a,c){b=c;return""});b||(a=a.split(" "),b=a[0],a=a[1]||"");var c={color:b};a&&a.replace(/^(\-?[\d\.]+)([a-z%]+)?$/,function(a,b,d){c.position=b;~b.indexOf(".")?d="":d||(d="%");if(d)c.unit=d});return c}function b(a){var b=0;d.each(a,function(c,e){if(!e)return c.position=c.position||0;if(e==a.length-1&&!("position"in c))c.position=
1;if("position"in c){var g=a[b].position||0,f=(c.position-g)/(e-b);d.each(a.slice(b,e),function(a,b){a.position=g+f*b});b=e}})}function c(a){var b=parseFloat(a);if(!d.isNaN(b))switch(b%360){case 0:return"left";case 90:return"bottom";case 180:return"right";case 240:return"top"}return a}function a(a){a=c(a);if(q.test(a))throw"The direction is an angle that can\u2019t be converted.";var b=function(b){return~a.indexOf(b)?"100%":"0"};return b("right")+" "+b("bottom")+", "+b("left")+" "+b("top")}function g(a){var b=
s.getArray("css.gradient.prefixes"),b=d.map(b,function(b){return"-"+b+"-"+a});b.push(a);return b}function e(a,b){var c=[],e=f("cssResolver");s.get("css.gradient.fallback")&&~b.toLowerCase().indexOf("background")&&c.push({name:"background-color",value:"${1:"+a.colorStops[0].color+"}"});d.each(s.getArray("css.gradient.prefixes"),function(d){var g=e.prefixed(b,d);if(d=="webkit"&&s.get("css.gradient.oldWebkit"))try{c.push({name:g,value:p.oldWebkitLinearGradient(a)})}catch(f){}c.push({name:g,value:p.toString(a,
d)})});return c.sort(function(a,b){return b.name.length-a.name.length})}function j(a,b,c){var h=a.parent,j=f("utils"),i=f("preferences").get("css.alignVendor"),m=a.styleSeparator,l=a.styleBefore;d.each(h.getAll(g(a.name())),function(b){if(b!=a&&/gradient/i.test(b.value())){if(b.styleSeparator.length<m.length)m=b.styleSeparator;if(b.styleBefore.length<l.length)l=b.styleBefore;h.remove(b)}});if(i){if(l!=a.styleBefore){var n=a.fullRange();h._updateSource(l,n.start,n.start+a.styleBefore.length);a.styleBefore=
l}if(m!=a.styleSeparator)h._updateSource(m,a.nameRange().end,a.valueRange().start),a.styleSeparator=m}var o=a.value();c||(c=f("range").create(0,a.value()));a.value(function(a){return j.replaceSubstring(o,a,c)}(p.toString(b))+"${2}");b=e(b,a.name());if(i){i=d.pluck(b,"value");n=d.pluck(b,"name");i.push(a.value());n.push(a.name());var r=j.getStringsPads(d.map(i,function(a){return a.substring(0,a.indexOf("("))})),q=j.getStringsPads(n);a.name(d.last(q)+a.name());d.each(b,function(a,b){a.name=q[b]+a.name;
a.value=r[b]+a.value});a.value(d.last(r)+a.value())}d.each(b,function(b){h.add(b.name,b.value,h.indexOf(a))})}function n(a){var b=a.value(),c=null;return(a=d.find(a.valueParts(),function(a){return c=p.parse(a.substring(b))}))&&c?{gradient:c,valueRange:a}:null}function o(a,b){var c=s.get("css.gradient.defaultProperty");if(!c)return!1;var g=String(a.getContent()),h=f("range").create(a.getCurrentLineRange()),j=h.substring(g).replace(/^\s+/,function(a){h.start+=a.length;return""}).replace(/\s+$/,function(a){h.end-=
a.length;return""}),g=f("cssResolver");if(j=p.parse(j)){var i=e(j,c);i.push({name:c,value:p.toString(j)+"${2}"});var m=g.getSyntaxPreference("valueSeparator",b),l=g.getSyntaxPreference("propertyEnd",b);if(f("preferences").get("css.alignVendor")){var n=f("utils").getStringsPads(d.map(i,function(a){return a.value.substring(0,a.value.indexOf("("))}));d.each(i,function(a,b){a.value=n[b]+a.value})}i=d.map(i,function(a){return a.name+m+a.value+l});a.replaceContent(i.join("\n"),h.start,h.end);return!0}return!1}
function l(a,b){var c=null,e=f("cssEditTree").parseFromPosition(a,b,!0);e&&((c=e.itemFromPosition(b,!0))||(c=d.find(e.list(),function(a){return a.range(!0).end==b})));return{rule:e,property:c}}var m=["top","to bottom","0deg"],p=null,r=["css","less","sass","scss","stylus","styl"],q=/\d+deg/i,u=/top|bottom|left|right/i,s=f("preferences");s.define("css.gradient.prefixes","webkit, moz, o","A comma-separated list of vendor-prefixes for which values should be generated.");s.define("css.gradient.oldWebkit",
!0,"Generate gradient definition for old Webkit implementations");s.define("css.gradient.omitDefaultDirection",!0,"Do not output default direction definition in generated gradients.");s.define("css.gradient.defaultProperty","background-image","When gradient expanded outside CSS value context, it will produce properties with this name.");s.define("css.gradient.fallback",!1,"With this option enabled, CSS gradient generator will produce <code>background-color</code> property with gradient first color as fallback for old browsers.");
f("expandAbbreviation").addHandler(function(a,b,c){c=f("editorUtils").outputInfo(a,b,c);if(!d.include(r,c.syntax))return!1;var e=a.getCaretPos(),g=c.content,c=l(g,e);if(c.property){var h=n(c.property);if(h){var i=c.rule.options.offset||0,m=i+c.rule.toString().length;if(/[\n\r]/.test(c.property.value())){var p=c.property.valueRange(!0).start+h.valueRange.end,g=f("utils").replaceSubstring(g,";",p),e=l(g,e);e.property&&(h=n(e.property),c=e)}c.property.end(";");var e=c.property.name(),g=f("resources"),
p=f("preferences"),q=g.findSnippet(b,e);!q&&p.get("css.fuzzySearch")&&(q=g.fuzzyFindSnippet(b,e,parseFloat(p.get("css.fuzzySearchMinScore"))));if(q){if(!d.isString(q))q=q.data;b=f("cssResolver").splitSnippet(q).name}else b=void 0;b&&c.property.name(b);j(c.property,h.gradient,h.valueRange);a.replaceContent(c.rule.toString(),i,m,!0);return!0}}return o(a,b)});f("reflectCSSValue").addHandler(function(a){var b=f("utils"),c=n(a);if(!c)return!1;var e=a.value(),h=function(a){return b.replaceSubstring(e,a,
c.valueRange)};d.each(a.parent.getAll(g(a.name())),function(b){if(b!==a){var d=b.value().match(/^\s*(\-([a-z]+)\-)?linear\-gradient/);d?b.value(h(p.toString(c.gradient,d[2]||""))):b.value().match(/\s*\-webkit\-gradient/)&&b.value(h(p.oldWebkitLinearGradient(c.gradient)))}});return!0});return p={parse:function(a){var b=null;f("utils").trim(a).replace(/^([\w\-]+)\((.+?)\)$/,function(a,c,e){c=c.toLowerCase().replace(/^\-[a-z]+\-/,"");if(c=="linear-gradient"||c=="lg"){for(var a=m[0],e=f("stringStream").create(f("utils").trim(e)),
c=[],g;g=e.next();)e.peek()==","?(c.push(e.current()),e.next(),e.eatSpace(),e.start=e.pos):g=="("&&e.skipTo(")");c.push(e.current());c=d.compact(d.map(c,h));if(c.length){if(q.test(c[0])||u.test(c[0]))a=c.shift();b={type:"linear",direction:a,colorStops:d.map(c,i)}}else b=null;return""}return a});return b},oldWebkitLinearGradient:function(c){d.isString(c)&&(c=this.parse(c));if(!c)return null;var e=d.map(c.colorStops,d.clone);d.each(e,function(a){if("position"in a)if(~a.position.indexOf(".")||a.unit==
"%")a.position=parseFloat(a.position)/(a.unit=="%"?100:1);else throw"Can't convert color stop '"+(a.position+(a.unit||""))+"'";});b(e);e=d.map(e,function(a,b){return!a.position&&!b?"from("+a.color+")":a.position==1&&b==e.length-1?"to("+a.color+")":"color-stop("+a.position.toFixed(2).replace(/\.?0+$/,"")+", "+a.color+")"});return"-webkit-gradient(linear, "+a(c.direction)+", "+e.join(", ")+")"},toString:function(a,b){if(a.type=="linear"){var c=(b?"-"+b+"-":"")+"linear-gradient",e=d.map(a.colorStops,
function(a){return a.color+("position"in a?" "+a.position+(a.unit||""):"")});a.direction&&(!s.get("css.gradient.omitDefaultDirection")||!d.include(m,a.direction))&&e.unshift(a.direction);return c+"("+e.join(", ")+")"}}}});emmet.exec(function(f,d){var h=f("handlerList").create(),i=f("resources");d.extend(i,{addGenerator:function(b,c,a){d.isString(b)&&(b=RegExp(b));h.add(function(a,d){var f;return(f=b.exec(a.name()))?c(f,a,d):null},a)}});i.addResolver(function(b,c){return h.exec(null,d.toArray(arguments))})});
emmet.define("tagName",function(f,d){var h={empty:"area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command".split(","),blockLevel:"address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6".split(","),inlineLevel:"a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var".split(",")},
i={p:"span",ul:"li",ol:"li",table:"tr",tr:"td",tbody:"tr",thead:"tr",tfoot:"tr",colgroup:"col",select:"option",optgroup:"option",audio:"source",video:"source",object:"param",map:"area"};return{resolve:function(b){b=(b||"").toLowerCase();return b in i?this.getMapping(b):this.isInlineLevel(b)?"span":"div"},getMapping:function(b){return i[b.toLowerCase()]},isInlineLevel:function(b){return this.isTypeOf(b,"inlineLevel")},isBlockLevel:function(b){return this.isTypeOf(b,"blockLevel")},isEmptyElement:function(b){return this.isTypeOf(b,
"empty")},isTypeOf:function(b,c){return d.include(h[c],b)},addMapping:function(b,c){i[b]=c},removeMapping:function(b){b in i&&delete i[b]},addElementToCollection:function(b,c){h[c]||(h[c]=[]);var a=this.getCollection(c);d.include(a,b)||a.push(b)},removeElementFromCollection:function(b,c){c in h&&(h[c]=d.without(this.getCollection(c),b))},getCollection:function(b){return h[b]}}});
emmet.exec(function(f,d){function h(){return{element:g.get("bem.elementSeparator"),modifier:g.get("bem.modifierSeparator")}}function i(a){if(f("abbreviationUtils").isSnippet(a))return a;a.__bem={block:"",element:"",modifier:""};var e=b(a.attribute("class")).split(" "),g=/^[a-z]\-/i;a.__bem.block=d.find(e,function(a){return g.test(a)});if(!a.__bem.block)g=/^[a-z]/i,a.__bem.block=d.find(e,function(a){return g.test(a)})||"";(e=d.chain(e).map(function(b){var d;d=c(b,a,"element");d=c(d,a,"modifier");var e=
"",g="",f="",b=h();~d.indexOf(b.element)?(e=d.split(b.element),f=e[1].split(b.modifier),e=e[0],g=f.shift(),f=f.join(b.modifier)):~d.indexOf(b.modifier)&&(f=d.split(b.modifier),e=f.shift(),f=f.join(b.modifier));if(e||g||f){if(!e)e=a.__bem.block;d=e;var i=[];g&&(d+=b.element+g);i.push(d);f&&i.push(d+b.modifier+f);a.__bem.block=e;a.__bem.element=g;a.__bem.modifier=f;b=i}else b=d;return b}).flatten().uniq().value().join(" "))&&a.attribute("class",e);return a}function b(a){var b=f("utils"),a=(" "+(a||
"")+" ").replace(/\s+/g," "),c=g.get("bem.shortElementPrefix");c&&(c=RegExp("\\s("+b.escapeForRegexp(c)+"+)","g"),a=a.replace(c,function(a,c){return" "+b.repeatString(h().element,c.length)}));return b.trim(a)}function c(a,b,c){var d=h(),e=RegExp("^("+d[c]+")+","g");if(e.test(a)){for(var g=0,e=a.replace(e,function(a){g=a.length/d[c].length;return""}),f=b;f.parent&&g--;)f=f.parent;if(!f||!f.__bem)f=b;if(f&&f.__bem)return a=f.__bem.block,c=="modifier"&&f.__bem.element&&(a+=d.element+f.__bem.element),
a+d[c]+e}return a}function a(b,c){b.name&&i(b,c);var g=f("abbreviationUtils");d.each(b.children,function(b){a(b,c);!g.isSnippet(b)&&b.start&&(e=!0)});return b}var g=f("preferences");g.define("bem.elementSeparator","__","Class name\u2019s element separator.");g.define("bem.modifierSeparator","_","Class name\u2019s modifier separator.");g.define("bem.shortElementPrefix","-","Symbol for describing short \u201cblock-element\u201d notation. Class names prefixed with this symbol will be treated as element name for parent\u2018s block name. Each symbol instance traverses one level up in parsed tree for block name lookup. Empty value will disable short notation.");
var e=!1;f("filters").add("bem",function(b,c){e=!1;b=a(b,c);e&&(b=f("filters").apply(b,"html",c));return b})});
emmet.exec(function(f,d){function h(c,a,g){var e=f("utils"),h=b.get("filter.commentTrigger");if(h=="*"||d.find(h.split(","),function(a){return!!c.attribute(e.trim(a))}))h={node:c,name:c.name(),padding:c.parent?c.parent.padding:"",attr:function(a,b,d){return(a=c.attribute(a))?(b||"")+a+(d||""):""}},a=e.normalizeNewline(a?a(h):""),g=e.normalizeNewline(g?g(h):""),c.start=c.start.replace(/</,a+"<"),c.end=c.end.replace(/>/,">"+g)}function i(b,a,g){var e=f("abbreviationUtils");d.each(b.children,function(b){e.isBlock(b)&&
h(b,a,g);i(b,a,g)});return b}var b=f("preferences");b.define("filter.commentAfter",'\n<\!-- /<%= attr("id", "#") %><%= attr("class", ".") %> --\>',"A definition of comment that should be placed <i>after</i> matched element when <code>comment</code> filter is applied. This definition is an ERB-style template passed to <code>_.template()</code> function (see Underscore.js docs for details). In template context, the following properties and functions are availabe:\n<ul><li><code>attr(name, before, after)</code> \u2013 a function that outputsspecified attribute value concatenated with <code>before</code> and <code>after</code> strings. If attribute doesn't exists, the empty string will be returned.</li><li><code>node</code> \u2013 current node (instance of <code>AbbreviationNode</code>)</li><li><code>name</code> \u2013 name of current tag</li><li><code>padding</code> \u2013 current string padding, can be used for formatting</li></ul>");
b.define("filter.commentBefore","","A definition of comment that should be placed <i>before</i> matched element when <code>comment</code> filter is applied. For more info, read description of <code>filter.commentAfter</code> property");b.define("filter.commentTrigger","id, class","A comma-separated list of attribute names that should exist in abbreviatoin where comment should be added. If you wish to add comment for every element, set this option to <code>*</code>");f("filters").add("c",function(c){var a=
d.template(b.get("filter.commentBefore")),g=d.template(b.get("filter.commentAfter"));return i(c,a,g)})});emmet.exec(function(f,d){function h(b){return b.replace(/([<>&])/g,function(b,a){return i[a]})}var i={"<":"&lt;",">":"&gt;","&":"&amp;"};f("filters").add("e",function c(a){d.each(a.children,function(a){a.start=h(a.start);a.end=h(a.end);a.content=h(a.content);c(a)});return a})});
emmet.exec(function(f,d){function h(a){return a.parent&&!a.parent.parent&&!a.index()}function i(a,c){var d=f("abbreviationUtils");return c.tag_nl===!0||d.isBlock(a)?!0:!a.parent||!c.inline_break?!1:b(a.parent,c)}function b(a,b){var c=0,h=f("abbreviationUtils");return!!d.find(a.children,function(a){a.isTextNode()||!h.isInline(a)?c=0:h.isInline(a)&&c++;if(c>=b.inline_break)return!0})}function c(a,c){var h=f("abbreviationUtils");return!d.any(a.children,function(a){return h.isSnippet(a)?!1:!h.isInline(a)})?
b(a,c):!0}var a=f("preferences");a.define("format.noIndentTags","html","A comma-separated list of tag names that should not get inner indentation.");a.define("format.forceIndentationForTags","body","A comma-separated list of tag names that should <em>always</em> get inner indentation.");f("filters").add("_format",function e(b,n,o){var o=o||0,l=f("abbreviationUtils");d.each(b.children,function(b){if(l.isSnippet(b)){if(b.start=b.end="",!h(b)&&n.tag_nl!==!1&&i(b,n)&&(!b.parent.parent||!f("abbreviationUtils").isInline(b.parent)))b.start=
f("utils").getNewline()+b.start}else{b.start=b.end="%s";var j=f("utils"),r=f("abbreviationUtils"),q=r.isUnary(b),j=j.getNewline(),u=d.include(a.getArray("format.noIndentTags")||[],b.name())?"":f("resources").getVariable("indentation");if(n.tag_nl!==!1){var s=n.tag_nl===!0&&(n.tag_nl_leaf||b.children.length);s||(s=d.include(a.getArray("format.forceIndentationForTags")||[],b.name()));if(!b.isTextNode()){if(i(b,n)){if(!h(b)&&(!r.isSnippet(b.parent)||b.index()))b.start=j+b.start;if(r.hasBlockChildren(b)||
b.children.length&&i(b.children[0],n)||s&&!q)b.end=j+b.end;if(r.hasTagsInContent(b)||s&&!b.children.length&&!q)b.start+=j+u}else if(r.isInline(b)&&b.parent&&f("abbreviationUtils").hasBlockChildren(b.parent)&&!h(b))b.start=j+b.start;else if(r.isInline(b)&&c(b,n))b.end=j+b.end;b.padding=u}}}e(b,n,o+1)});return b})});
emmet.exec(function(f,d){function h(h,b){var c="",a=[],g=b.attributeQuote(),e=b.cursor();d.each(h.attributeList(),function(d){var h=b.attributeName(d.name);switch(h.toLowerCase()){case "id":c+="#"+(d.value||e);break;case "class":c+="."+f("utils").trim(d.value||e).replace(/\s+/g,".");break;default:a.push(":"+h+" => "+g+(d.value||e)+g)}});a.length&&(c+="{"+a.join(", ")+"}");return c}f("filters").add("haml",function b(c,a,g){var g=g||0,e=f("abbreviationUtils");g||(c=f("filters").apply(c,"_format",a));
d.each(c.children,function(c){if(!e.isSnippet(c)&&c.parent){var d=f("abbreviationUtils"),o=f("utils"),l=h(c,a),m=a.cursor(),d=d.isUnary(c),p=a.self_closing_tag&&d?"/":"",r="",r="%"+a.tagName(c.name());r.toLowerCase()=="%div"&&l&&l.indexOf("{")==-1&&(r="");c.end="";c.start=o.replaceSubstring(c.start,r+l+p+" ",c.start.indexOf("%s"),"%s");!c.children.length&&!d&&(c.start+=m)}b(c,a,g+1)});return c})});
emmet.exec(function(f,d){function h(f,b){var c=b.attributeQuote(),a=b.cursor();return d.map(f.attributeList(),function(d){return" "+b.attributeName(d.name)+"="+c+(d.value||a)+c}).join("")}f("filters").add("html",function b(c,a,g){var g=g||0,e=f("abbreviationUtils");g||(c=f("filters").apply(c,"_format",a));d.each(c.children,function(c){if(!e.isSnippet(c)&&c.parent){var d=f("abbreviationUtils"),o=f("utils"),l=h(c,a),m=a.cursor(),d=d.isUnary(c),p="",r="";if(!c.isTextNode()){var q=a.tagName(c.name());
d?(p="<"+q+l+a.selfClosing()+">",c.end=""):(p="<"+q+l+">",r="</"+q+">")}c.start=o.replaceSubstring(c.start,p,c.start.indexOf("%s"),"%s");c.end=o.replaceSubstring(c.end,r,c.end.indexOf("%s"),"%s");!c.children.length&&!d&&!~c.content.indexOf(m)&&!f("tabStops").extract(c.content).tabstops.length&&(c.start+=m)}b(c,a,g+1)});return c})});
emmet.exec(function(f,d){var h=/^\s+/,i=/[\n\r]/g;f("filters").add("s",function c(a){var g=f("abbreviationUtils");d.each(a.children,function(a){if(!g.isSnippet(a))a.start=a.start.replace(h,""),a.end=a.end.replace(h,"");a.start=a.start.replace(i,"");a.end=a.end.replace(i,"");a.content=a.content.replace(i,"");c(a)});return a})});
emmet.exec(function(f,d){function h(f,b){d.each(f.children,function(c){if(c.content)c.content=c.content.replace(b,"");h(c,b)});return f}f("preferences").define("filter.trimRegexp","[\\s|\\u00a0]*[\\d|#|\\-|*|\\u2022]+\\.?\\s*","Regular expression used to remove list markers (numbers, dashes, bullets, etc.) in <code>t</code> (trim) filter. The trim filter is useful for wrapping with abbreviation lists, pased from other documents (for example, Word documents).");f("filters").add("t",function(d){var b=
RegExp(f("preferences").get("filter.trimRegexp"));return h(d,b)})});emmet.exec(function(f,d){var h={"xsl:variable":1,"xsl:with-param":1};f("filters").add("xsl",function b(c){var a=f("abbreviationUtils");d.each(c.children,function(c){if(!a.isSnippet(c)&&(c.name()||"").toLowerCase()in h&&c.children.length)c.start=c.start.replace(/\s+select\s*=\s*(['"]).*?\1/,"");b(c)});return c})});
emmet.exec(function(f,d){function h(a,b){return Math.round(Math.random()*(b-a)+a)}function i(a,b){for(var c=a.length,g=Math.min(c,b),f=[];f.length<g;){var i=h(0,c-1);d.include(f,i)||f.push(i)}return d.map(f,function(b){return a[b]})}function b(a,b){a.length&&(a[0]=a[0].charAt(0).toUpperCase()+a[0].substring(1));return a.join(" ")+(b||(d.isString("?!...")?"?!...".charAt(h(0,4)):"?!..."[h(0,4)]))}function c(a){var b=a.length,c=0,c=b>3&&b<=6?h(0,1):b>6&&b<=12?h(0,2):h(1,4);d.each(i(d.range(c)),function(b){a[b]+=
","})}f("abbreviationParser").addPreprocessor(function(d){var f=/^(?:lorem|lipsum)(\d*)$/i,n;d.findAll(function(d){if(d._name&&(n=d._name.match(f))){var e=n[1]||30;d._name="";d.data("forceNameResolving",d.isRepeating()||d.attributeList().length);d.data("pasteOverwrites",!0);d.data("paste",function(d){var f=e,j=!d,d=[],n=0,f=parseInt(f,10);j&&(j=a.slice(0,f),j.length>5&&(j[4]+=","),n+=j.length,d.push(b(j,".")));for(;n<f;)j=i(g,Math.min(h(3,12)*h(1,5),f-n)),n+=j.length,c(j),d.push(b(j));return d.join(" ")})}})});
var a="lorem ipsum dolor sit amet consectetur adipisicing elit".split(" "),g=["exercitationem","perferendis","perspiciatis","laborum","eveniet","sunt","iure","nam","nobis","eum","cum","officiis","excepturi","odio","consectetur","quasi","aut","quisquam","vel","eligendi","itaque","non","odit","tempore","quaerat","dignissimos","facilis","neque","nihil","expedita","vitae","vero","ipsum","nisi","animi","cumque","pariatur","velit","modi","natus","iusto","eaque","sequi","illo","sed","ex","et","voluptatibus",
"tempora","veritatis","ratione","assumenda","incidunt","nostrum","placeat","aliquid","fuga","provident","praesentium","rem","necessitatibus","suscipit","adipisci","quidem","possimus","voluptas","debitis","sint","accusantium","unde","sapiente","voluptate","qui","aspernatur","laudantium","soluta","amet","quo","aliquam","saepe","culpa","libero","ipsa","dicta","reiciendis","nesciunt","doloribus","autem","impedit","minima","maiores","repudiandae","ipsam","obcaecati","ullam","enim","totam","delectus","ducimus",
"quis","voluptates","dolores","molestiae","harum","dolorem","quia","voluptatem","molestias","magni","distinctio","omnis","illum","dolorum","voluptatum","ea","quas","quam","corporis","quae","blanditiis","atque","deserunt","laboriosam","earum","consequuntur","hic","cupiditate","quibusdam","accusamus","ut","rerum","error","minus","eius","ab","ad","nemo","fugit","officia","at","in","id","quos","reprehenderit","numquam","iste","fugiat","sit","inventore","beatae","repellendus","magnam","recusandae","quod",
"explicabo","doloremque","aperiam","consequatur","asperiores","commodi","optio","dolor","labore","temporibus","repellat","veniam","architecto","est","esse","mollitia","nulla","a","similique","eos","alias","dolore","tenetur","deleniti","porro","facere","maxime","corrupti"]});emmet.exec(function(f){f("actions").add("select_line",function(d){var f=d.getCurrentLineRange();d.createSelection(f.start,f.end);return!0})});
emmet.exec(function(f){f("resources").setVocabulary({variables:{lang:"en",locale:"en-US",charset:"UTF-8",indentation:"\t",newline:"\n"},css:{filters:"html",snippets:{"@i":"@import url(|);","@import":"@import url(|);","@m":"@media ${1:screen} {\n\t|\n}","@media":"@media ${1:screen} {\n\t|\n}","@f":"@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}","@f+":"@font-face {\n\tfont-family: '${1:FontName}';\n\tsrc: url('${2:FileName}.eot');\n\tsrc: url('${2:FileName}.eot?#iefix') format('embedded-opentype'),\n\t\t url('${2:FileName}.woff') format('woff'),\n\t\t url('${2:FileName}.ttf') format('truetype'),\n\t\t url('${2:FileName}.svg#${1:FontName}') format('svg');\n\tfont-style: ${3:normal};\n\tfont-weight: ${4:normal};\n}",
"@kf":"@-webkit-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@-o-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@-moz-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}",anim:"animation:|;","anim-":"animation:${1:name} ${2:duration} ${3:timing-function} ${4:delay} ${5:iteration-count} ${6:direction} ${7:fill-mode};",animdel:"animation-delay:${1:time};",
animdir:"animation-direction:${1:normal};","animdir:n":"animation-direction:normal;","animdir:r":"animation-direction:reverse;","animdir:a":"animation-direction:alternate;","animdir:ar":"animation-direction:alternate-reverse;",animdur:"animation-duration:${1:0}s;",animfm:"animation-fill-mode:${1:both};","animfm:f":"animation-fill-mode:forwards;","animfm:b":"animation-fill-mode:backwards;","animfm:bt":"animation-fill-mode:both;","animfm:bh":"animation-fill-mode:both;",animic:"animation-iteration-count:${1:1};",
"animic:i":"animation-iteration-count:infinite;",animn:"animation-name:${1:none};",animps:"animation-play-state:${1:running};","animps:p":"animation-play-state:paused;","animps:r":"animation-play-state:running;",animtf:"animation-timing-function:${1:linear};","animtf:e":"animation-timing-function:ease;","animtf:ei":"animation-timing-function:ease-in;","animtf:eo":"animation-timing-function:ease-out;","animtf:eio":"animation-timing-function:ease-in-out;","animtf:l":"animation-timing-function:linear;",
"animtf:cb":"animation-timing-function:cubic-bezier(${1:0.1}, ${2:0.7}, ${3:1.0}, ${3:0.1});",ap:"appearance:${none}","!":"!important",pos:"position:${1:relative};","pos:s":"position:static;","pos:a":"position:absolute;","pos:r":"position:relative;","pos:f":"position:fixed;",t:"top:|;","t:a":"top:auto;",r:"right:|;","r:a":"right:auto;",b:"bottom:|;","b:a":"bottom:auto;",l:"left:|;","l:a":"left:auto;",z:"z-index:|;","z:a":"z-index:auto;",fl:"float:${1:left};","fl:n":"float:none;","fl:l":"float:left;",
"fl:r":"float:right;",cl:"clear:${1:both};","cl:n":"clear:none;","cl:l":"clear:left;","cl:r":"clear:right;","cl:b":"clear:both;",colm:"columns:|;",colmc:"column-count:|;",colmf:"column-fill:|;",colmg:"column-gap:|;",colmr:"column-rule:|;",colmrc:"column-rule-color:|;",colmrs:"column-rule-style:|;",colmrw:"column-rule-width:|;",colms:"column-span:|;",colmw:"column-width:|;",d:"display:${1:block};","d:n":"display:none;","d:b":"display:block;","d:i":"display:inline;","d:ib":"display:inline-block;","d:li":"display:list-item;",
"d:ri":"display:run-in;","d:cp":"display:compact;","d:tb":"display:table;","d:itb":"display:inline-table;","d:tbcp":"display:table-caption;","d:tbcl":"display:table-column;","d:tbclg":"display:table-column-group;","d:tbhg":"display:table-header-group;","d:tbfg":"display:table-footer-group;","d:tbr":"display:table-row;","d:tbrg":"display:table-row-group;","d:tbc":"display:table-cell;","d:rb":"display:ruby;","d:rbb":"display:ruby-base;","d:rbbg":"display:ruby-base-group;","d:rbt":"display:ruby-text;",
"d:rbtg":"display:ruby-text-group;",v:"visibility:${1:hidden};","v:v":"visibility:visible;","v:h":"visibility:hidden;","v:c":"visibility:collapse;",ov:"overflow:${1:hidden};","ov:v":"overflow:visible;","ov:h":"overflow:hidden;","ov:s":"overflow:scroll;","ov:a":"overflow:auto;",ovx:"overflow-x:${1:hidden};","ovx:v":"overflow-x:visible;","ovx:h":"overflow-x:hidden;","ovx:s":"overflow-x:scroll;","ovx:a":"overflow-x:auto;",ovy:"overflow-y:${1:hidden};","ovy:v":"overflow-y:visible;","ovy:h":"overflow-y:hidden;",
"ovy:s":"overflow-y:scroll;","ovy:a":"overflow-y:auto;",ovs:"overflow-style:${1:scrollbar};","ovs:a":"overflow-style:auto;","ovs:s":"overflow-style:scrollbar;","ovs:p":"overflow-style:panner;","ovs:m":"overflow-style:move;","ovs:mq":"overflow-style:marquee;",zoo:"zoom:1;",zm:"zoom:1;",cp:"clip:|;","cp:a":"clip:auto;","cp:r":"clip:rect(${1:top} ${2:right} ${3:bottom} ${4:left});",bxz:"box-sizing:${1:border-box};","bxz:cb":"box-sizing:content-box;","bxz:bb":"box-sizing:border-box;",bxsh:"box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:color};",
"bxsh:r":"box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:spread }rgb(${6:0}, ${7:0}, ${8:0});","bxsh:ra":"box-shadow:${1:inset }${2:h} ${3:v} ${4:blur} ${5:spread }rgba(${6:0}, ${7:0}, ${8:0}, .${9:5});","bxsh:n":"box-shadow:none;",m:"margin:|;","m:a":"margin:auto;",mt:"margin-top:|;","mt:a":"margin-top:auto;",mr:"margin-right:|;","mr:a":"margin-right:auto;",mb:"margin-bottom:|;","mb:a":"margin-bottom:auto;",ml:"margin-left:|;","ml:a":"margin-left:auto;",p:"padding:|;",pt:"padding-top:|;",
pr:"padding-right:|;",pb:"padding-bottom:|;",pl:"padding-left:|;",w:"width:|;","w:a":"width:auto;",h:"height:|;","h:a":"height:auto;",maw:"max-width:|;","maw:n":"max-width:none;",mah:"max-height:|;","mah:n":"max-height:none;",miw:"min-width:|;",mih:"min-height:|;",mar:"max-resolution:${1:res};",mir:"min-resolution:${1:res};",ori:"orientation:|;","ori:l":"orientation:landscape;","ori:p":"orientation:portrait;",ol:"outline:|;","ol:n":"outline:none;",olo:"outline-offset:|;",olw:"outline-width:|;",ols:"outline-style:|;",
olc:"outline-color:#${1:000};","olc:i":"outline-color:invert;",bd:"border:|;","bd+":"border:${1:1px} ${2:solid} ${3:#000};","bd:n":"border:none;",bdbk:"border-break:${1:close};","bdbk:c":"border-break:close;",bdcl:"border-collapse:|;","bdcl:c":"border-collapse:collapse;","bdcl:s":"border-collapse:separate;",bdc:"border-color:#${1:000};","bdc:t":"border-color:transparent;",bdi:"border-image:url(|);","bdi:n":"border-image:none;",bdti:"border-top-image:url(|);","bdti:n":"border-top-image:none;",bdri:"border-right-image:url(|);",
"bdri:n":"border-right-image:none;",bdbi:"border-bottom-image:url(|);","bdbi:n":"border-bottom-image:none;",bdli:"border-left-image:url(|);","bdli:n":"border-left-image:none;",bdci:"border-corner-image:url(|);","bdci:n":"border-corner-image:none;","bdci:c":"border-corner-image:continue;",bdtli:"border-top-left-image:url(|);","bdtli:n":"border-top-left-image:none;","bdtli:c":"border-top-left-image:continue;",bdtri:"border-top-right-image:url(|);","bdtri:n":"border-top-right-image:none;","bdtri:c":"border-top-right-image:continue;",
bdbri:"border-bottom-right-image:url(|);","bdbri:n":"border-bottom-right-image:none;","bdbri:c":"border-bottom-right-image:continue;",bdbli:"border-bottom-left-image:url(|);","bdbli:n":"border-bottom-left-image:none;","bdbli:c":"border-bottom-left-image:continue;",bdf:"border-fit:${1:repeat};","bdf:c":"border-fit:clip;","bdf:r":"border-fit:repeat;","bdf:sc":"border-fit:scale;","bdf:st":"border-fit:stretch;","bdf:ow":"border-fit:overwrite;","bdf:of":"border-fit:overflow;","bdf:sp":"border-fit:space;",
bdlen:"border-length:|;","bdlen:a":"border-length:auto;",bdsp:"border-spacing:|;",bds:"border-style:|;","bds:n":"border-style:none;","bds:h":"border-style:hidden;","bds:dt":"border-style:dotted;","bds:ds":"border-style:dashed;","bds:s":"border-style:solid;","bds:db":"border-style:double;","bds:dtds":"border-style:dot-dash;","bds:dtdtds":"border-style:dot-dot-dash;","bds:w":"border-style:wave;","bds:g":"border-style:groove;","bds:r":"border-style:ridge;","bds:i":"border-style:inset;","bds:o":"border-style:outset;",
bdw:"border-width:|;",bdtw:"border-top-width:|;",bdrw:"border-right-width:|;",bdbw:"border-bottom-width:|;",bdlw:"border-left-width:|;",bdt:"border-top:|;",bt:"border-top:|;","bdt+":"border-top:${1:1px} ${2:solid} ${3:#000};","bdt:n":"border-top:none;",bdts:"border-top-style:|;","bdts:n":"border-top-style:none;",bdtc:"border-top-color:#${1:000};","bdtc:t":"border-top-color:transparent;",bdr:"border-right:|;",br:"border-right:|;","bdr+":"border-right:${1:1px} ${2:solid} ${3:#000};","bdr:n":"border-right:none;",
bdrst:"border-right-style:|;","bdrst:n":"border-right-style:none;",bdrc:"border-right-color:#${1:000};","bdrc:t":"border-right-color:transparent;",bdb:"border-bottom:|;",bb:"border-bottom:|;","bdb+":"border-bottom:${1:1px} ${2:solid} ${3:#000};","bdb:n":"border-bottom:none;",bdbs:"border-bottom-style:|;","bdbs:n":"border-bottom-style:none;",bdbc:"border-bottom-color:#${1:000};","bdbc:t":"border-bottom-color:transparent;",bdl:"border-left:|;",bl:"border-left:|;","bdl+":"border-left:${1:1px} ${2:solid} ${3:#000};",
"bdl:n":"border-left:none;",bdls:"border-left-style:|;","bdls:n":"border-left-style:none;",bdlc:"border-left-color:#${1:000};","bdlc:t":"border-left-color:transparent;",bdrs:"border-radius:|;",bdtrrs:"border-top-right-radius:|;",bdtlrs:"border-top-left-radius:|;",bdbrrs:"border-bottom-right-radius:|;",bdblrs:"border-bottom-left-radius:|;",bg:"background:|;","bg+":"background:${1:#fff} url(${2}) ${3:0} ${4:0} ${5:no-repeat};","bg:n":"background:none;","bg:ie":"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1:x}.png',sizingMethod='${2:crop}');",
bgc:"background-color:#${1:fff};","bgc:t":"background-color:transparent;",bgi:"background-image:url(|);","bgi:n":"background-image:none;",bgr:"background-repeat:|;","bgr:n":"background-repeat:no-repeat;","bgr:x":"background-repeat:repeat-x;","bgr:y":"background-repeat:repeat-y;","bgr:sp":"background-repeat:space;","bgr:rd":"background-repeat:round;",bga:"background-attachment:|;","bga:f":"background-attachment:fixed;","bga:s":"background-attachment:scroll;",bgp:"background-position:${1:0} ${2:0};",
bgpx:"background-position-x:|;",bgpy:"background-position-y:|;",bgbk:"background-break:|;","bgbk:bb":"background-break:bounding-box;","bgbk:eb":"background-break:each-box;","bgbk:c":"background-break:continuous;",bgcp:"background-clip:${1:padding-box};","bgcp:bb":"background-clip:border-box;","bgcp:pb":"background-clip:padding-box;","bgcp:cb":"background-clip:content-box;","bgcp:nc":"background-clip:no-clip;",bgo:"background-origin:|;","bgo:pb":"background-origin:padding-box;","bgo:bb":"background-origin:border-box;",
"bgo:cb":"background-origin:content-box;",bgsz:"background-size:|;","bgsz:a":"background-size:auto;","bgsz:ct":"background-size:contain;","bgsz:cv":"background-size:cover;",c:"color:#${1:000};","c:r":"color:rgb(${1:0}, ${2:0}, ${3:0});","c:ra":"color:rgba(${1:0}, ${2:0}, ${3:0}, .${4:5});",cm:"/* |${child} */",cnt:"content:'|';","cnt:n":"content:normal;","cnt:oq":"content:open-quote;","cnt:noq":"content:no-open-quote;","cnt:cq":"content:close-quote;","cnt:ncq":"content:no-close-quote;","cnt:a":"content:attr(|);",
"cnt:c":"content:counter(|);","cnt:cs":"content:counters(|);",tbl:"table-layout:|;","tbl:a":"table-layout:auto;","tbl:f":"table-layout:fixed;",cps:"caption-side:|;","cps:t":"caption-side:top;","cps:b":"caption-side:bottom;",ec:"empty-cells:|;","ec:s":"empty-cells:show;","ec:h":"empty-cells:hide;",lis:"list-style:|;","lis:n":"list-style:none;",lisp:"list-style-position:|;","lisp:i":"list-style-position:inside;","lisp:o":"list-style-position:outside;",list:"list-style-type:|;","list:n":"list-style-type:none;",
"list:d":"list-style-type:disc;","list:c":"list-style-type:circle;","list:s":"list-style-type:square;","list:dc":"list-style-type:decimal;","list:dclz":"list-style-type:decimal-leading-zero;","list:lr":"list-style-type:lower-roman;","list:ur":"list-style-type:upper-roman;",lisi:"list-style-image:|;","lisi:n":"list-style-image:none;",q:"quotes:|;","q:n":"quotes:none;","q:ru":"quotes:'\\00AB' '\\00BB' '\\201E' '\\201C';","q:en":"quotes:'\\201C' '\\201D' '\\2018' '\\2019';",ct:"content:|;","ct:n":"content:normal;",
"ct:oq":"content:open-quote;","ct:noq":"content:no-open-quote;","ct:cq":"content:close-quote;","ct:ncq":"content:no-close-quote;","ct:a":"content:attr(|);","ct:c":"content:counter(|);","ct:cs":"content:counters(|);",coi:"counter-increment:|;",cor:"counter-reset:|;",va:"vertical-align:${1:top};","va:sup":"vertical-align:super;","va:t":"vertical-align:top;","va:tt":"vertical-align:text-top;","va:m":"vertical-align:middle;","va:bl":"vertical-align:baseline;","va:b":"vertical-align:bottom;","va:tb":"vertical-align:text-bottom;",
"va:sub":"vertical-align:sub;",ta:"text-align:${1:left};","ta:l":"text-align:left;","ta:c":"text-align:center;","ta:r":"text-align:right;","ta:j":"text-align:justify;","ta-lst":"text-align-last:|;","tal:a":"text-align-last:auto;","tal:l":"text-align-last:left;","tal:c":"text-align-last:center;","tal:r":"text-align-last:right;",td:"text-decoration:${1:none};","td:n":"text-decoration:none;","td:u":"text-decoration:underline;","td:o":"text-decoration:overline;","td:l":"text-decoration:line-through;",
te:"text-emphasis:|;","te:n":"text-emphasis:none;","te:ac":"text-emphasis:accent;","te:dt":"text-emphasis:dot;","te:c":"text-emphasis:circle;","te:ds":"text-emphasis:disc;","te:b":"text-emphasis:before;","te:a":"text-emphasis:after;",th:"text-height:|;","th:a":"text-height:auto;","th:f":"text-height:font-size;","th:t":"text-height:text-size;","th:m":"text-height:max-size;",ti:"text-indent:|;","ti:-":"text-indent:-9999px;",tj:"text-justify:|;","tj:a":"text-justify:auto;","tj:iw":"text-justify:inter-word;",
"tj:ii":"text-justify:inter-ideograph;","tj:ic":"text-justify:inter-cluster;","tj:d":"text-justify:distribute;","tj:k":"text-justify:kashida;","tj:t":"text-justify:tibetan;",tov:"text-overflow:${ellipsis};","tov:e":"text-overflow:ellipsis;","tov:c":"text-overflow:clip;",to:"text-outline:|;","to+":"text-outline:${1:0} ${2:0} ${3:#000};","to:n":"text-outline:none;",tr:"text-replace:|;","tr:n":"text-replace:none;",tt:"text-transform:${1:uppercase};","tt:n":"text-transform:none;","tt:c":"text-transform:capitalize;",
"tt:u":"text-transform:uppercase;","tt:l":"text-transform:lowercase;",tw:"text-wrap:|;","tw:n":"text-wrap:normal;","tw:no":"text-wrap:none;","tw:u":"text-wrap:unrestricted;","tw:s":"text-wrap:suppress;",tsh:"text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000};","tsh:r":"text-shadow:${1:h} ${2:v} ${3:blur} rgb(${4:0}, ${5:0}, ${6:0});","tsh:ra":"text-shadow:${1:h} ${2:v} ${3:blur} rgba(${4:0}, ${5:0}, ${6:0}, .${7:5});","tsh+":"text-shadow:${1:0} ${2:0} ${3:0} ${4:#000};","tsh:n":"text-shadow:none;",
trf:"transform:|;","trf:skx":"transform: skewX(${1:angle});","trf:sky":"transform: skewY(${1:angle});","trf:sc":"transform: scale(${1:x}, ${2:y});","trf:scx":"transform: scaleX(${1:x});","trf:scy":"transform: scaleY(${1:y});","trf:r":"transform: rotate(${1:angle});","trf:t":"transform: translate(${1:x}, ${2:y});","trf:tx":"transform: translateX(${1:x});","trf:ty":"transform: translateY(${1:y});",trfo:"transform-origin:|;",trfs:"transform-style:${1:preserve-3d};",trs:"transition:${1:prop} ${2:time};",
trsde:"transition-delay:${1:time};",trsdu:"transition-duration:${1:time};",trsp:"transition-property:${1:prop};",trstf:"transition-timing-function:${1:tfunc};",lh:"line-height:|;",whs:"white-space:|;","whs:n":"white-space:normal;","whs:p":"white-space:pre;","whs:nw":"white-space:nowrap;","whs:pw":"white-space:pre-wrap;","whs:pl":"white-space:pre-line;",whsc:"white-space-collapse:|;","whsc:n":"white-space-collapse:normal;","whsc:k":"white-space-collapse:keep-all;","whsc:l":"white-space-collapse:loose;",
"whsc:bs":"white-space-collapse:break-strict;","whsc:ba":"white-space-collapse:break-all;",wob:"word-break:|;","wob:n":"word-break:normal;","wob:k":"word-break:keep-all;","wob:l":"word-break:loose;","wob:bs":"word-break:break-strict;","wob:ba":"word-break:break-all;",wos:"word-spacing:|;",wow:"word-wrap:|;","wow:nm":"word-wrap:normal;","wow:n":"word-wrap:none;","wow:u":"word-wrap:unrestricted;","wow:s":"word-wrap:suppress;",lts:"letter-spacing:|;",f:"font:|;","f+":"font:${1:1em} ${2:Arial,sans-serif};",
fw:"font-weight:|;","fw:n":"font-weight:normal;","fw:b":"font-weight:bold;","fw:br":"font-weight:bolder;","fw:lr":"font-weight:lighter;",fs:"font-style:${italic};","fs:n":"font-style:normal;","fs:i":"font-style:italic;","fs:o":"font-style:oblique;",fv:"font-variant:|;","fv:n":"font-variant:normal;","fv:sc":"font-variant:small-caps;",fz:"font-size:|;",fza:"font-size-adjust:|;","fza:n":"font-size-adjust:none;",ff:"font-family:|;","ff:s":"font-family:serif;","ff:ss":"font-family:sans-serif;","ff:c":"font-family:cursive;",
"ff:f":"font-family:fantasy;","ff:m":"font-family:monospace;",fef:"font-effect:|;","fef:n":"font-effect:none;","fef:eg":"font-effect:engrave;","fef:eb":"font-effect:emboss;","fef:o":"font-effect:outline;",fem:"font-emphasize:|;",femp:"font-emphasize-position:|;","femp:b":"font-emphasize-position:before;","femp:a":"font-emphasize-position:after;",fems:"font-emphasize-style:|;","fems:n":"font-emphasize-style:none;","fems:ac":"font-emphasize-style:accent;","fems:dt":"font-emphasize-style:dot;","fems:c":"font-emphasize-style:circle;",
"fems:ds":"font-emphasize-style:disc;",fsm:"font-smooth:|;","fsm:a":"font-smooth:auto;","fsm:n":"font-smooth:never;","fsm:aw":"font-smooth:always;",fst:"font-stretch:|;","fst:n":"font-stretch:normal;","fst:uc":"font-stretch:ultra-condensed;","fst:ec":"font-stretch:extra-condensed;","fst:c":"font-stretch:condensed;","fst:sc":"font-stretch:semi-condensed;","fst:se":"font-stretch:semi-expanded;","fst:e":"font-stretch:expanded;","fst:ee":"font-stretch:extra-expanded;","fst:ue":"font-stretch:ultra-expanded;",
op:"opacity:|;","op:ie":"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);","op:ms":"-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';",rsz:"resize:|;","rsz:n":"resize:none;","rsz:b":"resize:both;","rsz:h":"resize:horizontal;","rsz:v":"resize:vertical;",cur:"cursor:${pointer};","cur:a":"cursor:auto;","cur:d":"cursor:default;","cur:c":"cursor:crosshair;","cur:ha":"cursor:hand;","cur:he":"cursor:help;","cur:m":"cursor:move;","cur:p":"cursor:pointer;","cur:t":"cursor:text;",
pgbb:"page-break-before:|;","pgbb:au":"page-break-before:auto;","pgbb:al":"page-break-before:always;","pgbb:l":"page-break-before:left;","pgbb:r":"page-break-before:right;",pgbi:"page-break-inside:|;","pgbi:au":"page-break-inside:auto;","pgbi:av":"page-break-inside:avoid;",pgba:"page-break-after:|;","pgba:au":"page-break-after:auto;","pgba:al":"page-break-after:always;","pgba:l":"page-break-after:left;","pgba:r":"page-break-after:right;",orp:"orphans:|;",us:"user-select:${none};",wid:"widows:|;",
wfsm:"-webkit-font-smoothing:${antialiased};","wfsm:a":"-webkit-font-smoothing:antialiased;","wfsm:s":"-webkit-font-smoothing:subpixel-antialiased;","wfsm:sa":"-webkit-font-smoothing:subpixel-antialiased;","wfsm:n":"-webkit-font-smoothing:none;"}},html:{filters:"html",profile:"html",snippets:{"!!!":"<!doctype html>","!!!4t":'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',"!!!4s":'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
"!!!xt":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',"!!!xs":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',"!!!xxs":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',c:"<\!-- |${child} --\>","cc:ie6":"<\!--[if lte IE 6]>\n\t${child}|\n<![endif]--\>","cc:ie":"<\!--[if IE]>\n\t${child}|\n<![endif]--\>","cc:noie":"<\!--[if !IE]><\!--\>\n\t${child}|\n<\!--<![endif]--\>"},
abbreviations:{"!":"html:5",a:'<a href="">',"a:link":'<a href="http://|">',"a:mail":'<a href="mailto:|">',abbr:'<abbr title="">',acronym:'<acronym title="">',base:'<base href="" />',bdo:'<bdo dir="">',"bdo:r":'<bdo dir="rtl">',"bdo:l":'<bdo dir="ltr">',link:'<link rel="stylesheet" href="" />',"link:css":'<link rel="stylesheet" href="${1:style}.css" media="all" />',"link:print":'<link rel="stylesheet" href="${1:print}.css" media="print" />',"link:favicon":'<link rel="shortcut icon" type="image/x-icon" href="${1:favicon.ico}" />',
"link:touch":'<link rel="apple-touch-icon" href="${1:favicon.png}" />',"link:rss":'<link rel="alternate" type="application/rss+xml" title="RSS" href="${1:rss.xml}" />',"link:atom":'<link rel="alternate" type="application/atom+xml" title="Atom" href="${1:atom.xml}" />',"meta:utf":'<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />',"meta:win":'<meta http-equiv="Content-Type" content="text/html;charset=windows-1251" />',"meta:vp":'<meta name="viewport" content="width=${1:device-width}, user-scalable=${2:no}, initial-scale=${3:1.0}, maximum-scale=${4:1.0}, minimum-scale=${5:1.0}" />',
"meta:compat":'<meta http-equiv="X-UA-Compatible" content="${1:IE=7}" />',style:"<style>",script:"<script>","script:src":'<script src="">',img:'<img src="" alt="" />',iframe:'<iframe src="" frameborder="0">',embed:'<embed src="" type="" />',object:'<object data="" type="">',param:'<param name="" value="" />',map:'<map name="">',area:'<area shape="" coords="" href="" alt="" />',"area:d":'<area shape="default" href="" alt="" />',"area:c":'<area shape="circle" coords="" href="" alt="" />',"area:r":'<area shape="rect" coords="" href="" alt="" />',
"area:p":'<area shape="poly" coords="" href="" alt="" />',form:'<form action="">',"form:get":'<form action="" method="get">',"form:post":'<form action="" method="post">',label:'<label for="">',input:'<input type="${1:text}" />',inp:'<input type="${1:text}" name="" id="" />',"input:hidden":"input[type=hidden name]","input:h":"input:hidden","input:text":"inp","input:t":"inp","input:search":"inp[type=search]","input:email":"inp[type=email]","input:url":"inp[type=url]","input:password":"inp[type=password]",
"input:p":"input:password","input:datetime":"inp[type=datetime]","input:date":"inp[type=date]","input:datetime-local":"inp[type=datetime-local]","input:month":"inp[type=month]","input:week":"inp[type=week]","input:time":"inp[type=time]","input:number":"inp[type=number]","input:color":"inp[type=color]","input:checkbox":"inp[type=checkbox]","input:c":"input:checkbox","input:radio":"inp[type=radio]","input:r":"input:radio","input:range":"inp[type=range]","input:file":"inp[type=file]","input:f":"input:file",
"input:submit":'<input type="submit" value="" />',"input:s":"input:submit","input:image":'<input type="image" src="" alt="" />',"input:i":"input:image","input:button":'<input type="button" value="" />',"input:b":"input:button","input:reset":"input:button[type=reset]",select:'<select name="" id="">',option:'<option value="">',textarea:'<textarea name="" id="" cols="${1:30}" rows="${2:10}">',"menu:context":"menu[type=context]>","menu:c":"menu:context","menu:toolbar":"menu[type=toolbar]>","menu:t":"menu:toolbar",
video:'<video src="">',audio:'<audio src="">',"html:xml":'<html xmlns="http://www.w3.org/1999/xhtml">',bq:"blockquote",acr:"acronym",fig:"figure",figc:"figcaption",ifr:"iframe",emb:"embed",obj:"object",src:"source",cap:"caption",colg:"colgroup",fst:"fieldset",btn:"button",optg:"optgroup",opt:"option",tarea:"textarea",leg:"legend",sect:"section",art:"article",hdr:"header",ftr:"footer",adr:"address",dlg:"dialog",str:"strong",prog:"progress",fset:"fieldset",datag:"datagrid",datal:"datalist",kg:"keygen",
out:"output",det:"details",cmd:"command",doc:"html>(head>meta[charset=UTF-8]+title{${1:Document}})+body",doc4:'html>(head>meta[http-equiv="Content-Type" content="text/html;charset=${charset}"]+title{${1:Document}})',"html:4t":"!!!4t+doc4[lang=${lang}]","html:4s":"!!!4s+doc4[lang=${lang}]","html:xt":"!!!xt+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]","html:xs":"!!!xs+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]","html:xxs":"!!!xxs+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]",
"html:5":"!!!+doc[lang=${lang}]","ol+":"ol>li","ul+":"ul>li","dl+":"dl>dt+dd","map+":"map>area","table+":"table>tr>td","colgroup+":"colgroup>col","colg+":"colgroup>col","tr+":"tr>td","select+":"select>option","optgroup+":"optgroup>option","optg+":"optgroup>option"}},xml:{"extends":"html",profile:"xml",filters:"html"},xsl:{"extends":"html",profile:"xml",filters:"html, xsl",abbreviations:{tm:'<xsl:template match="" mode="">',tmatch:"tm",tn:'<xsl:template name="">',tname:"tn",call:'<xsl:call-template name=""/>',
ap:'<xsl:apply-templates select="" mode=""/>',api:"<xsl:apply-imports/>",imp:'<xsl:import href=""/>',inc:'<xsl:include href=""/>',ch:"<xsl:choose>","xsl:when":'<xsl:when test="">',wh:"xsl:when",ot:"<xsl:otherwise>","if":'<xsl:if test="">',par:'<xsl:param name="">',pare:'<xsl:param name="" select=""/>',"var":'<xsl:variable name="">',vare:'<xsl:variable name="" select=""/>',wp:'<xsl:with-param name="" select=""/>',key:'<xsl:key name="" match="" use=""/>',elem:'<xsl:element name="">',attr:'<xsl:attribute name="">',
attrs:'<xsl:attribute-set name="">',cp:'<xsl:copy select=""/>',co:'<xsl:copy-of select=""/>',val:'<xsl:value-of select=""/>',each:'<xsl:for-each select="">',"for":"each",tex:"<xsl:text></xsl:text>",com:"<xsl:comment>",msg:'<xsl:message terminate="no">',fall:"<xsl:fallback>",num:'<xsl:number value=""/>',nam:'<namespace-alias stylesheet-prefix="" result-prefix=""/>',pres:'<xsl:preserve-space elements=""/>',strip:'<xsl:strip-space elements=""/>',proc:'<xsl:processing-instruction name="">',sort:'<xsl:sort select="" order=""/>',
"choose+":"xsl:choose>xsl:when+xsl:otherwise",xsl:"!!!+xsl:stylesheet[version=1.0 xmlns:xsl=http://www.w3.org/1999/XSL/Transform]>{\n|}"},snippets:{"!!!":'<?xml version="1.0" encoding="UTF-8"?>'}},haml:{filters:"haml","extends":"html",profile:"xml"},scss:{"extends":"css"},sass:{"extends":"css"},less:{"extends":"css"},stylus:{"extends":"css"}},"system")});
emmet.define("cm-editor-proxy",function(f,d){function h(){if(CodeMirror.version>="3.1")return CodeMirror.Pass;throw CodeMirror.Pass;}var i=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent)||/Mac/.test(navigator.platform),b={"Cmd-E":"expand_abbreviation",Tab:"expand_abbreviation_with_tab","Cmd-D":"match_pair_outward","Shift-Cmd-D":"match_pair_inward","Cmd-T":"matching_pair","Shift-Cmd-A":"wrap_with_abbreviation","Ctrl-Alt-Right":"next_edit_point","Ctrl-Alt-Left":"prev_edit_point",
"Cmd-L":"select_line","Cmd-Shift-M":"merge_lines","Cmd-/":"toggle_comment","Cmd-J":"split_join_tag","Cmd-K":"remove_tag","Shift-Cmd-Y":"evaluate_math_expression","Ctrl-Up":"increment_number_by_1","Ctrl-Down":"decrement_number_by_1","Alt-Up":"increment_number_by_01","Alt-Down":"decrement_number_by_01","Ctrl-Alt-Up":"increment_number_by_10","Ctrl-Alt-Down":"decrement_number_by_10","Shift-Cmd-.":"select_next_item","Shift-Cmd-,":"select_previous_item","Cmd-B":"reflect_css_value",Enter:"insert_formatted_line_break_only"},
c={"text/html":"html","application/xml":"xml","text/xsl":"xsl","text/css":"css","text/x-less":"less"};CodeMirror.defineOption?CodeMirror.defineOption("profile","html"):CodeMirror.defaults.profile="html";var a={context:null,getSelectionRange:function(){var a=this.getCaretPos();return{start:a,end:a+this.getSelection().length}},createSelection:function(a,b){a==b?this.context.setCursor(this.context.posFromIndex(a)):this.context.setSelection(this.context.posFromIndex(a),this.context.posFromIndex(b))},
getCurrentLineRange:function(){var a=this.context.getCursor(!0);return{start:this.context.indexFromPos({line:a.line,ch:0}),end:this.context.indexFromPos({line:a.line,ch:this.context.getLine(a.line).length})}},getCaretPos:function(){return this.context.indexFromPos(this.context.getCursor(!0))},setCaretPos:function(a){this.createSelection(a,a)},getCurrentLine:function(){return this.context.getLine(this.context.getCursor(!0).line)||""},replaceContent:function(a,b,c,h){d.isUndefined(c)&&(c=d.isUndefined(b)?
content.length:b);d.isUndefined(b)&&(b=0);var i=f("utils");h||(a=i.padString(a,i.getLinePaddingFromPosition(this.getContent(),b)));var h=f("tabStops").extract(a,{escape:function(a){return a}}),a=h.text,l=h.tabstops[0];l?(l.start+=b,l.end+=b):l={start:a.length+b,end:a.length+b};var m=this;(this.context.operation||this.context.compoundChange).call(this.context,function(){m.context.replaceRange(a,m.context.posFromIndex(b),m.context.posFromIndex(c));m.createSelection(l.start,l.end)})},getContent:function(){return this.context.getValue()},
getSyntax:function(){var a=this.context.getOption("mode");a in c&&(a=c[a]);return f("actionUtils").detectSyntax(this,a)},getProfileName:function(){return this.context.getOption("profile")?this.context.getOption("profile"):f("actionUtils").detectProfile(this)},prompt:function(a){return prompt(a)},getSelection:function(){return this.context.getSelection()||""},getFilePath:function(){return location.href},setupContext:function(a){this.context=a;var b="\t";a.getOption("indentWithTabs")||(b=f("utils").repeatString(" ",
a.getOption("indentUnit")));f("resources").setVariable("indentation",b)},addAction:function(b,c,d){var n="emmet."+b;CodeMirror.commands[n]||(CodeMirror.commands[n]=function(c){var d;a.setupContext(c);var e;if(e=b=="expand_abbreviation_with_tab")if(!(e=a.getSelection()))e=a.getSyntax(),e=!f("resources").hasSyntax(e);if(e)d=h();else{e=!0;try{var i=f("actions").run(b,a);(b=="next_edit_point"||b=="prev_edit_point")&&c.replaceSelection("");!i&&b=="insert_formatted_line_break_only"&&(e=!1)}catch(j){}e||
(d=h())}return d});if(c){if(!d)if(CodeMirror.keyMap&&CodeMirror.keyMap["default"])d=CodeMirror.keyMap["default"];else{if(!CodeMirror.defaults.extraKeys)CodeMirror.defaults.extraKeys={};d=CodeMirror.defaults.extraKeys}i||(c=c.replace("Cmd","Ctrl"));d&&(d[c]=n)}}};typeof emmetKeymap!="undefined"&&(b=emmetKeymap);d.each(b,function(b,c){a.addAction(b,c)});return a});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1 +0,0 @@
error-log.txt

View File

@@ -1,24 +0,0 @@
Copyright (C) 2013 Matt Pass
Website: mattpass.com
Email: matt@mattpass.com
Twitter: @mattpass
#ICErepo License
##Standard Open Source Initiative MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -1,47 +0,0 @@
ICErepo
=======
Show diffs, push, pull &amp; sync your site and Github repo's.
While Github has a fantastic website, mobile app, desktop app and of course bash system, there's no web based UI I can find to sync your website code with Github repo's or vice versa. That's what ICErepo provides.
Originally intended to be a plugin for ICEcoder (https://github.com/mattpass/ICEcoder), I have decided to make it a standalone lib so it can run by itself or easily be integrated into any existing system.
The aim is a simple UI to view diffs between your server dir's and related Github repo's. This list will consist of new files (those only on server), deleted files (those only on Github) and changed files (files that exist in both places but are different). Files that exist in both locations and the same are not shown to keep things minimalist.
Users can then to pick & choose the files & folder they'd like to commit, provide a title and message, then commit to Github. As each file is synced by the user to match the server it dissapears from the UI list. Alternatively you can pull files & folders from Github to sync your server dir's with the repo itself.
Cool huh?
**Current screnshot:**
<img src="http://www.icecoder.net/images/icerepo.png" alt="ICErepo screenshot">
This lib uses customised & minified versions of these brilliant and time tested repos:
Github API lib: https://github.com/michael/github
JS Diff lib: https://github.com/cemerick/jsdifflib
###Installation
####Step 1: Clone the repo
```
$ git clone git@github:mattpass/ICErepo
```
####Step 2: Enter your auth settings
```
Open settings.php and enter either your Github oauth token or username & password
oauth is recommended here, view http://developer.github.com/v3/oauth/ for info
(If using oauth ensure you have repo scope & your app is granted the URL you'll run under)
```
####Step 3: Enter your repo & server dir settings
```
Also in settings.php, enter the repo & corresponding server paths
Enter 'selected' as a 3rd param next to your default repo/server option to autoload that
Finally, set $_SESSION['userLevel'] to be > 0 with your own login system
Upload ICErepo, visit in a web browser & enjoy
```

View File

@@ -1,99 +0,0 @@
<?php include("settings.php"); ?>
<!DOCTYPE html>
<html>
<head>
<title>ICErepo v <?php echo $version;?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="lib/base64.js"></script>
<script src="lib/github.js"></script>
<script src="lib/difflib.js"></script>
<script src="ice-repo.js"></script>
<link rel="stylesheet" type="text/css" href="ice-repo.css">
</head>
<body>
<?php
// Get a full list of dirs & files and begin sorting using above class & function
$repoPath = explode("@",strClean($_POST['repo']));
$repo = $repoPath[0];
$path = $repoPath[1];
$objectList = new SortingIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST), 'alphasort');
// Finally, we have our ordered list, so display
$i=0;
$dirListArray = $dirSHAArray = $dirTypeArray = array();
foreach ($objectList as $objectRef) {
$fileFolderName = @rtrim(substr(str_replace("\\","/",$objectRef->getPathname()), strlen($path)),"..");
if (!is_dir($path.$fileFolderName)) {
$contents = file_get_contents($path.$fileFolderName);
$finfo = "";
// Determine what to do based on mime type
if (function_exists('finfo_open')) {
$finfoMIME = finfo_open(FILEINFO_MIME_TYPE);
$finfo = finfo_file($finfoMIME, $path.$fileFolderName);
finfo_close($finfoMIME);
} else {
$fileExt = explode(" ",pathinfo($path.$fileFolderName, PATHINFO_EXTENSION));
$fileExt = $fileExt[0];
if (array_search($fileExt,array("coffee","css","htm","html","js","less","md","php","py","rb","ruby","txt","xml"))!==false) {$finfo = "text";};
if (array_search($fileExt,array("gif","jpg","jpeg","png"))!==false) {$finfo = "image";};
}
if (strpos($finfo,"text")===0 || strpos($finfo,"empty")!==false) {
$contents = str_replace("\r","",$contents);
};
$store = "blob ".strlen($contents)."\000".$contents;
$i++;
array_push($dirListArray,ltrim($fileFolderName,"/"));
array_push($dirSHAArray,sha1($store));
$type = is_dir($path.$fileFolderName) ? "dir" : "file";
array_push($dirTypeArray,$type);
}
}
?>
<script>
top.repo = '<?php echo $repo;?>';
top.path = '<?php echo $path;?>';
dirListArray = [<?php echo "'".implode("','", $dirListArray)."'";?>];
dirSHAArray = [<?php echo "'".implode("','", $dirSHAArray)."'";?>];
dirTypeArray = [<?php echo "'".implode("','", $dirTypeArray)."'";?>];
</script>
<div id="compareList" class="mainContainer"></div>
<div id="commitPane" class="commitPane">
<b style='font-size: 18px'>COMMIT CHANGES:</b><br><br>
<form name="fcForm" action="file-control.php?username=<?php echo $username;?>&password=<?php echo $password;?>" target="fileControl" method="POST">
<input type="text" name="title" value="Title..." style="width: 260px; border: 0; background: #f8f8f8; margin-bottom: 10px" onFocus="titleDefault='Title...'; if(this.value==titleDefault) {this.value=''}" onBlur="if(this.value=='') {this.value=titleDefault}"><br>
<textarea name="message" style="width: 260px; height: 180px; border: 0; background: #f8f8f8; margin-bottom: 5px" onFocus="messageDefault='Message...'; if(this.value==messageDefault) {this.value=''}" onBlur="if(this.value=='') {this.value=messageDefault}">Message...</textarea>
<input type="hidden" name="path" value="<?php echo $path; ?>">
<input type="hidden" name="rowID" value="">
<input type="hidden" name="gitRepo" value="<?php echo $repo; ?>">
<input type="hidden" name="repo" value="">
<input type="hidden" name="dir" value="">
<input type="hidden" name="action" value="">
<input type="submit" name="commit" value="Commit changes" onClick="return commitChanges()" style="border: 0; background: #555; color: #fff; cursor: pointer">
</form>
</div>
<div id="infoPane" class="infoPane"></div>
<script>
top.fcFormAlias = document.fcForm;
var github = new Github(<?php
if ($token!="") {
echo '{token: "'.$token.'", auth: "oauth"}';
} else{
echo '{username: "'.$username.'", password: "'.$password.'", auth: "basic"}';
}?>);
repoListArray = [];
repoSHAArray = [];
window.onLoad=gitCommand('repo.show','<?php echo strClean($_POST['repo']);?>');
</script>
<iframe name="fileControl" style="display: none"></iframe>
</body>
</html>

View File

@@ -1,131 +0,0 @@
<?php include("settings.php"); ?>
<?php
//$repoPath = strClean($_POST['repoPath']);
$gitRepo = strClean($_POST['gitRepo']);
$path = strClean($_POST['path']);
$rowID = strClean($_POST['rowID']);
$repo = strClean($_POST['repo']);
$dir = strClean($_POST['dir']);
$action = str_replace("PULL:","",str_replace("SAVEPULLS:","",strClean($_POST['action'])));
$rowIDArray = explode(",",$rowID);
$repoArray = explode(",",$repo);
$dirArray = explode(",",$dir);
$actionArray = explode(",",$action);
?>
<!DOCTYPE html>
<html>
<head>
<title>ICErepo v<?php echo $version;?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="lib/underscore-min.js"></script>
<script src="lib/base64.js"></script>
<script src="lib/github.js"></script>
<script src="lib/difflib.js"></script>
<script src="ice-repo.js"></script>
<link rel="stylesheet" type="text/css" href="ice-repo.css">
</head>
<body>
<script>
fullRepoPath='<?php echo $repo;?>';
gitRepo='<?php echo $gitRepo;?>';
var github = new Github(<?php
if ($token!="") {
echo '{token: "'.$token.'", auth: "oauth"}';
} else{
echo '{username: "'.$username.'", password: "'.$password.'", auth: "basic"}';
}?>);
repoUser = gitRepo.split('/')[0];
repoName = gitRepo.split('/')[1];
filePath = fullRepoPath.replace(repoUser+"/"+repoName+"/","");
var repo = github.getRepo(repoUser,repoName);
</script>
<?php if ($_POST['action']=="view") {?>
<form name="fcForm">
<textarea name="fileContents"><?php echo file_exists($dir) ? htmlentities(file_get_contents($dir)) : ''; ?></textarea>
</form>
<script>
rowID = <?php echo $rowID; ?>;
baseTextName = "Server: <?php echo str_replace($_SERVER['DOCUMENT_ROOT']."/","",$dir);?> ";
newTextName = "Github: <?php echo $repo;?>";
window.onLoad = sendData(baseTextName,newTextName);
</script>
<?php } else if (substr($_POST['action'],0,5)=="PULL:") { ?>
<form name="fcForm" action="file-control.php?username=<?php echo $username;?>&password=<?php echo $password;?>" method="POST">
<?php
echo '<input type="hidden" name="rowID" value="'.$rowID.'">';
echo '<input type="hidden" name="repo" value="'.$repo.'">';
echo '<input type="hidden" name="dir" value="'.$dir.'">';
echo '<input type="hidden" name="action" value="SAVEPULLS:'.$action.'">';
echo '<input type="hidden" name="path" value="'.$path.'">';
for ($i=0;$i<count($rowIDArray);$i++) {
if ($repoArray[$i]!="") {
echo '<textarea name="repoContents'.$rowIDArray[$i].'"></textarea>';
}
}
?>
</form>
<script>
rowIDArray = [<?php echo implode(",", $rowIDArray);?>];
repoArray = [<?php echo "'".implode("','", $repoArray)."'";?>];
dirArray = [<?php echo "'".implode("','", $dirArray)."'";?>];
actionArray = [<?php echo "'".implode("','", $actionArray)."'";?>];
window.onLoad = getData();
</script>
<?php } else if (substr($_POST['action'],0,10)=="SAVEPULLS:") {?>
<script>
<?php
for ($i=0;$i<count($rowIDArray);$i++) {
if ($actionArray[$i]!="new") {
$dirs = explode("/",$repoArray[$i]);
$relDir = "";
for ($j=0;$j<count($dirs)-1;$j++) {
$relDir .= "/".$dirs[$j];
if (!is_dir($path.$relDir)) {
mkdir($path.$relDir, 0755);
}
}
$fh = fopen($path."/".$repoArray[$i], 'w') or die("alert('Sorry, there was a problem pulling ".$repoArray[$i].". Either the file is unavailable on Github or server permissions aren\'t allowing it to be created/updated.');get('loadingMask','top').style.display='none';");
fwrite($fh, $_POST['repoContents'.$rowIDArray[$i]]);
fclose($fh);
echo "hideRow(".$rowIDArray[$i].");top.newCount--;";
} else {
is_dir($dir) ? $success = rmdir($dir) : $success = unlink($dir);
if (!$success) {
echo "alert('Sorry, couldn\'t delete ".$dir."\\n\\n";
echo "Maybe you need to give file permissions for it to be deleted?');";
} else {
echo "hideRow(".$rowIDArray[$i].");top.deletedCount--;";
}
}
}
echo "get('loadingMask','top').style.display = 'none';";
?>
</script>
<?php } else { ?>
<form name="fcForm">
<?php
for ($i=0;$i<count($rowIDArray);$i++) {
if ($dirArray[$i]!="") {
echo '<textarea name="fileContents'.$rowIDArray[$i].'">';
echo htmlentities(file_get_contents($dirArray[$i]));
echo '</textarea>';
}
}
?>
</form>
<script>
rowIDArray = [<?php echo implode(",", $rowIDArray);?>];
repoArray = [<?php echo "'".implode("','", $repoArray)."'";?>];
dirArray = [<?php echo "'".implode("','", $dirArray)."'";?>];
actionArray = [<?php echo "'".implode("','", $actionArray)."'";?>];
window.onLoad = startProcess();
</script>
<?php } ?>
</body>
</html>

View File

@@ -1,100 +0,0 @@
/* First, reset everything to a standard */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
font-family: arial, verdana, helvetica, sans-serif;
border: 0;
margin: 0;
padding: 0;
outline: 0;
font-size: 12px;
vertical-align: top;
}
html, body {background-color: #fff; width: 100%}
p {color: #444}
textarea, input {font-family: arial, verdana, helvetica, sans-serif; padding: 4px}
.header {position: absolute; width: 100%; height: 60px; background: #444; z-index: 1}
.mainContainer {position: relative; display: block; width: 900px; padding: 20px}
.blackMask {position: fixed; display: table; width: 100%; height: 100%; top: 0; left: 0; visibility: hidden; background-color: rgba(0,0,0,0.8); text-align: center; z-index: 100}
.blackMask .popupVCenter {#position: absolute; display: table-cell; #top: 50%; vertical-align: middle; text-align: center}
.popupVCenter .popup {#position: relative; #top: -50%; text-align: center; color: #fff; font-size: 10px}
.whiteGlow {box-shadow: 0 0 8px 2px rgba(255,255,255,0.6)}
.circleOutside {background-color: rgba(0,0,0,0); border:5px solid rgba(0,183,229,0.9); opacity:.9; border-top:5px solid rgba(0,0,0,0); border-left:5px solid rgba(0,0,0,0); border-radius:50px; box-shadow: 0 0 35px #2187e7;
width:50px; height:50px; margin:0 auto; -moz-animation:spin .5s infinite linear; -webkit-animation:spin .5s infinite linear;
}
.circleInside {background-color: rgba(0,0,0,0); border:5px solid rgba(0,183,229,0.9); opacity:.9; border-top:5px solid rgba(0,0,0,0); border-left:5px solid rgba(0,0,0,0); border-radius:50px; box-shadow: 0 0 15px #2187e7;
width:30px; height:30px; margin:0 auto; position:relative; top:-50px; -moz-animation:spinoff .5s infinite linear; -webkit-animation:spinoff .5s infinite linear;
}
@-moz-keyframes spin {
0% {-moz-transform:rotate(0deg)}
100% {-moz-transform:rotate(360deg)}
}
@-moz-keyframes spinoff {
0% {-moz-transform:rotate(0deg)}
100% {-moz-transform:rotate(-360deg)}
}
@-webkit-keyframes spin {
0% {-webkit-transform:rotate(0deg)}
100% {-webkit-transform:rotate(360deg)}
}
@-webkit-keyframes spinoff {
0% {-webkit-transform:rotate(0deg)}
100% {-webkit-transform:rotate(-360deg)}
}
.repoFrame {position: absolute; width: 100%; height: 90%; left: 0px; margin-top: 60px}
.row {position: relative; display: inline-block; background: #ccc; color: #000; width: 880px; padding: 10px 7px; margin-bottom: 2px; cursor: pointer; padding-left: 35px}
.row:hover {background: #888; color: #fff}
.row .icon {display: inline-block; width: 16px; height: 16px; margin-right: 7px; background-image:url('images/file-folder-icons.png'); background-repeat: no-repeat}
.row .checkbox {position: absolute; display: inline-block; height: 38px; width: 30px; top: -4px; left: 0px}
.rowContent {position: relative; display: none; background: #eee; width: 100%; height: 300px; padding: 7px; margin-bottom: 10px; overflow: auto}
.pullGithub {position: absolute; display: inline-block; top: 7px; left: 822px; padding: 5px; background: #bbb; color: #444; font-size: 10px; cursor: pointer}
.pullGithubSel {position: absolute; display: inline-block; top: 7px; left: 822px; margin-top: 12px; margin-left: -22px; padding: 5px; background: #bbb; color: #444; font-size: 10px; cursor: pointer}
.version {position: absolute; display: inline-block; width: 100px; left: 1000px; top: 33px; font-size: 10px; color: #bbb; text-align: right}
.logo {position: absolute; left: 1107px; top: 12px}
.commitPane {position: fixed; background: #ccc; width: 270px; height: 300px; left: 960px; top: 0px; padding: 20px 10px 10px 10px; z-index: 100}
.infoPane {position: fixed; width: 270px; height: 100px; left: 960px; top: 340px; padding: 20px 10px 10px 10px; z-index: 100}
/* Folder */
.ext-folder {background-position: 0 0}
/* Additional file types */
.ext-coffee {background-position: -48px 0}
.ext-css {background-position: -64px 0}
.ext-gif {background-position: -80px 0}
.ext-htm {background-position: -96px 0}
.ext-html {background-position: -96px 0}
.ext-jpg {background-position: -112px 0}
.ext-jpeg {background-position: -112px 0}
.ext-js {background-position: -128px 0}
.ext-less {background-position: -144px 0}
.ext-php {background-position: -160px 0}
.ext-png {background-position: -176px 0}
.ext-rb {background-position: -192px 0}
.ext-rbx {background-position: -192px 0}
.ext-rhtml {background-position: -192px 0}
.ext-ruby {background-position: -192px 0}
.ext-txt {background-position: -208px 0}
.ext-zip {background-position: -224px 0}
.ext-file {background-position: -32px 0}
table.diff {color: #888; border: 0; white-space: pre-wrap}
table.diff tbody th {color:#888; font-size: 11px; font-weight: normal; padding: 2px; vertical-align:top}
table.diff thead th.texttitle {background: #444; color: #fff; text-align:left; padding: 2px}
table.diff tbody td {width: 100%; font-family: Courier, monospace; vertical-align: top}
table.diff .delete {background: #0b0; color: #fff}
table.diff .insert {background: #b00; color: #fff}
table.diff th.author {display: none}

View File

@@ -1,337 +0,0 @@
top.selRowArray = [];
top.selRepoDirArray = [];
top.selActionArray = [];
top.filetypesArray = ['coffee','css','gif','htm','html','jpg','jpeg','js','less','php','png','rb','rbx','rhtml','ruby','txt','zip'];
doRepo = function(repo) {
document.showRepo.repo.value = repo;
document.showRepo.submit();
}
updateSelection = function(elem,row,repoDir,action) {
if (elem.checked) {
top.selRowArray.push(row);
top.selRepoDirArray.push(repoDir);
top.selActionArray.push(action);
} else {
arrayIndex = top.selRowArray.indexOf(row);
top.selRowArray.splice(arrayIndex,1);
top.selRepoDirArray.splice(arrayIndex,1);
top.selActionArray.splice(arrayIndex,1);
};
}
getContent = function(thisRow,path) {
if("undefined" == typeof overOption || !overOption) {
if ("undefined" == typeof lastRow || lastRow!=thisRow || get('row'+thisRow+'Content').innerHTML=="") {
for (i=1;i<=rowID;i++) {
get('row'+i+'Content').innerHTML = "";
get('row'+i+'Content').style.display = "none";
}
repo = top.repo + "/" + path;
dir = top.path + "/" + path;
document.fcForm.rowID.value = thisRow;
document.fcForm.repo.value = repo;
document.fcForm.dir.value = dir;
document.fcForm.action.value = "view";
document.fcForm.submit();
} else {
get('row'+thisRow+'Content').innerHTML = "";
get('row'+thisRow+'Content').style.display = "none";
}
lastRow = thisRow;
}
}
commitChanges = function() {
if(top.selRowArray.length>0) {
if (document.fcForm.title.value!="Title..." && document.fcForm.message.value!="Message...") {
get('loadingMask','top').style.display = "table";
top.selRowValue = "";
top.selDirValue = "";
top.selRepoValue = "";
top.selActionValue = "";
for (i=0;i<top.selRowArray.length;i++) {
top.selRowValue += top.selRowArray[i];
if (top.selActionArray[i]=="changed") {
top.selDirValue += top.selRepoDirArray[i].split('@')[0];
top.selRepoValue += top.selRepoDirArray[i].split('@')[1];
}
if (top.selActionArray[i]=="new") {
top.selDirValue += top.selRepoDirArray[i];
top.selRepoValue += "";
}
if (top.selActionArray[i]=="deleted") {
top.selDirValue += "";
top.selRepoValue += top.selRepoDirArray[i];
}
top.selActionValue += top.selActionArray[i];
if (i<top.selRowArray.length-1) {
top.selRowValue += ",";
top.selDirValue += ",";
top.selRepoValue += ",";
top.selActionValue += ",";
}
}
document.fcForm.rowID.value = top.selRowValue;
document.fcForm.dir.value = top.selDirValue;
document.fcForm.repo.value = top.selRepoValue;
document.fcForm.action.value = top.selActionValue;
document.fcForm.submit();
} else {
alert('Please enter a title & message for the commit');
}
} else {
alert('Please select some files/folders to commit');
}
return false;
}
pullContent = function(thisRow,thisPath,thisRepo,thisAction) {
get('loadingMask','top').style.display = "table";
if (thisRow=="selected") {
top.selRowValue = "";
top.selDirValue = "";
top.selRepoValue = "";
top.selActionValue = "";
for (i=0;i<top.selRowArray.length;i++) {
top.selRowValue += top.selRowArray[i];
if (top.selActionArray[i]=="changed") {
repoUser = top.selRepoDirArray[i].split('@')[1].split('/')[0];
repoName = top.selRepoDirArray[i].split('@')[1].split('/')[1];
top.selDirValue += top.selRepoDirArray[i].split('@')[0];
top.selRepoValue += top.selRepoDirArray[i].split('@')[1].replace(repoUser+"/"+repoName+"/","");
}
if (top.selActionArray[i]=="new") {
top.selDirValue += top.selRepoDirArray[i];
top.selRepoValue += "";
}
if (top.selActionArray[i]=="deleted") {
repoUser = top.selRepoDirArray[i].split('/')[0];
repoName = top.selRepoDirArray[i].split('/')[1];
top.selDirValue += "";
top.selRepoValue += top.selRepoDirArray[i].replace(repoUser+"/"+repoName+"/","");
}
top.selActionValue += top.selActionArray[i];
if (i<top.selRowArray.length-1) {
top.selRowValue += ",";
top.selDirValue += ",";
top.selRepoValue += ",";
top.selActionValue += ",";
}
}
} else {
top.selRowValue = thisRow;
top.selDirValue = thisPath;
top.selRepoValue = thisRepo;
top.selActionValue = thisAction;
}
top.fcFormAlias.rowID.value = top.selRowValue;
top.fcFormAlias.dir.value = top.selDirValue;
top.fcFormAlias.repo.value = top.selRepoValue;
top.fcFormAlias.action.value = "PULL:"+top.selActionValue;
top.fcFormAlias.submit();
}
getData = function() {
if (actionArray[0]!="new") {
repo.read('master', repoArray[0], function(err, data) {
document.fcForm['repoContents'+rowIDArray[0]].innerHTML=data;
if(!err) {
removeFirstArrayItems();
rowIDArray.length>0 ? getData() : document.fcForm.submit();
} else {
alert('Sorry, there was an error reading '+repoArray[0]);
}
});
} else {
removeFirstArrayItems();
rowIDArray.length>0 ? getData() : document.fcForm.submit();
}
}
sendData = function(baseTextName,newTextName) {
repo.read('master', filePath, function(err, data) {
dirContent = document.fcForm.fileContents.value;
repoContent = data;
diffUsingJS(dirContent,repoContent,baseTextName,newTextName);
get("row"+rowID+"Content","parent").style.display = "inline-block";
});
}
removeFirstArrayItems = function() {
rowIDArray.splice(0,1);
repoArray.splice(0,1);
dirArray.splice(0,1);
actionArray.splice(0,1);
}
hideRow = function(row) {
top.rowCount--;
updateInfo('parent');
get('checkbox'+row,'parent').checked=false;
parent.updateSelection(get('checkbox'+row,'parent'));
get('row'+row,'parent').style.display = get('row'+row+'Content','parent').style.display = "none";
}
function diffUsingJS (dirContent,repoContent,baseTextName,newTextName) {
var base = difflib.stringAsLines(dirContent ? dirContent : '');
var newtxt = difflib.stringAsLines(repoContent ? repoContent : '');
var sm = new difflib.SequenceMatcher(base, newtxt);
var opcodes = sm.get_opcodes();
var diffoutputdiv = get("row"+rowID+"Content","parent");
while (diffoutputdiv.firstChild) diffoutputdiv.removeChild(diffoutputdiv.firstChild);
var contextSize = ""; // optional
contextSize = contextSize ? contextSize : null;
diffoutputdiv.appendChild(
diffview.buildView(
{
baseTextLines:base,
newTextLines:newtxt,
opcodes:opcodes,
baseTextName:baseTextName,
newTextName:newTextName,
contextSize:contextSize,
viewType: 1 // 0 = side by side, 1 = inline
}
)
)
}
// Add or Update files...
ffAddOrUpdate = function(row,gitRepo,action) {
repo.write('master', gitRepo, document.fcForm['fileContents'+row].value,parent.document.fcForm.title.value+ '\n\n'+parent.document.fcForm.message.value, function(err) {
if(!err) {
removeFirstArrayItems();
hideRow(row);
top.newCount--;
rowIDArray.length>0 ? startProcess() : get('loadingMask','top').style.display = "none";
} else {
alert('Sorry, there was an error adding '+gitRepo);
}
});
}
// Delete files...
ffDelete = function(row,gitRepo,action) {
repo.remove('master', gitRepo, function(err) {
if(!err) {
removeFirstArrayItems();
hideRow(row);
top.deletedCount--;
rowIDArray.length>0 ? startProcess() : get('loadingMask','top').style.display = "none";
} else {
alert('Sorry, there was an error deleting '+gitRepo);
}
});
}
startProcess = function() {
if(actionArray[0]=="changed"||actionArray[0]=="new") {
if(actionArray[0]=="changed") {repoLoc = repoArray[0].replace(repoUser+"/"+repoName+"/","")}
if(actionArray[0]=="new") {repoLoc = dirArray[0].replace(top.path+"/",'')}
ffAddOrUpdate(rowIDArray[0],repoLoc,actionArray[0]);
}
if(actionArray[0]=="deleted") {
repoLoc = repoArray[0].replace(repoUser+"/"+repoName+"/","");
ffDelete(rowIDArray[0],repoLoc,actionArray[0]);
}
}
get = function(elem,context) {
return context ? window[context].document.getElementById(elem) : document.getElementById(elem);
}
updateInfo = function(context) {
get('infoPane',context).innerHTML = "<b style='font-size: 18px'>INFO:</b><br><br><b>"+top.rowCount+" files</b><br><br>"+top.changedCount+" changed<br>"+top.newCount+" new<br>"+top.deletedCount+" deleted";
}
gitCommand = function(comm,value) {
if (comm=="repo.show") {
userRepo = value.split("@")[0].split("/");
dir = value.split("@")[1];
var repo = github.getRepo(userRepo[0],userRepo[1]);
rowID = 0;
repo.getTree('master?recursive=true', function(err, tree) {
for (i=0;i<tree.length;i++) {
repoListArray.push(tree[i].path);
repoSHAArray.push(tree[i].sha);
}
var c = "", n = "", d = "";
top.rowCount=0, top.changedCount=0, top.newCount=0, top.deletedCount=0;
for (i=0;i<dirListArray.length;i++) {
repoArrayPos = repoListArray.indexOf(dirListArray[i]);
ext = dirTypeArray[i]=="dir"
? "folder"
: dirListArray[i].substr(dirListArray[i].lastIndexOf('.')+1);
if (repoArrayPos == "-1") {
rowID++;
sE = ext == 'folder' ? ' style="cursor: default"' : '';
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+dirListArray[i]+'\')"' : '';
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+dirListArray[i]+'\',\''+dirListArray[i]+'\',\'new\')"';
n += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
n += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.path+"/"+dirListArray[i]+"\",\"new\")'>";
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
n += "<div class='icon ext-"+ext+"'></div>"+dirListArray[i];
n += "<div class='pullGithub' style='left: 815px' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Delete from server</div><br>";
n += "</div>";
n += "<span class='rowContent' id='row"+rowID+"Content'></span>";
top.rowCount++;
top.newCount++;
} else if (dirTypeArray[i] == "file" && dirSHAArray[i] != repoSHAArray[repoArrayPos]) {
rowID++;
sE = ext == 'folder' ? ' style="cursor: default"' : '';
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+dirListArray[i]+'\')"' : '';
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+dirListArray[i]+'\',\''+dirListArray[i]+'\',\'changed\')"';
c += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
c += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.path+"/"+dirListArray[i]+"@"+top.repo+"/"+dirListArray[i]+"\",\"changed\")'>";
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
c += "<div class='icon ext-"+ext+"'></div>"+dirListArray[i];
c += "<div class='pullGithub' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Pull from Github</div><br>";
c += "</div>";
c += "<span class='rowContent' id='row"+rowID+"Content'></span>";
top.rowCount++;
top.changedCount++;
}
}
for (i=0;i<repoListArray.length;i++) {
dirArrayPos = dirListArray.indexOf(repoListArray[i]);
ext = repoListArray[i].lastIndexOf('/') > repoListArray[i].lastIndexOf('.')
? "folder"
: repoListArray[i].substr(repoListArray[i].lastIndexOf('.')+1);
if (dirArrayPos == "-1") {
rowID++;
sE = ext == 'folder' ? ' style="cursor: default"' : '';
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+repoListArray[i]+'\')"' : '';
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+repoListArray[i]+'\',\''+repoListArray[i]+'\',\'deleted\')"';
d += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
d += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.repo+"/"+repoListArray[i]+"\",\"deleted\")'>";
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
d += "<div class='icon ext-"+ext+"'></div>"+repoListArray[i];
d += "<div class='pullGithub' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Pull from Github</div><br>";
d += "</div>";
d += "<span class='rowContent' id='row"+rowID+"Content'></span>";
top.rowCount++;
top.deletedCount++;
}
}
c = "<b style='font-size: 18px'>CHANGED FILES:</b><br><br>"+c;
n = "<b style='font-size: 18px'>NEW FILES:</b><br><br>"+n;
d = "<b style='font-size: 18px'>DELETED FILES:</b><br><br>"+d
get('compareList').innerHTML = c+"<br><br>"+n+"<br><br>"+d;
updateInfo();
get('loadingMask','top').style.display='none';
}
)
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,71 +0,0 @@
<?php include("settings.php"); ?>
<!DOCTYPE html>
<html>
<head>
<title>ICErepo v <?php echo $version;?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="lib/base64.js"></script>
<script src="lib/github.js"></script>
<script src="ice-repo.js"></script>
<link rel="stylesheet" type="text/css" href="ice-repo.css">
</head>
<?php
if (isset($_GET['sessionLogin'])) {
?>
<form name="sessionLogin" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="POST">
<b>Token:</b><br>
<input type="text" name="token">
<br><br>
or:<br><br>
<b>Username:</b><br>
<input type="text" name="username"><br>
<b>Password:</b><br>
<input type="password" name="password"><br>
<input type="submit">
</form>
<?php
} else {
?>
<body style="margin: 0; overflow: hidden" onLoad="doRepo(get('repos').value)">
<div id="loadingMask" class="blackMask" style="visibility: visible" onContextMenu="return false">
<div class="popupVCenter">
<div class="popup">
<div class="circleOutside"></div>
<div class="circleInside"></div>
&nbsp;&nbsp;&nbsp;working...
</div>
</div>
</div>
<div class="header">
<select name="repos" id="repos" onChange="doRepo(this.value)" style="margin: 20px 0 0 20px">
<?php
for ($i=0;$i<count($repos);$i+=3) {
echo '<option id="repo'.($i/3).'" value="'.$repos[$i].'@'.$repos[$i+1].'"';
echo $repos[$i+2]=="selected" ? ' selected' : '';
echo '>'.$repos[$i]."</option>\n";
}
?>
</select>
<div class="pullGithubSel" onClick="pullContent('selected')">Pull selected from Github</div>
<div class="version"><?php echo $version;?></div>
<img src="images/ice-repo.gif" alt="ICErepo" class="logo">
</div>
<form name="showRepo" action="contents.php?username=<?php echo $username;?>&password=<?php echo $password;?>" target="repo" method="POST">
<input type="hidden" name="repo" value="">
</form>
<iframe id="repo" class="repoFrame" frameborder="0"></iframe>
<?php
;};
?>
</body>
</html>

View File

@@ -1,5 +0,0 @@
// This code was written by Tyler Akins and has been placed in the
// public domain. It would be nice if you left this header intact.
// Base64 code from Tyler Akins -- http://rumkin.com
var Base64=function(){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",t={encode:function(t){var n="",r,i,s,o,u,a,f,l=0;do r=t.charCodeAt(l++),i=t.charCodeAt(l++),s=t.charCodeAt(l++),o=r>>2,u=(r&3)<<4|i>>4,a=(i&15)<<2|s>>6,f=s&63,isNaN(i)?a=f=64:isNaN(s)&&(f=64),n=n+e.charAt(o)+e.charAt(u)+e.charAt(a)+e.charAt(f);while(l<t.length);return n},decode:function(t){var n="",r,i,s,o,u,a,f,l=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(l++)),u=e.indexOf(t.charAt(l++)),a=e.indexOf(t.charAt(l++)),f=e.indexOf(t.charAt(l++)),r=o<<2|u>>4,i=(u&15)<<4|a>>2,s=(a&3)<<6|f,n+=String.fromCharCode(r),a!=64&&(n+=String.fromCharCode(i)),f!=64&&(n+=String.fromCharCode(s));while(l<t.length);return n}};return t}();window.Base64=Base64

View File

@@ -1,576 +0,0 @@
/***
This is part of jsdifflib v1.0. <http://snowtide.com/jsdifflib>
Copyright (c) 2007, Snowtide Informatics Systems, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the Snowtide Informatics Systems nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
/* Author: Chas Emerick <cemerick@snowtide.com> */
__whitespace = {" ":true, "\t":true, "\n":true, "\f":true, "\r":true};
difflib = {
defaultJunkFunction: function (c) {
return __whitespace.hasOwnProperty(c);
},
stripLinebreaks: function (str) { return str.replace(/^[\n\r]*|[\n\r]*$/g, ""); },
stringAsLines: function (str) {
var lfpos = str.indexOf("\n");
var crpos = str.indexOf("\r");
var linebreak = ((lfpos > -1 && crpos > -1) || crpos < 0) ? "\n" : "\r";
var lines = str.split(linebreak);
for (var i = 0; i < lines.length; i++) {
lines[i] = difflib.stripLinebreaks(lines[i]);
}
return lines;
},
// iteration-based reduce implementation
__reduce: function (func, list, initial) {
if (initial != null) {
var value = initial;
var idx = 0;
} else if (list) {
var value = list[0];
var idx = 1;
} else {
return null;
}
for (; idx < list.length; idx++) {
value = func(value, list[idx]);
}
return value;
},
// comparison function for sorting lists of numeric tuples
__ntuplecomp: function (a, b) {
var mlen = Math.max(a.length, b.length);
for (var i = 0; i < mlen; i++) {
if (a[i] < b[i]) return -1;
if (a[i] > b[i]) return 1;
}
return a.length == b.length ? 0 : (a.length < b.length ? -1 : 1);
},
__calculate_ratio: function (matches, length) {
return length ? 2.0 * matches / length : 1.0;
},
// returns a function that returns true if a key passed to the returned function
// is in the dict (js object) provided to this function; replaces being able to
// carry around dict.has_key in python...
__isindict: function (dict) {
return function (key) { return dict.hasOwnProperty(key); };
},
// replacement for python's dict.get function -- need easy default values
__dictget: function (dict, key, defaultValue) {
return dict.hasOwnProperty(key) ? dict[key] : defaultValue;
},
SequenceMatcher: function (a, b, isjunk) {
this.set_seqs = function (a, b) {
this.set_seq1(a);
this.set_seq2(b);
}
this.set_seq1 = function (a) {
if (a == this.a) return;
this.a = a;
this.matching_blocks = this.opcodes = null;
}
this.set_seq2 = function (b) {
if (b == this.b) return;
this.b = b;
this.matching_blocks = this.opcodes = this.fullbcount = null;
this.__chain_b();
}
this.__chain_b = function () {
var b = this.b;
var n = b.length;
var b2j = this.b2j = {};
var populardict = {};
for (var i = 0; i < b.length; i++) {
var elt = b[i];
if (b2j.hasOwnProperty(elt)) {
var indices = b2j[elt];
if (n >= 200 && indices.length * 100 > n) {
populardict[elt] = 1;
delete b2j[elt];
} else {
indices.push(i);
}
} else {
b2j[elt] = [i];
}
}
for (var elt in populardict) {
if (populardict.hasOwnProperty(elt)) {
delete b2j[elt];
}
}
var isjunk = this.isjunk;
var junkdict = {};
if (isjunk) {
for (var elt in populardict) {
if (populardict.hasOwnProperty(elt) && isjunk(elt)) {
junkdict[elt] = 1;
delete populardict[elt];
}
}
for (var elt in b2j) {
if (b2j.hasOwnProperty(elt) && isjunk(elt)) {
junkdict[elt] = 1;
delete b2j[elt];
}
}
}
this.isbjunk = difflib.__isindict(junkdict);
this.isbpopular = difflib.__isindict(populardict);
}
this.find_longest_match = function (alo, ahi, blo, bhi) {
var a = this.a;
var b = this.b;
var b2j = this.b2j;
var isbjunk = this.isbjunk;
var besti = alo;
var bestj = blo;
var bestsize = 0;
var j = null;
var j2len = {};
var nothing = [];
for (var i = alo; i < ahi; i++) {
var newj2len = {};
var jdict = difflib.__dictget(b2j, a[i], nothing);
for (var jkey in jdict) {
if (jdict.hasOwnProperty(jkey)) {
j = jdict[jkey];
if (j < blo) continue;
if (j >= bhi) break;
newj2len[j] = k = difflib.__dictget(j2len, j - 1, 0) + 1;
if (k > bestsize) {
besti = i - k + 1;
bestj = j - k + 1;
bestsize = k;
}
}
}
j2len = newj2len;
}
while (besti > alo && bestj > blo && !isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) {
besti--;
bestj--;
bestsize++;
}
while (besti + bestsize < ahi && bestj + bestsize < bhi &&
!isbjunk(b[bestj + bestsize]) &&
a[besti + bestsize] == b[bestj + bestsize]) {
bestsize++;
}
while (besti > alo && bestj > blo && isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) {
besti--;
bestj--;
bestsize++;
}
while (besti + bestsize < ahi && bestj + bestsize < bhi && isbjunk(b[bestj + bestsize]) &&
a[besti + bestsize] == b[bestj + bestsize]) {
bestsize++;
}
return [besti, bestj, bestsize];
}
this.get_matching_blocks = function () {
if (this.matching_blocks != null) return this.matching_blocks;
var la = this.a.length;
var lb = this.b.length;
var queue = [[0, la, 0, lb]];
var matching_blocks = [];
var alo, ahi, blo, bhi, qi, i, j, k, x;
while (queue.length) {
qi = queue.pop();
alo = qi[0];
ahi = qi[1];
blo = qi[2];
bhi = qi[3];
x = this.find_longest_match(alo, ahi, blo, bhi);
i = x[0];
j = x[1];
k = x[2];
if (k) {
matching_blocks.push(x);
if (alo < i && blo < j)
queue.push([alo, i, blo, j]);
if (i+k < ahi && j+k < bhi)
queue.push([i + k, ahi, j + k, bhi]);
}
}
matching_blocks.sort(difflib.__ntuplecomp);
var i1 = j1 = k1 = block = 0;
var non_adjacent = [];
for (var idx in matching_blocks) {
if (matching_blocks.hasOwnProperty(idx)) {
block = matching_blocks[idx];
i2 = block[0];
j2 = block[1];
k2 = block[2];
if (i1 + k1 == i2 && j1 + k1 == j2) {
k1 += k2;
} else {
if (k1) non_adjacent.push([i1, j1, k1]);
i1 = i2;
j1 = j2;
k1 = k2;
}
}
}
if (k1) non_adjacent.push([i1, j1, k1]);
non_adjacent.push([la, lb, 0]);
this.matching_blocks = non_adjacent;
return this.matching_blocks;
}
this.get_opcodes = function () {
if (this.opcodes != null) return this.opcodes;
var i = 0;
var j = 0;
var answer = [];
this.opcodes = answer;
var block, ai, bj, size, tag;
var blocks = this.get_matching_blocks();
for (var idx in blocks) {
if (blocks.hasOwnProperty(idx)) {
block = blocks[idx];
ai = block[0];
bj = block[1];
size = block[2];
tag = '';
if (i < ai && j < bj) {
tag = 'replace';
} else if (i < ai) {
tag = 'delete';
} else if (j < bj) {
tag = 'insert';
}
if (tag) answer.push([tag, i, ai, j, bj]);
i = ai + size;
j = bj + size;
if (size) answer.push(['equal', ai, i, bj, j]);
}
}
return answer;
}
// this is a generator function in the python lib, which of course is not supported in javascript
// the reimplementation builds up the grouped opcodes into a list in their entirety and returns that.
this.get_grouped_opcodes = function (n) {
if (!n) n = 3;
var codes = this.get_opcodes();
if (!codes) codes = [["equal", 0, 1, 0, 1]];
var code, tag, i1, i2, j1, j2;
if (codes[0][0] == 'equal') {
code = codes[0];
tag = code[0];
i1 = code[1];
i2 = code[2];
j1 = code[3];
j2 = code[4];
codes[0] = [tag, Math.max(i1, i2 - n), i2, Math.max(j1, j2 - n), j2];
}
if (codes[codes.length - 1][0] == 'equal') {
code = codes[codes.length - 1];
tag = code[0];
i1 = code[1];
i2 = code[2];
j1 = code[3];
j2 = code[4];
codes[codes.length - 1] = [tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)];
}
var nn = n + n;
var groups = [];
for (var idx in codes) {
if (codes.hasOwnProperty(idx)) {
code = codes[idx];
tag = code[0];
i1 = code[1];
i2 = code[2];
j1 = code[3];
j2 = code[4];
if (tag == 'equal' && i2 - i1 > nn) {
groups.push([tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]);
i1 = Math.max(i1, i2-n);
j1 = Math.max(j1, j2-n);
}
groups.push([tag, i1, i2, j1, j2]);
}
}
if (groups && groups[groups.length - 1][0] == 'equal') groups.pop();
return groups;
}
this.ratio = function () {
matches = difflib.__reduce(
function (sum, triple) { return sum + triple[triple.length - 1]; },
this.get_matching_blocks(), 0);
return difflib.__calculate_ratio(matches, this.a.length + this.b.length);
}
this.quick_ratio = function () {
var fullbcount, elt;
if (this.fullbcount == null) {
this.fullbcount = fullbcount = {};
for (var i = 0; i < this.b.length; i++) {
elt = this.b[i];
fullbcount[elt] = difflib.__dictget(fullbcount, elt, 0) + 1;
}
}
fullbcount = this.fullbcount;
var avail = {};
var availhas = difflib.__isindict(avail);
var matches = numb = 0;
for (var i = 0; i < this.a.length; i++) {
elt = this.a[i];
if (availhas(elt)) {
numb = avail[elt];
} else {
numb = difflib.__dictget(fullbcount, elt, 0);
}
avail[elt] = numb - 1;
if (numb > 0) matches++;
}
return difflib.__calculate_ratio(matches, this.a.length + this.b.length);
}
this.real_quick_ratio = function () {
var la = this.a.length;
var lb = this.b.length;
return _calculate_ratio(Math.min(la, lb), la + lb);
}
this.isjunk = isjunk ? isjunk : difflib.defaultJunkFunction;
this.a = this.b = null;
this.set_seqs(a, b);
}
}
diffview = {
/**
* Builds and returns a visual diff view. The single parameter, `params', should contain
* the following values:
*
* - baseTextLines: the array of strings that was used as the base text input to SequenceMatcher
* - newTextLines: the array of strings that was used as the new text input to SequenceMatcher
* - opcodes: the array of arrays returned by SequenceMatcher.get_opcodes()
* - baseTextName: the title to be displayed above the base text listing in the diff view; defaults
* to "Base Text"
* - newTextName: the title to be displayed above the new text listing in the diff view; defaults
* to "New Text"
* - contextSize: the number of lines of context to show around differences; by default, all lines
* are shown
* - viewType: if 0, a side-by-side diff view is generated (default); if 1, an inline diff view is
* generated
*/
buildView: function (params) {
var baseTextLines = params.baseTextLines;
var newTextLines = params.newTextLines;
var opcodes = params.opcodes;
var baseTextName = params.baseTextName ? params.baseTextName : "Base Text";
var newTextName = params.newTextName ? params.newTextName : "New Text";
var contextSize = params.contextSize;
var inline = (params.viewType == 0 || params.viewType == 1) ? params.viewType : 0;
if (baseTextLines == null)
throw "Cannot build diff view; baseTextLines is not defined.";
if (newTextLines == null)
throw "Cannot build diff view; newTextLines is not defined.";
if (!opcodes)
throw "Canno build diff view; opcodes is not defined.";
function celt (name, clazz) {
var e = document.createElement(name);
e.className = clazz;
return e;
}
function telt (name, text) {
var e = document.createElement(name);
e.appendChild(document.createTextNode(text));
return e;
}
function ctelt (name, clazz, text) {
var e = document.createElement(name);
e.className = clazz;
e.appendChild(document.createTextNode(text));
return e;
}
var tdata = document.createElement("thead");
var node = document.createElement("tr");
tdata.appendChild(node);
if (inline) {
node.appendChild(document.createElement("th"));
node.appendChild(document.createElement("th"));
node.appendChild(ctelt("th", "texttitle", baseTextName + " vs. " + newTextName));
} else {
node.appendChild(document.createElement("th"));
node.appendChild(ctelt("th", "texttitle", baseTextName));
node.appendChild(document.createElement("th"));
node.appendChild(ctelt("th", "texttitle", newTextName));
}
tdata = [tdata];
var rows = [];
var node2;
/**
* Adds two cells to the given row; if the given row corresponds to a real
* line number (based on the line index tidx and the endpoint of the
* range in question tend), then the cells will contain the line number
* and the line of text from textLines at position tidx (with the class of
* the second cell set to the name of the change represented), and tidx + 1 will
* be returned. Otherwise, tidx is returned, and two empty cells are added
* to the given row.
*/
function addCells (row, tidx, tend, textLines, change) {
if (tidx < tend) {
row.appendChild(telt("th", (tidx + 1).toString()));
row.appendChild(ctelt("td", change, textLines[tidx].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0")));
return tidx + 1;
} else {
row.appendChild(document.createElement("th"));
row.appendChild(celt("td", "empty"));
return tidx;
}
}
function addCellsInline (row, tidx, tidx2, textLines, change) {
row.appendChild(telt("th", tidx == null ? "" : (tidx + 1).toString()));
row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString()));
row.appendChild(ctelt("td", change, textLines[tidx != null ? tidx : tidx2].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0")));
}
for (var idx = 0; idx < opcodes.length; idx++) {
code = opcodes[idx];
change = code[0];
var b = code[1];
var be = code[2];
var n = code[3];
var ne = code[4];
var rowcnt = Math.max(be - b, ne - n);
var toprows = [];
var botrows = [];
for (var i = 0; i < rowcnt; i++) {
// jump ahead if we've alredy provided leading context or if this is the first range
if (contextSize && opcodes.length > 1 && ((idx > 0 && i == contextSize) || (idx == 0 && i == 0)) && change=="equal") {
var jump = rowcnt - ((idx == 0 ? 1 : 2) * contextSize);
if (jump > 1) {
toprows.push(node = document.createElement("tr"));
b += jump;
n += jump;
i += jump - 1;
node.appendChild(telt("th", "..."));
if (!inline) node.appendChild(ctelt("td", "skip", ""));
node.appendChild(telt("th", "..."));
node.appendChild(ctelt("td", "skip", ""));
// skip last lines if they're all equal
if (idx + 1 == opcodes.length) {
break;
} else {
continue;
}
}
}
toprows.push(node = document.createElement("tr"));
if (inline) {
if (change == "insert") {
addCellsInline(node, null, n++, newTextLines, change);
} else if (change == "replace") {
botrows.push(node2 = document.createElement("tr"));
if (b < be) addCellsInline(node, b++, null, baseTextLines, "delete");
if (n < ne) addCellsInline(node2, null, n++, newTextLines, "insert");
} else if (change == "delete") {
addCellsInline(node, b++, null, baseTextLines, change);
} else {
// equal
addCellsInline(node, b++, n++, baseTextLines, change);
}
} else {
b = addCells(node, b, be, baseTextLines, change);
n = addCells(node, n, ne, newTextLines, change);
}
}
for (var i = 0; i < toprows.length; i++) rows.push(toprows[i]);
for (var i = 0; i < botrows.length; i++) rows.push(botrows[i]);
}
rows.push(node = ctelt("th", "author", "diff view generated by "));
node.setAttribute("colspan", inline ? 3 : 4);
node.appendChild(node2 = telt("a", "jsdifflib"));
node2.setAttribute("href", "http://github.com/cemerick/jsdifflib");
tdata.push(node = document.createElement("tbody"));
for (var idx in rows) node.appendChild(rows[idx]);
node = celt("table", "diff" + (inline ? " inlinediff" : ""));
for (var idx in tdata) node.appendChild(tdata[idx]);
return node;
}
}

View File

@@ -1,396 +0,0 @@
// This file contains the HTTP Req Abs, Repo API and getRepo
// portions of Top Level API from github.com/michael/github.js
// ORIGINAL LIB:
// Github.js 0.7.0
// (c) 2012 Michael Aufreiter, Development Seed
// Github.js is freely distributable under the MIT license.
// For all details and documentation:
// http://substance.io/michael/github
(function() {
var Github;
var API_URL = 'https://api.github.com';
Github = window.Github = function(options) {
// HTTP Request Abstraction
// =======
//
// I'm not proud of this and neither should you be if you were responsible for the XMLHttpRequest spec.
function _request(method, path, data, cb, raw) {
function getURL() {
var url = API_URL + path;
return url + ((/\?/).test(url) ? "&" : "?") + (new Date()).getTime();
}
var xhr = new XMLHttpRequest();
if (!raw) {xhr.dataType = "json"}
xhr.open(method, getURL());
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
if (this.status >= 200 && this.status < 300 || this.status === 304) {
cb(null, raw ? this.responseText : this.responseText ? JSON.parse(this.responseText) : true);
} else {
cb({request: this, error: this.status});
}
}
}
xhr.setRequestHeader('Accept','application/vnd.github.raw');
xhr.setRequestHeader('Content-Type','application/json;charset=UTF-8');
if (
(options.auth == 'oauth' && options.token) ||
(options.auth == 'basic' && options.username && options.password)
) {
xhr.setRequestHeader('Authorization',options.auth == 'oauth'
? 'token '+ options.token
: 'Basic ' + Base64.encode(options.username + ':' + options.password)
);
}
data ? xhr.send(JSON.stringify(data)) : xhr.send();
}
// Repository API
// =======
Github.Repository = function(options) {
var repo = options.name;
var user = options.user;
var that = this;
var repoPath = "/repos/" + user + "/" + repo;
var currentTree = {
"branch": null,
"sha": null
};
// Uses the cache if branch has not been changed
// -------
function updateTree(branch, cb) {
if (branch === currentTree.branch && currentTree.sha) return cb(null, currentTree.sha);
that.getRef("heads/"+branch, function(err, sha) {
currentTree.branch = branch;
currentTree.sha = sha;
cb(err, sha);
});
}
// Get a particular reference
// -------
this.getRef = function(ref, cb) {
_request("GET", repoPath + "/git/refs/" + ref, null, function(err, res) {
if (err) return cb(err);
cb(null, res.object.sha);
});
};
// Create a new reference
// --------
//
// {
// "ref": "refs/heads/my-new-branch-name",
// "sha": "827efc6d56897b048c772eb4087f854f46256132"
// }
this.createRef = function(options, cb) {
_request("POST", repoPath + "/git/refs", options, cb);
};
// Delete a reference
// --------
//
// repo.deleteRef('heads/gh-pages')
// repo.deleteRef('tags/v1.0')
this.deleteRef = function(ref, cb) {
_request("DELETE", repoPath + "/git/refs/"+ref, options, cb);
};
// List all branches of a repository
// -------
this.listBranches = function(cb) {
_request("GET", repoPath + "/git/refs/heads", null, function(err, heads) {
if (err) return cb(err);
cb(null, _.map(heads, function(head) { return _.last(head.ref.split('/')); }));
});
};
// Retrieve the contents of a blob
// -------
this.getBlob = function(sha, cb) {
_request("GET", repoPath + "/git/blobs/" + sha, null, cb, 'raw');
};
// For a given file path, get the corresponding sha (blob for files, tree for dirs)
// -------
this.getSha = function(branch, path, cb) {
// Just use head if path is empty
if (path === "") return that.getRef("heads/"+branch, cb);
that.getTree(branch+"?recursive=true", function(err, tree) {
var file = _.select(tree, function(file) {
return file.path === path;
})[0];
cb(null, file ? file.sha : null);
});
};
// Retrieve the tree a commit points to
// -------
this.getTree = function(tree, cb) {
_request("GET", repoPath + "/git/trees/"+tree, null, function(err, res) {
if (err) return cb(err);
cb(null, res.tree);
});
};
// Post a new blob object, getting a blob SHA back
// -------
this.postBlob = function(content, cb) {
if (typeof(content) === "string") {
content = {
"content": content,
"encoding": "utf-8"
};
}
_request("POST", repoPath + "/git/blobs", content, function(err, res) {
if (err) return cb(err);
cb(null, res.sha);
});
};
// Update an existing tree adding a new blob object getting a tree SHA back
// -------
this.updateTree = function(baseTree, path, blob, cb) {
var data = {
"base_tree": baseTree,
"tree": [
{
"path": path,
"mode": "100644",
"type": "blob",
"sha": blob
}
]
};
_request("POST", repoPath + "/git/trees", data, function(err, res) {
if (err) return cb(err);
cb(null, res.sha);
});
};
// Post a new tree object having a file path pointer replaced
// with a new blob SHA getting a tree SHA back
// -------
this.postTree = function(tree, cb) {
_request("POST", repoPath + "/git/trees", { "tree": tree }, function(err, res) {
if (err) return cb(err);
cb(null, res.sha);
});
};
// Create a new commit object with the current commit SHA as the parent
// and the new tree SHA, getting a commit SHA back
// -------
this.commit = function(parent, tree, message, cb) {
var data = {
"message": message,
"author": {
"name": options.username
},
"parents": [
parent
],
"tree": tree
};
_request("POST", repoPath + "/git/commits", data, function(err, res) {
currentTree.sha = res.sha; // update latest commit
if (err) return cb(err);
cb(null, res.sha);
});
};
// Update the reference of your head to point to the new commit SHA
// -------
this.updateHead = function(head, commit, cb) {
_request("PATCH", repoPath + "/git/refs/heads/" + head, { "sha": commit }, function(err, res) {
cb(err);
});
};
// Show repository information
// -------
this.show = function(cb) {
_request("GET", repoPath, null, cb);
};
// Get contents
// --------
this.contents = function(path, cb) {
_request("GET", repoPath + "/contents", { path: path }, cb);
};
// Fork repository
// -------
this.fork = function(cb) {
_request("POST", repoPath + "/forks", null, cb);
};
// Create pull request
// --------
this.createPullRequest = function(options, cb) {
_request("POST", repoPath + "/pulls", options, cb);
};
// Read file at given path
// -------
this.read = function(branch, path, cb) {
that.getSha(branch, path, function(err, sha) {
if (!sha) return cb("not found", null);
that.getBlob(sha, function(err, content) {
cb(err, content, sha);
});
});
};
// Remove a file from the tree
// -------
this.remove = function(branch, path, cb) {
updateTree(branch, function(err, latestCommit) {
that.getTree(latestCommit+"?recursive=true", function(err, tree) {
// Update Tree
var newTree = _.reject(tree, function(ref) { return ref.path === path });
_.each(newTree, function(ref) {
if (ref.type === "tree") delete ref.sha;
});
that.postTree(newTree, function(err, rootTree) {
that.commit(latestCommit, rootTree, 'Deleted '+path , function(err, commit) {
that.updateHead(branch, commit, function(err) {
cb(err);
});
});
});
});
});
};
// Move a file to a new location
// -------
this.move = function(branch, path, newPath, cb) {
updateTree(branch, function(err, latestCommit) {
that.getTree(latestCommit+"?recursive=true", function(err, tree) {
// Update Tree
_.each(tree, function(ref) {
if (ref.path === path) ref.path = newPath;
if (ref.type === "tree") delete ref.sha;
});
that.postTree(tree, function(err, rootTree) {
that.commit(latestCommit, rootTree, 'Deleted '+path , function(err, commit) {
that.updateHead(branch, commit, function(err) {
cb(err);
});
});
});
});
});
};
// Write file contents to a given branch and path
// -------
this.write = function(branch, path, content, message, cb) {
updateTree(branch, function(err, latestCommit) {
if (err) return cb(err);
that.postBlob(content, function(err, blob) {
if (err) return cb(err);
that.updateTree(latestCommit, path, blob, function(err, tree) {
if (err) return cb(err);
that.commit(latestCommit, tree, message, function(err, commit) {
if (err) return cb(err);
that.updateHead(branch, commit, cb);
});
});
});
});
};
};
// Gists API
// =======
Github.Gist = function(options) {
var id = options.id;
var that = this;
var gistPath = "/gists/"+id;
// Read the gist
// --------
this.read = function(cb) {
_request("GET", gistPath, null, function(err, gist) {
cb(err, gist);
});
};
// Delete the gist
// --------
this.delete = function(cb) {
_request("DELETE", gistPath, null, function(err,res) {
cb(err,res);
});
};
// Fork a gist
// --------
this.fork = function(cb) {
_request("POST", gistPath+"/fork", null, function(err,res) {
cb(err,res);
});
};
// Update a gist with the new stuff
// --------
this.update = function(options, cb) {
_request("PATCH", gistPath, options, function(err,res) {
cb(err,res);
});
};
};
// Top Level API
// -------
this.getRepo = function(user, repo) {
return new Github.Repository({user: user, name: repo});
};
};
}).call(this);

View File

@@ -1,12 +0,0 @@
// This file contains the select, reject, forEach and has functions
// from underscore.js, then minified to make it extra tiny
// Underscore.js 1.3.3
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore may be freely distributed under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore
(function(){var e=this,t=Array.prototype,n=Object.prototype,r=t.forEach,i=t.filter,s=n.hasOwnProperty,o={};_=function(obj) {return new wrapper(obj);};_.filter=_.select=function(e,t,n){var r=[];return e==null?r:i&&e.filter===i?e.filter(t,n):(u(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},_.reject=function(e,t,n){var r=[];return e==null?r:(u(e,function(e,i,s){t.call(n,e,i,s)||(r[r.length]=e)}),r)};var u=_.each=_.forEach=function(e,t,n){if(e==null)return;if(r&&e.forEach===r)e.forEach(t,n);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(i in e&&t.call(n,e[i],i,e)===o)return}else for(var u in e)if(_.has(e,u)&&t.call(n,e[u],u,e)===o)return};_.has=function(e,t){return s.call(e,t)}}).call(this)

View File

@@ -1 +0,0 @@
magic_quotes_gpc = Off

View File

@@ -1,121 +0,0 @@
<?php
// -----------------
// START USER CONFIG
// -----------------
// SYSTEM SETTINGS
// Document root and ICErepo version no:
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$version = "0.8.0";
// AUTHENTICATION
// Can either be done by oauth (recommended), or username & password (less secure)
// oauth
$token = "";
// Basic
$username = "";
$password = "";
// REPOS & SERVER DIRS
// Here you identify the repo location and related path on your server
// (the last param is to identify which dropdown option to select by default).
$repos = array(
"mattpass/dirTree",$docRoot."/TEST2","",
"mattpass/TEST",$docRoot."/TEST","selected"
);
// User level setting. Set at 1 or above to use
$_SESSION['userLevel'] = 10;
// ---------------
// END USER CONFIG
// ---------------
// Don't display, but log all errors
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', dirname(__FILE__).'/error-log.txt');
error_reporting(-1);
// Set our default timezone and supress warning with @
@date_default_timezone_set(date_default_timezone_get());
// Set a stream context timeout for file reading
$context = stream_context_create(array('http'=>
array(
'timeout' => 60 // secs
)
));
// Start a session if we haven't already
if(!isset($_SESSION)) {@session_start();}
if (!isset($_SESSION['userLevel']) || $_SESSION['userLevel'] < 1) {
die("Sorry, you need to be logged in to use ICErepo");
}
// Set session vars if we're logging in via a session
if (isset($_REQUEST['token']) && $_REQUEST['token']!="") {
$_SESSION['token'] = $_REQUEST['token'];
}
if (isset($_REQUEST['username']) && $_REQUEST['username']!="") {
$_SESSION['username'] = $_REQUEST['username'];
$_SESSION['password'] = $_REQUEST['password'];
}
// Reestablish those session vars in an ongoing way
if (isset($_SESSION['token'])) {
$token = $_SESSION['token'] = $_SESSION['token'];
}
if (isset($_SESSION['username'])) {
$username = $_SESSION['username'] = $_SESSION['username'];
$password = $_SESSION['password'] = $_SESSION['password'];
}
if ($token=="" && $username=="" && !isset($_GET['sessionLogin'])) {
header("Location: ?sessionLogin=true");
}
// returns converted entities where there are HTML entity equivalents
function strClean($var) {
return htmlentities($var, ENT_QUOTES, "UTF-8");
}
// returns a number, whole or decimal or null
function numClean($var) {
return is_numeric($var) ? floatval($var) : false;
}
// Function to sort given values alphabetically
function alphasort($a, $b) {
return strcmp($a->getPathname(), $b->getPathname());
}
// Class to put forward the values for sorting
class SortingIterator implements IteratorAggregate {
private $iterator = null;
public function __construct(Traversable $iterator, $callback) {
$array = iterator_to_array($iterator);
usort($array, $callback);
$this->iterator = new ArrayIterator($array);
}
public function getIterator() {
return $this->iterator;
}
}
// If magic quotes are still on (attempted to switch off in php.ini)
if (get_magic_quotes_gpc ()) {
function stripslashes_deep($value) {
$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
return $value;
}
$_POST = (isset($_POST) && !empty($_POST)) ? array_map('stripslashes_deep', $_POST) : array();
$_GET = (isset($_GET) && !empty($_GET)) ? array_map('stripslashes_deep', $_GET) : array();
$_COOKIE = (isset($_COOKIE) && !empty($_COOKIE)) ? array_map('stripslashes_deep', $_COOKIE) : array();
$_REQUEST = (isset($_REQUEST) && !empty($_REQUEST)) ? array_map('stripslashes_deep', $_REQUEST) : array();
}
?>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,91 +0,0 @@
<?php
// -----------------------------------------------
// Zip-It! for ICEcoder v1.0 by Matt Pass
// Will backup requested files/folders in ICEcoder
// and remove old backups older than $keepLastDays
// -----------------------------------------------
include("../../lib/settings.php");
?>
<!DOCTYPE html>
<html>
<head>
<title>Zip It! for ICEcoder</title>
</head>
<body>
<?php
$saveLocation = '../../backups/';
$_GET['zip']=="|" ? $fileName = "root" : $fileName = str_replace("|","_",strClean($_GET['zip']));
$fileName .= '-'.time().'.zip';
$keepLastDays = 7;
if (!is_dir($saveLocation)) {mkdir($saveLocation, 0777);}
Class zipIt {
public function zipFilesUp($zipDir,$zipFile,$keepLastDays,$docRoot) {
$zipName = $zipDir.$zipFile;
$zipFiles = array();
$_GET['zip']=="|" ? $zipTgt = "" : $zipTgt = str_replace("|","/",strClean($_GET['zip']));
if (strpos($_GET['zip'],"/")!==0) {$zipTgt = "/".trim($zipTgt,"/");};
$addItem = $docRoot.$zipTgt;
if (is_dir($addItem)) {
$dirStack = array($addItem);
while (!empty($dirStack)) {
$currentDir = array_pop($dirStack);
$dir = dir($currentDir);
while (false !== ($node = $dir->read())) {
if ($node == '.' || $node == '..') {continue;}
if (is_dir($currentDir.$node) && !strpos($currentDir.$node,"_coder") && !strpos($currentDir.$node,"ICEcoder")) {
array_push($dirStack,$currentDir.$node.'/');
}
if (is_file($currentDir.$node)) {$zipFiles[] = $currentDir.$node;}
}
}
} else {
if(file_exists($addItem)) {$zipFiles[] = $addItem;}
}
if ($backupsDir = opendir($zipDir)) {
$keepTime = $keepLastDays*60*60*24;
while (false !== ($backup = readdir($backupsDir))) {
if ($backup != "." && $backup != "..") {
if ((time()-filemtime($zipDir.$backup)) > $keepTime) {
chmod($zipDir.$backup, 0777);
unlink($zipDir.$backup) or DIE("couldn't delete $zipDir$backup<br>");
}
}
}
closedir($backupsDir);
}
if(count($zipFiles)) {
$zip = new ZipArchive();
if($zip->open($zipName,ZIPARCHIVE::CREATE)!== true) {return false;}
$excludeFilesFolders = isset($_GET['exclude']) ? explode("*",strClean($_GET['exclude'])) : array();
foreach($zipFiles as $file) {
$canAdd=true;
for ($i=0;$i<count($excludeFilesFolders);$i++) {
if($excludeFilesFolders[$i] && strpos($file,$excludeFilesFolders[$i])!==false) {$canAdd=false;};
}
if ($canAdd==true) {
$zip->addFile($file,str_replace($docRoot."/","",$file));
}
}
$zip->close();
chmod($zipName, 0777);
return file_exists($zipName);
} else {
return false;
}
}
}
if($_SESSION['loggedIn']) {
$doZip = new zipIt();
echo '<script>top.ICEcoder.serverMessage("<b>Zipping Files</b>");</script>';
$addToZip = $doZip->zipFilesUp($saveLocation,$fileName,$keepLastDays,$docRoot);
echo '<script>';
echo !$addToZip
? 'top.ICEcoder.message("Could not zip files up!");'
: 'setTimeout(function(){top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);},500);';
echo '</script>';
}
?>
</body>
</html>