( function ( ) { var ACE _NAMESPACE = "" ; var global = ( function ( ) { return this ; } ) ( ) ; if ( ! ACE _NAMESPACE && typeof requirejs !== "undefined" )
return ; var _define = function ( module , deps , payload ) { if ( typeof module !== 'string' ) { if ( _define . original )
_define . original . apply ( window , arguments ) ; else { console . error ( 'dropping module because define wasn\'t a string.' ) ; console . trace ( ) ; }
return ; }
if ( arguments . length == 2 )
payload = deps ; if ( ! _define . modules ) { _define . modules = { } ; _define . payloads = { } ; }
_define . payloads [ module ] = payload ; _define . modules [ module ] = null ; } ; var _require = function ( parentId , module , callback ) { if ( Object . prototype . toString . call ( module ) === "[object Array]" ) { var params = [ ] ; for ( var i = 0 , l = module . length ; i < l ; ++ i ) { var dep = lookup ( parentId , module [ i ] ) ; if ( ! dep && _require . original )
return _require . original . apply ( window , arguments ) ; params . push ( dep ) ; }
if ( callback ) { callback . apply ( null , params ) ; } }
else if ( typeof module === 'string' ) { var payload = lookup ( parentId , module ) ; if ( ! payload && _require . original )
return _require . original . apply ( window , arguments ) ; if ( callback ) { callback ( ) ; }
return payload ; }
else { if ( _require . original )
return _require . original . apply ( window , arguments ) ; } } ; var normalizeModule = function ( parentId , moduleName ) { if ( moduleName . indexOf ( "!" ) !== - 1 ) { var chunks = moduleName . split ( "!" ) ; return normalizeModule ( parentId , chunks [ 0 ] ) + "!" + normalizeModule ( parentId , chunks [ 1 ] ) ; }
if ( moduleName . charAt ( 0 ) == "." ) { var base = parentId . split ( "/" ) . slice ( 0 , - 1 ) . join ( "/" ) ; moduleName = base + "/" + moduleName ; while ( moduleName . indexOf ( "." ) !== - 1 && previous != moduleName ) { var previous = moduleName ; moduleName = moduleName . replace ( /\/\.\// , "/" ) . replace ( /[^\/]+\/\.\.\// , "" ) ; } }
return moduleName ; } ; var lookup = function ( parentId , moduleName ) { moduleName = normalizeModule ( parentId , moduleName ) ; var module = _define . modules [ moduleName ] ; if ( ! module ) { module = _define . payloads [ moduleName ] ; if ( typeof module === 'function' ) { var exports = { } ; var mod = { id : moduleName , uri : '' , exports : exports , packaged : true } ; var req = function ( module , callback ) { return _require ( moduleName , module , callback ) ; } ; var returnValue = module ( req , exports , mod ) ; exports = returnValue || mod . exports ; _define . modules [ moduleName ] = exports ; delete _define . payloads [ moduleName ] ; }
module = _define . modules [ moduleName ] = exports || module ; }
return module ; } ; function exportAce ( ns ) { var require = function ( module , callback ) { return _require ( "" , module , callback ) ; } ; var root = global ; if ( ns ) { if ( ! global [ ns ] )
global [ ns ] = { } ; root = global [ ns ] ; }
if ( ! root . define || ! root . define . packaged ) { _define . original = root . define ; root . define = _define ; root . define . packaged = true ; }
if ( ! root . require || ! root . require . packaged ) { _require . original = root . require ; root . require = require ; root . require . packaged = true ; } }
exportAce ( ACE _NAMESPACE ) ; } ) ( ) ; define ( 'ace/ace' , [ 'require' , 'exports' , 'module' , 'ace/lib/fixoldbrowsers' , 'ace/lib/dom' , 'ace/lib/event' , 'ace/editor' , 'ace/edit_session' , 'ace/undomanager' , 'ace/virtual_renderer' , 'ace/multi_select' , 'ace/worker/worker_client' , 'ace/keyboard/hash_handler' , 'ace/placeholder' , 'ace/mode/folding/fold_mode' , 'ace/theme/textmate' , 'ace/config' ] , function ( require , exports , module ) { require ( "./lib/fixoldbrowsers" ) ; var dom = require ( "./lib/dom" ) ; var event = require ( "./lib/event" ) ; var Editor = require ( "./editor" ) . Editor ; var EditSession = require ( "./edit_session" ) . EditSession ; var UndoManager = require ( "./undomanager" ) . UndoManager ; var Renderer = require ( "./virtual_renderer" ) . VirtualRenderer ; var MultiSelect = require ( "./multi_select" ) . MultiSelect ; require ( "./worker/worker_client" ) ; require ( "./keyboard/hash_handler" ) ; require ( "./placeholder" ) ; require ( "./mode/folding/fold_mode" ) ; require ( "./theme/textmate" ) ; exports . config = require ( "./config" ) ; exports . require = require ; exports . edit = function ( el ) { if ( typeof ( el ) == "string" ) { var _id = el ; var el = document . getElementById ( _id ) ; if ( ! el )
throw new Error ( "ace.edit can't find div #" + _id ) ; }
if ( el . env && el . env . editor instanceof Editor )
return el . env . editor ; var doc = exports . createEditSession ( dom . getInnerText ( el ) ) ; el . innerHTML = '' ; var editor = new Editor ( new Renderer ( el ) ) ; new MultiSelect ( editor ) ; editor . setSession ( doc ) ; var env = { document : doc , editor : editor , onResize : editor . resize . bind ( editor , null ) } ; event . addListener ( window , "resize" , env . onResize ) ; editor . on ( "destroy" , function ( ) { event . removeListener ( window , "resize" , env . onResize ) ; } ) ; el . env = editor . env = env ; return editor ; } ; exports . createEditSession = function ( text , mode ) { var doc = new EditSession ( text , mode ) ; doc . setUndoManager ( new UndoManager ( ) ) ; return doc ; }
exports . EditSession = EditSession ; exports . UndoManager = UndoManager ; } ) ; define ( 'ace/lib/fixoldbrowsers' , [ 'require' , 'exports' , 'module' , 'ace/lib/regexp' , 'ace/lib/es5-shim' ] , function ( require , exports , module ) { require ( "./regexp" ) ; require ( "./es5-shim" ) ; } ) ; define ( 'ace/lib/regexp' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { var real = { exec : RegExp . prototype . exec , test : RegExp . prototype . test , match : String . prototype . match , replace : String . prototype . replace , split : String . prototype . split } , compliantExecNpcg = real . exec . call ( /()??/ , "" ) [ 1 ] === undefined , compliantLastIndexIncrement = function ( ) { var x = /^/g ; real . test . call ( x , "" ) ; return ! x . lastIndex ; } ( ) ; if ( compliantLastIndexIncrement && compliantExecNpcg )
return ; RegExp . prototype . exec = function ( str ) { var match = real . exec . apply ( this , arguments ) , name , r2 ; if ( typeof ( str ) == 'string' && match ) { if ( ! compliantExecNpcg && match . length > 1 && indexOf ( match , "" ) > - 1 ) { r2 = RegExp ( this . source , real . replace . call ( getNativeFlags ( this ) , "g" , "" ) ) ; real . replace . call ( str . slice ( match . index ) , r2 , function ( ) { for ( var i = 1 ; i < arguments . length - 2 ; i ++ ) { if ( arguments [ i ] === undefined )
match [ i ] = undefined ; } } ) ; }
if ( this . _xregexp && this . _xregexp . captureNames ) { for ( var i = 1 ; i < match . length ; i ++ ) { name = this . _xregexp . captureNames [ i - 1 ] ; if ( name )
match [ name ] = match [ i ] ; } }
if ( ! compliantLastIndexIncrement && this . global && ! match [ 0 ] . length && ( this . lastIndex > match . index ) )
this . lastIndex -- ; }
return match ; } ; if ( ! compliantLastIndexIncrement ) { RegExp . prototype . test = function ( str ) { var match = real . exec . call ( this , str ) ; if ( match && this . global && ! match [ 0 ] . length && ( this . lastIndex > match . index ) )
this . lastIndex -- ; return ! ! match ; } ; }
function getNativeFlags ( regex ) { return ( regex . global ? "g" : "" ) + ( regex . ignoreCase ? "i" : "" ) + ( regex . multiline ? "m" : "" ) + ( regex . extended ? "x" : "" ) + ( regex . sticky ? "y" : "" ) ; }
function indexOf ( array , item , from ) { if ( Array . prototype . indexOf )
return array . indexOf ( item , from ) ; for ( var i = from || 0 ; i < array . length ; i ++ ) { if ( array [ i ] === item )
return i ; }
return - 1 ; } } ) ; define ( 'ace/lib/es5-shim' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { function Empty ( ) { }
if ( ! Function . prototype . bind ) { Function . prototype . bind = function bind ( that ) { var target = this ; if ( typeof target != "function" ) { throw new TypeError ( "Function.prototype.bind called on incompatible " + target ) ; }
var args = slice . call ( arguments , 1 ) ; var bound = function ( ) { if ( this instanceof bound ) { var result = target . apply ( this , args . concat ( slice . call ( arguments ) ) ) ; if ( Object ( result ) === result ) { return result ; }
return this ; } else { return target . apply ( that , args . concat ( slice . call ( arguments ) ) ) ; } } ; if ( target . prototype ) { Empty . prototype = target . prototype ; bound . prototype = new Empty ( ) ; Empty . prototype = null ; }
return bound ; } ; }
var call = Function . prototype . call ; var prototypeOfArray = Array . prototype ; var prototypeOfObject = Object . prototype ; var slice = prototypeOfArray . slice ; var _toString = call . bind ( prototypeOfObject . toString ) ; var owns = call . bind ( prototypeOfObject . hasOwnProperty ) ; var defineGetter ; var defineSetter ; var lookupGetter ; var lookupSetter ; var supportsAccessors ; if ( ( supportsAccessors = owns ( prototypeOfObject , "__defineGetter__" ) ) ) { defineGetter = call . bind ( prototypeOfObject . _ _defineGetter _ _ ) ; defineSetter = call . bind ( prototypeOfObject . _ _defineSetter _ _ ) ; lookupGetter = call . bind ( prototypeOfObject . _ _lookupGetter _ _ ) ; lookupSetter = call . bind ( prototypeOfObject . _ _lookupSetter _ _ ) ; }
if ( [ 1 , 2 ] . splice ( 0 ) . length != 2 ) { if ( function ( ) { function makeArray ( l ) { var a = new Array ( l + 2 ) ; a [ 0 ] = a [ 1 ] = 0 ; return a ; }
var array = [ ] , lengthBefore ; array . splice . apply ( array , makeArray ( 20 ) ) ; array . splice . apply ( array , makeArray ( 26 ) ) ; lengthBefore = array . length ; array . splice ( 5 , 0 , "XXX" ) ; lengthBefore + 1 == array . length
if ( lengthBefore + 1 == array . length ) { return true ; } } ( ) ) { var array _splice = Array . prototype . splice ; Array . prototype . splice = function ( start , deleteCount ) { if ( ! arguments . length ) { return [ ] ; } else { return array _splice . apply ( this , [ start === void 0 ? 0 : start , deleteCount === void 0 ? ( this . length - start ) : deleteCount ] . concat ( slice . call ( arguments , 2 ) ) ) } } ; } else { Array . prototype . splice = function ( pos , removeCount ) { var length = this . length ; if ( pos > 0 ) { if ( pos > length )
pos = length ; } else if ( pos == void 0 ) { pos = 0 ; } else if ( pos < 0 ) { pos = Math . max ( length + pos , 0 ) ; }
if ( ! ( pos + removeCount < length ) )
removeCount = length - pos ; var removed = this . slice ( pos , pos + removeCount ) ; var insert = slice . call ( arguments , 2 ) ; var add = insert . length ; if ( pos === length ) { if ( add ) { this . push . apply ( this , insert ) ; } } else { var remove = Math . min ( removeCount , length - pos ) ; var tailOldPos = pos + remove ; var tailNewPos = tailOldPos + add - remove ; var tailCount = length - tailOldPos ; var lengthAfterRemove = length - remove ; if ( tailNewPos < tailOldPos ) { for ( var i = 0 ; i < tailCount ; ++ i ) { this [ tailNewPos + i ] = this [ tailOldPos + i ] ; } } else if ( tailNewPos > tailOldPos ) { for ( i = tailCount ; i -- ; ) { this [ tailNewPos + i ] = this [ tailOldPos + i ] ; } }
if ( add && pos === lengthAfterRemove ) { this . length = lengthAfterRemove ; this . push . apply ( this , insert ) ; } else { this . length = lengthAfterRemove + add ; for ( i = 0 ; i < add ; ++ i ) { this [ pos + i ] = insert [ i ] ; } } }
return removed ; } ; } }
if ( ! Array . isArray ) { Array . isArray = function isArray ( obj ) { return _toString ( obj ) == "[object Array]" ; } ; }
var boxedString = Object ( "a" ) , splitString = boxedString [ 0 ] != "a" || ! ( 0 in boxedString ) ; if ( ! Array . prototype . forEach ) { Array . prototype . forEach = function forEach ( fun ) { var object = toObject ( this ) , self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : object , thisp = arguments [ 1 ] , i = - 1 , length = self . length >>> 0 ; if ( _toString ( fun ) != "[object Function]" ) { throw new TypeError ( ) ; }
while ( ++ i < length ) { if ( i in self ) { fun . call ( thisp , self [ i ] , i , object ) ; } } } ; }
if ( ! Array . prototype . map ) { Array . prototype . map = function map ( fun ) { var object = toObject ( this ) , self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : object , length = self . length >>> 0 , result = Array ( length ) , thisp = arguments [ 1 ] ; if ( _toString ( fun ) != "[object Function]" ) { throw new TypeError ( fun + " is not a function" ) ; }
for ( var i = 0 ; i < length ; i ++ ) { if ( i in self )
result [ i ] = fun . call ( thisp , self [ i ] , i , object ) ; }
return result ; } ; }
if ( ! Array . prototype . filter ) { Array . prototype . filter = function filter ( fun ) { var object = toObject ( this ) , self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : object , length = self . length >>> 0 , result = [ ] , value , thisp = arguments [ 1 ] ; if ( _toString ( fun ) != "[object Function]" ) { throw new TypeError ( fun + " is not a function" ) ; }
for ( var i = 0 ; i < length ; i ++ ) { if ( i in self ) { value = self [ i ] ; if ( fun . call ( thisp , value , i , object ) ) { result . push ( value ) ; } } }
return result ; } ; }
if ( ! Array . prototype . every ) { Array . prototype . every = function every ( fun ) { var object = toObject ( this ) , self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : object , length = self . length >>> 0 , thisp = arguments [ 1 ] ; if ( _toString ( fun ) != "[object Function]" ) { throw new TypeError ( fun + " is not a function" ) ; }
for ( var i = 0 ; i < length ; i ++ ) { if ( i in self && ! fun . call ( thisp , self [ i ] , i , object ) ) { return false ; } }
return true ; } ; }
if ( ! Array . prototype . some ) { Array . prototype . some = function some ( fun ) { var object = toObject ( this ) , self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : object , length = self . length >>> 0 , thisp = arguments [ 1 ] ; if ( _toString ( fun ) != "[object Function]" ) { throw new TypeError ( fun + " is not a function" ) ; }
for ( var i = 0 ; i < length ; i ++ ) { if ( i in self && fun . call ( thisp , self [ i ] , i , object ) ) { return true ; } }
return false ; } ; }
if ( ! Array . prototype . reduce ) { Array . prototype . reduce = function reduce ( fun ) { var object = toObject ( this ) , self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : object , length = self . length >>> 0 ; if ( _toString ( fun ) != "[object Function]" ) { throw new TypeError ( fun + " is not a function" ) ; }
if ( ! length && arguments . length == 1 ) { throw new TypeError ( "reduce of empty array with no initial value" ) ; }
var i = 0 ; var result ; if ( arguments . length >= 2 ) { result = arguments [ 1 ] ; } else { do { if ( i in self ) { result = self [ i ++ ] ; break ; }
if ( ++ i >= length ) { throw new TypeError ( "reduce of empty array with no initial value" ) ; } } while ( true ) ; }
for ( ; i < length ; i ++ ) { if ( i in self ) { result = fun . call ( void 0 , result , self [ i ] , i , object ) ; } }
return result ; } ; }
if ( ! Array . prototype . reduceRight ) { Array . prototype . reduceRight = function reduceRight ( fun ) { var object = toObject ( this ) , self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : object , length = self . length >>> 0 ; if ( _toString ( fun ) != "[object Function]" ) { throw new TypeError ( fun + " is not a function" ) ; }
if ( ! length && arguments . length == 1 ) { throw new TypeError ( "reduceRight of empty array with no initial value" ) ; }
var result , i = length - 1 ; if ( arguments . length >= 2 ) { result = arguments [ 1 ] ; } else { do { if ( i in self ) { result = self [ i -- ] ; break ; }
if ( -- i < 0 ) { throw new TypeError ( "reduceRight of empty array with no initial value" ) ; } } while ( true ) ; }
do { if ( i in this ) { result = fun . call ( void 0 , result , self [ i ] , i , object ) ; } } while ( i -- ) ; return result ; } ; }
if ( ! Array . prototype . indexOf || ( [ 0 , 1 ] . indexOf ( 1 , 2 ) != - 1 ) ) { Array . prototype . indexOf = function indexOf ( sought ) { var self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : toObject ( this ) , length = self . length >>> 0 ; if ( ! length ) { return - 1 ; }
var i = 0 ; if ( arguments . length > 1 ) { i = toInteger ( arguments [ 1 ] ) ; }
i = i >= 0 ? i : Math . max ( 0 , length + i ) ; for ( ; i < length ; i ++ ) { if ( i in self && self [ i ] === sought ) { return i ; } }
return - 1 ; } ; }
if ( ! Array . prototype . lastIndexOf || ( [ 0 , 1 ] . lastIndexOf ( 0 , - 3 ) != - 1 ) ) { Array . prototype . lastIndexOf = function lastIndexOf ( sought ) { var self = splitString && _toString ( this ) == "[object String]" ? this . split ( "" ) : toObject ( this ) , length = self . length >>> 0 ; if ( ! length ) { return - 1 ; }
var i = length - 1 ; if ( arguments . length > 1 ) { i = Math . min ( i , toInteger ( arguments [ 1 ] ) ) ; }
i = i >= 0 ? i : length - Math . abs ( i ) ; for ( ; i >= 0 ; i -- ) { if ( i in self && sought === self [ i ] ) { return i ; } }
return - 1 ; } ; }
if ( ! Object . getPrototypeOf ) { Object . getPrototypeOf = function getPrototypeOf ( object ) { return object . _ _proto _ _ || ( object . constructor ? object . constructor . prototype : prototypeOfObject ) ; } ; }
if ( ! Object . getOwnPropertyDescriptor ) { var ERR _NON _OBJECT = "Object.getOwnPropertyDescriptor called on a " + "non-object: " ; Object . getOwnPropertyDescriptor = function getOwnPropertyDescriptor ( object , property ) { if ( ( typeof object != "object" && typeof object != "function" ) || object === null )
throw new TypeError ( ERR _NON _OBJECT + object ) ; if ( ! owns ( object , property ) )
return ; var descriptor , getter , setter ; descriptor = { enumerable : true , configurable : true } ; if ( supportsAccessors ) { var prototype = object . _ _proto _ _ ; object . _ _proto _ _ = prototypeOfObject ; var getter = lookupGetter ( object , property ) ; var setter = lookupSetter ( object , property ) ; object . _ _proto _ _ = prototype ; if ( getter || setter ) { if ( getter ) descriptor . get = getter ; if ( setter ) descriptor . set = setter ; return descriptor ; } }
descriptor . value = object [ property ] ; return descriptor ; } ; }
if ( ! Object . getOwnPropertyNames ) { Object . getOwnPropertyNames = function getOwnPropertyNames ( object ) { return Object . keys ( object ) ; } ; }
if ( ! Object . create ) { var createEmpty ; if ( Object . prototype . _ _proto _ _ === null ) { createEmpty = function ( ) { return { "__proto__" : null } ; } ; } else { createEmpty = function ( ) { var empty = { } ; for ( var i in empty )
empty [ i ] = null ; empty . constructor = empty . hasOwnProperty = empty . propertyIsEnumerable = empty . isPrototypeOf = empty . toLocaleString = empty . toString = empty . valueOf = empty . _ _proto _ _ = null ; return empty ; } }
Object . create = function create ( prototype , properties ) { var object ; if ( prototype === null ) { object = createEmpty ( ) ; } else { if ( typeof prototype != "object" )
throw new TypeError ( "typeof prototype[" + ( typeof prototype ) + "] != 'object'" ) ; var Type = function ( ) { } ; Type . prototype = prototype ; object = new Type ( ) ; object . _ _proto _ _ = prototype ; }
if ( properties !== void 0 )
Object . defineProperties ( object , properties ) ; return object ; } ; }
function doesDefinePropertyWork ( object ) { try { Object . defineProperty ( object , "sentinel" , { } ) ; return "sentinel" in object ; } catch ( exception ) { } }
if ( Object . defineProperty ) { var definePropertyWorksOnObject = doesDefinePropertyWork ( { } ) ; var definePropertyWorksOnDom = typeof document == "undefined" || doesDefinePropertyWork ( document . createElement ( "div" ) ) ; if ( ! definePropertyWorksOnObject || ! definePropertyWorksOnDom ) { var definePropertyFallback = Object . defineProperty ; } }
if ( ! Object . defineProperty || definePropertyFallback ) { var ERR _NON _OBJECT _DESCRIPTOR = "Property description must be an object: " ; var ERR _NON _OBJECT _TARGET = "Object.defineProperty called on non-object: "
var ERR _ACCESSORS _NOT _SUPPORTED = "getters & setters can not be defined " + "on this javascript engine" ; Object . defineProperty = function defineProperty ( object , property , descriptor ) { if ( ( typeof object != "object" && typeof object != "function" ) || object === null )
throw new TypeError ( ERR _NON _OBJECT _TARGET + object ) ; if ( ( typeof descriptor != "object" && typeof descriptor != "function" ) || descriptor === null )
throw new TypeError ( ERR _NON _OBJECT _DESCRIPTOR + descriptor ) ; if ( definePropertyFallback ) { try { return definePropertyFallback . call ( Object , object , property , descriptor ) ; } catch ( exception ) { } }
if ( owns ( descriptor , "value" ) ) { if ( supportsAccessors && ( lookupGetter ( object , property ) || lookupSetter ( object , property ) ) )
{ var prototype = object . _ _proto _ _ ; object . _ _proto _ _ = prototypeOfObject ; delete object [ property ] ; object [ property ] = descriptor . value ; object . _ _proto _ _ = prototype ; } else { object [ property ] = descriptor . value ; } } else { if ( ! supportsAccessors )
throw new TypeError ( ERR _ACCESSORS _NOT _SUPPORTED ) ; if ( owns ( descriptor , "get" ) )
defineGetter ( object , property , descriptor . get ) ; if ( owns ( descriptor , "set" ) )
defineSetter ( object , property , descriptor . set ) ; }
return object ; } ; }
if ( ! Object . defineProperties ) { Object . defineProperties = function defineProperties ( object , properties ) { for ( var property in properties ) { if ( owns ( properties , property ) )
Object . defineProperty ( object , property , properties [ property ] ) ; }
return object ; } ; }
if ( ! Object . seal ) { Object . seal = function seal ( object ) { return object ; } ; }
if ( ! Object . freeze ) { Object . freeze = function freeze ( object ) { return object ; } ; }
try { Object . freeze ( function ( ) { } ) ; } catch ( exception ) { Object . freeze = ( function freeze ( freezeObject ) { return function freeze ( object ) { if ( typeof object == "function" ) { return object ; } else { return freezeObject ( object ) ; } } ; } ) ( Object . freeze ) ; }
if ( ! Object . preventExtensions ) { Object . preventExtensions = function preventExtensions ( object ) { return object ; } ; }
if ( ! Object . isSealed ) { Object . isSealed = function isSealed ( object ) { return false ; } ; }
if ( ! Object . isFrozen ) { Object . isFrozen = function isFrozen ( object ) { return false ; } ; }
if ( ! Object . isExtensible ) { Object . isExtensible = function isExtensible ( object ) { if ( Object ( object ) === object ) { throw new TypeError ( ) ; }
var name = '' ; while ( owns ( object , name ) ) { name += '?' ; }
object [ name ] = true ; var returnValue = owns ( object , name ) ; delete object [ name ] ; return returnValue ; } ; }
if ( ! Object . keys ) { var hasDontEnumBug = true , dontEnums = [ "toString" , "toLocaleString" , "valueOf" , "hasOwnProperty" , "isPrototypeOf" , "propertyIsEnumerable" , "constructor" ] , dontEnumsLength = dontEnums . length ; for ( var key in { "toString" : null } ) { hasDontEnumBug = false ; }
Object . keys = function keys ( object ) { if ( ( typeof object != "object" && typeof object != "function" ) || object === null ) { throw new TypeError ( "Object.keys called on a non-object" ) ; }
var keys = [ ] ; for ( var name in object ) { if ( owns ( object , name ) ) { keys . push ( name ) ; } }
if ( hasDontEnumBug ) { for ( var i = 0 , ii = dontEnumsLength ; i < ii ; i ++ ) { var dontEnum = dontEnums [ i ] ; if ( owns ( object , dontEnum ) ) { keys . push ( dontEnum ) ; } } }
return keys ; } ; }
if ( ! Date . now ) { Date . now = function now ( ) { return new Date ( ) . getTime ( ) ; } ; }
var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF" ; if ( ! String . prototype . trim || ws . trim ( ) ) { ws = "[" + ws + "]" ; var trimBeginRegexp = new RegExp ( "^" + ws + ws + "*" ) , trimEndRegexp = new RegExp ( ws + ws + "*$" ) ; String . prototype . trim = function trim ( ) { return String ( this ) . replace ( trimBeginRegexp , "" ) . replace ( trimEndRegexp , "" ) ; } ; }
function toInteger ( n ) { n = + n ; if ( n !== n ) { n = 0 ; } else if ( n !== 0 && n !== ( 1 / 0 ) && n !== - ( 1 / 0 ) ) { n = ( n > 0 || - 1 ) * Math . floor ( Math . abs ( n ) ) ; }
return n ; }
function isPrimitive ( input ) { var type = typeof input ; return ( input === null || type === "undefined" || type === "boolean" || type === "number" || type === "string" ) ; }
function toPrimitive ( input ) { var val , valueOf , toString ; if ( isPrimitive ( input ) ) { return input ; }
valueOf = input . valueOf ; if ( typeof valueOf === "function" ) { val = valueOf . call ( input ) ; if ( isPrimitive ( val ) ) { return val ; } }
toString = input . toString ; if ( typeof toString === "function" ) { val = toString . call ( input ) ; if ( isPrimitive ( val ) ) { return val ; } }
throw new TypeError ( ) ; }
var toObject = function ( o ) { if ( o == null ) { throw new TypeError ( "can't convert " + o + " to object" ) ; }
return Object ( o ) ; } ; } ) ; define ( 'ace/lib/dom' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { if ( typeof document == "undefined" )
return ; var XHTML _NS = "//www.w3.org/1999/xhtml" ; exports . getDocumentHead = function ( doc ) { if ( ! doc )
doc = document ; return doc . head || doc . getElementsByTagName ( "head" ) [ 0 ] || doc . documentElement ; }
exports . createElement = function ( tag , ns ) { return document . createElementNS ? document . createElementNS ( ns || XHTML _NS , tag ) : document . createElement ( tag ) ; } ; exports . hasCssClass = function ( el , name ) { var classes = el . className . split ( /\s+/g ) ; return classes . indexOf ( name ) !== - 1 ; } ; exports . addCssClass = function ( el , name ) { if ( ! exports . hasCssClass ( el , name ) ) { el . className += " " + name ; } } ; exports . removeCssClass = function ( el , name ) { var classes = el . className . split ( /\s+/g ) ; while ( true ) { var index = classes . indexOf ( name ) ; if ( index == - 1 ) { break ; }
classes . splice ( index , 1 ) ; }
el . className = classes . join ( " " ) ; } ; exports . toggleCssClass = function ( el , name ) { var classes = el . className . split ( /\s+/g ) , add = true ; while ( true ) { var index = classes . indexOf ( name ) ; if ( index == - 1 ) { break ; }
add = false ; classes . splice ( index , 1 ) ; }
if ( add )
classes . push ( name ) ; el . className = classes . join ( " " ) ; return add ; } ; exports . setCssClass = function ( node , className , include ) { if ( include ) { exports . addCssClass ( node , className ) ; } else { exports . removeCssClass ( node , className ) ; } } ; exports . hasCssString = function ( id , doc ) { var index = 0 , sheets ; doc = doc || document ; if ( doc . createStyleSheet && ( sheets = doc . styleSheets ) ) { while ( index < sheets . length )
if ( sheets [ index ++ ] . owningElement . id === id ) return true ; } else if ( ( sheets = doc . getElementsByTagName ( "style" ) ) ) { while ( index < sheets . length )
if ( sheets [ index ++ ] . id === id ) return true ; }
return false ; } ; exports . importCssString = function importCssString ( cssText , id , doc ) { doc = doc || document ; if ( id && exports . hasCssString ( id , doc ) )
return null ; var style ; if ( doc . createStyleSheet ) { style = doc . createStyleSheet ( ) ; style . cssText = cssText ; if ( id )
style . owningElement . id = id ; } else { style = doc . createElementNS ? doc . createElementNS ( XHTML _NS , "style" ) : doc . createElement ( "style" ) ; style . appendChild ( doc . createTextNode ( cssText ) ) ; if ( id )
style . id = id ; exports . getDocumentHead ( doc ) . appendChild ( style ) ; } } ; exports . importCssStylsheet = function ( uri , doc ) { if ( doc . createStyleSheet ) { doc . createStyleSheet ( uri ) ; } else { var link = exports . createElement ( 'link' ) ; link . rel = 'stylesheet' ; link . href = uri ; exports . getDocumentHead ( doc ) . appendChild ( link ) ; } } ; exports . getInnerWidth = function ( element ) { return ( parseInt ( exports . computedStyle ( element , "paddingLeft" ) , 10 ) + parseInt ( exports . computedStyle ( element , "paddingRight" ) , 10 ) + element . clientWidth ) ; } ; exports . getInnerHeight = function ( element ) { return ( parseInt ( exports . computedStyle ( element , "paddingTop" ) , 10 ) + parseInt ( exports . computedStyle ( element , "paddingBottom" ) , 10 ) + element . clientHeight ) ; } ; if ( window . pageYOffset !== undefined ) { exports . getPageScrollTop = function ( ) { return window . pageYOffset ; } ; exports . getPageScrollLeft = function ( ) { return window . pageXOffset ; } ; }
else { exports . getPageScrollTop = function ( ) { return document . body . scrollTop ; } ; exports . getPageScrollLeft = function ( ) { return document . body . scrollLeft ; } ; }
if ( window . getComputedStyle )
exports . computedStyle = function ( element , style ) { if ( style )
return ( window . getComputedStyle ( element , "" ) || { } ) [ style ] || "" ; return window . getComputedStyle ( element , "" ) || { } ; } ; else
exports . computedStyle = function ( element , style ) { if ( style )
return element . currentStyle [ style ] ; return element . currentStyle ; } ; exports . scrollbarWidth = function ( document ) { var inner = exports . createElement ( "ace_inner" ) ; inner . style . width = "100%" ; inner . style . minWidth = "0px" ; inner . style . height = "200px" ; inner . style . display = "block" ; var outer = exports . createElement ( "ace_outer" ) ; var style = outer . style ; style . position = "absolute" ; style . left = "-10000px" ; style . overflow = "hidden" ; style . width = "200px" ; style . minWidth = "0px" ; style . height = "150px" ; style . display = "block" ; outer . appendChild ( inner ) ; var body = document . documentElement ; body . appendChild ( outer ) ; var noScrollbar = inner . offsetWidth ; style . overflow = "scroll" ; var withScrollbar = inner . offsetWidth ; if ( noScrollbar == withScrollbar ) { withScrollbar = outer . clientWidth ; }
body . removeChild ( outer ) ; return noScrollbar - withScrollbar ; } ; exports . setInnerHtml = function ( el , innerHtml ) { var element = el . cloneNode ( false ) ; element . innerHTML = innerHtml ; el . parentNode . replaceChild ( element , el ) ; return element ; } ; if ( "textContent" in document . documentElement ) { exports . setInnerText = function ( el , innerText ) { el . textContent = innerText ; } ; exports . getInnerText = function ( el ) { return el . textContent ; } ; }
else { exports . setInnerText = function ( el , innerText ) { el . innerText = innerText ; } ; exports . getInnerText = function ( el ) { return el . innerText ; } ; }
exports . getParentWindow = function ( document ) { return document . defaultView || document . parentWindow ; } ; } ) ; define ( 'ace/lib/event' , [ 'require' , 'exports' , 'module' , 'ace/lib/keys' , 'ace/lib/useragent' , 'ace/lib/dom' ] , function ( require , exports , module ) { var keys = require ( "./keys" ) ; var useragent = require ( "./useragent" ) ; var dom = require ( "./dom" ) ; exports . addListener = function ( elem , type , callback ) { if ( elem . addEventListener ) { return elem . addEventListener ( type , callback , false ) ; }
if ( elem . attachEvent ) { var wrapper = function ( ) { callback . call ( elem , window . event ) ; } ; callback . _wrapper = wrapper ; elem . attachEvent ( "on" + type , wrapper ) ; } } ; exports . removeListener = function ( elem , type , callback ) { if ( elem . removeEventListener ) { return elem . removeEventListener ( type , callback , false ) ; }
if ( elem . detachEvent ) { elem . detachEvent ( "on" + type , callback . _wrapper || callback ) ; } } ; exports . stopEvent = function ( e ) { exports . stopPropagation ( e ) ; exports . preventDefault ( e ) ; return false ; } ; exports . stopPropagation = function ( e ) { if ( e . stopPropagation )
e . stopPropagation ( ) ; else
e . cancelBubble = true ; } ; exports . preventDefault = function ( e ) { if ( e . preventDefault )
e . preventDefault ( ) ; else
e . returnValue = false ; } ; exports . getButton = function ( e ) { if ( e . type == "dblclick" )
return 0 ; if ( e . type == "contextmenu" || ( e . ctrlKey && useragent . isMac ) )
return 2 ; if ( e . preventDefault ) { return e . button ; }
else { return { 1 : 0 , 2 : 2 , 4 : 1 } [ e . button ] ; } } ; exports . capture = function ( el , eventHandler , releaseCaptureHandler ) { function onMouseUp ( e ) { eventHandler && eventHandler ( e ) ; releaseCaptureHandler && releaseCaptureHandler ( e ) ; exports . removeListener ( document , "mousemove" , eventHandler , true ) ; exports . removeListener ( document , "mouseup" , onMouseUp , true ) ; exports . removeListener ( document , "dragstart" , onMouseUp , true ) ; }
exports . addListener ( document , "mousemove" , eventHandler , true ) ; exports . addListener ( document , "mouseup" , onMouseUp , true ) ; exports . addListener ( document , "dragstart" , onMouseUp , true ) ; } ; exports . addMouseWheelListener = function ( el , callback ) { if ( "onmousewheel" in el ) { var factor = 8 ; exports . addListener ( el , "mousewheel" , function ( e ) { if ( e . wheelDeltaX !== undefined ) { e . wheelX = - e . wheelDeltaX / factor ; e . wheelY = - e . wheelDeltaY / factor ; } else { e . wheelX = 0 ; e . wheelY = - e . wheelDelta / factor ; }
callback ( e ) ; } ) ; } else if ( "onwheel" in el ) { exports . addListener ( el , "wheel" , function ( e ) { e . wheelX = ( e . deltaX || 0 ) * 5 ; e . wheelY = ( e . deltaY || 0 ) * 5 ; callback ( e ) ; } ) ; } else { exports . addListener ( el , "DOMMouseScroll" , function ( e ) { if ( e . axis && e . axis == e . HORIZONTAL _AXIS ) { e . wheelX = ( e . detail || 0 ) * 5 ; e . wheelY = 0 ; } else { e . wheelX = 0 ; e . wheelY = ( e . detail || 0 ) * 5 ; }
callback ( e ) ; } ) ; } } ; exports . addMultiMouseDownListener = function ( el , timeouts , eventHandler , callbackName ) { var clicks = 0 ; var startX , startY , timer ; var eventNames = { 2 : "dblclick" , 3 : "tripleclick" , 4 : "quadclick" } ; exports . addListener ( el , "mousedown" , function ( e ) { if ( exports . getButton ( e ) != 0 ) { clicks = 0 ; } else if ( e . detail > 1 ) { clicks ++ ; if ( clicks > 4 )
clicks = 1 ; } else { clicks = 1 ; }
if ( useragent . isIE ) { var isNewClick = Math . abs ( e . clientX - startX ) > 5 || Math . abs ( e . clientY - startY ) > 5 ; if ( isNewClick ) { clicks = 1 ; }
if ( clicks == 1 ) { startX = e . clientX ; startY = e . clientY ; } }
eventHandler [ callbackName ] ( "mousedown" , e ) ; if ( clicks > 4 )
clicks = 0 ; else if ( clicks > 1 )
return eventHandler [ callbackName ] ( eventNames [ clicks ] , e ) ; } ) ; if ( useragent . isOldIE ) { exports . addListener ( el , "dblclick" , function ( e ) { clicks = 2 ; if ( timer )
clearTimeout ( timer ) ; timer = setTimeout ( function ( ) { timer = null } , timeouts [ clicks - 1 ] || 600 ) ; eventHandler [ callbackName ] ( "mousedown" , e ) ; eventHandler [ callbackName ] ( eventNames [ clicks ] , e ) ; } ) ; } } ; function normalizeCommandKeys ( callback , e , keyCode ) { var hashId = 0 ; if ( ( useragent . isOpera && ! ( "KeyboardEvent" in window ) ) && useragent . isMac ) { hashId = 0 | ( e . metaKey ? 1 : 0 ) | ( e . altKey ? 2 : 0 ) | ( e . shiftKey ? 4 : 0 ) | ( e . ctrlKey ? 8 : 0 ) ; } else { hashId = 0 | ( e . ctrlKey ? 1 : 0 ) | ( e . altKey ? 2 : 0 ) | ( e . shiftKey ? 4 : 0 ) | ( e . metaKey ? 8 : 0 ) ; }
if ( ! useragent . isMac && pressedKeys ) { if ( pressedKeys [ 91 ] || pressedKeys [ 92 ] )
hashId |= 8 ; if ( pressedKeys . altGr ) { if ( ( 3 & hashId ) != 3 )
pressedKeys . altGr = 0
else
return ; }
if ( keyCode === 18 || keyCode === 17 ) { var location = e . location || e . keyLocation ; if ( keyCode === 17 && location === 1 ) { ts = e . timeStamp ; } else if ( keyCode === 18 && hashId === 3 && location === 2 ) { var dt = - ts ; ts = e . timeStamp ; dt += ts ; if ( dt < 3 )
pressedKeys . altGr = true ; } } }
if ( keyCode in keys . MODIFIER _KEYS ) { switch ( keys . MODIFIER _KEYS [ keyCode ] ) { case "Alt" : hashId = 2 ; break ; case "Shift" : hashId = 4 ; break ; case "Ctrl" : hashId = 1 ; break ; default : hashId = 8 ; break ; }
keyCode = 0 ; }
if ( hashId & 8 && ( keyCode === 91 || keyCode === 93 ) ) { keyCode = 0 ; }
if ( ! hashId && keyCode === 13 ) { if ( e . location || e . keyLocation === 3 ) { callback ( e , hashId , - keyCode )
if ( e . defaultPrevented )
return ; } }
if ( ! hashId && ! ( keyCode in keys . FUNCTION _KEYS ) && ! ( keyCode in keys . PRINTABLE _KEYS ) ) { return false ; }
return callback ( e , hashId , keyCode ) ; }
var pressedKeys = null ; var ts = 0 ; exports . addCommandKeyListener = function ( el , callback ) { var addListener = exports . addListener ; if ( useragent . isOldGecko || ( useragent . isOpera && ! ( "KeyboardEvent" in window ) ) ) { var lastKeyDownKeyCode = null ; addListener ( el , "keydown" , function ( e ) { lastKeyDownKeyCode = e . keyCode ; } ) ; addListener ( el , "keypress" , function ( e ) { return normalizeCommandKeys ( callback , e , lastKeyDownKeyCode ) ; } ) ; } else { var lastDefaultPrevented = null ; addListener ( el , "keydown" , function ( e ) { pressedKeys [ e . keyCode ] = true ; var result = normalizeCommandKeys ( callback , e , e . keyCode ) ; lastDefaultPrevented = e . defaultPrevented ; return result ; } ) ; addListener ( el , "keypress" , function ( e ) { if ( lastDefaultPrevented && ( e . ctrlKey || e . altKey || e . shiftKey || e . metaKey ) ) { exports . stopEvent ( e ) ; lastDefaultPrevented = null ; } } ) ; addListener ( el , "keyup" , function ( e ) { pressedKeys [ e . keyCode ] = null ; } ) ; if ( ! pressedKeys ) { pressedKeys = Object . create ( null ) ; addListener ( window , "focus" , function ( e ) { pressedKeys = Object . create ( null ) ; } ) ; } } } ; if ( window . postMessage && ! useragent . isOldIE ) { var postMessageId = 1 ; exports . nextTick = function ( callback , win ) { win = win || window ; var messageName = "zero-timeout-message-" + postMessageId ; exports . addListener ( win , "message" , function listener ( e ) { if ( e . data == messageName ) { exports . stopPropagation ( e ) ; exports . removeListener ( win , "message" , listener ) ; callback ( ) ; } } ) ; win . postMessage ( messageName , "*" ) ; } ; }
exports . nextFrame = window . requestAnimationFrame || window . mozRequestAnimationFrame || window . webkitRequestAnimationFrame || window . msRequestAnimationFrame || window . oRequestAnimationFrame ; if ( exports . nextFrame )
exports . nextFrame = exports . nextFrame . bind ( window ) ; else
exports . nextFrame = function ( callback ) { setTimeout ( callback , 17 ) ; } ; } ) ; define ( 'ace/lib/keys' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' ] , function ( require , exports , module ) { var oop = require ( "./oop" ) ; var Keys = ( function ( ) { var ret = { MODIFIER _KEYS : { 16 : 'Shift' , 17 : 'Ctrl' , 18 : 'Alt' , 224 : 'Meta' } , KEY _MODS : { "ctrl" : 1 , "alt" : 2 , "option" : 2 , "shift" : 4 , "meta" : 8 , "command" : 8 , "cmd" : 8 } , FUNCTION _KEYS : { 8 : "Backspace" , 9 : "Tab" , 13 : "Return" , 19 : "Pause" , 27 : "Esc" , 32 : "Space" , 33 : "PageUp" , 34 : "PageDown" , 35 : "End" , 36 : "Home" , 37 : "Left" , 38 : "Up" , 39 : "Right" , 40 : "Down" , 44 : "Print" , 45 : "Insert" , 46 : "Delete" , 96 : "Numpad0" , 97 : "Numpad1" , 98 : "Numpad2" , 99 : "Numpad3" , 100 : "Numpad4" , 101 : "Numpad5" , 102 : "Numpad6" , 103 : "Numpad7" , 104 : "Numpad8" , 105 : "Numpad9" , '-13' : "NumpadEnter" , 112 : "F1" , 113 : "F2" , 114 : "F3" , 115 : "F4" , 116 : "F5" , 117 : "F6" , 118 : "F7" , 119 : "F8" , 120 : "F9" , 121 : "F10" , 122 : "F11" , 123 : "F12" , 144 : "Numlock" , 145 : "Scrolllock" } , PRINTABLE _KEYS : { 32 : ' ' , 48 : '0' , 49 : '1' , 50 : '2' , 51 : '3' , 52 : '4' , 53 : '5' , 54 : '6' , 55 : '7' , 56 : '8' , 57 : '9' , 59 : ';' , 61 : '=' , 65 : 'a' , 66 : 'b' , 67 : 'c' , 68 : 'd' , 69 : 'e' , 70 : 'f' , 71 : 'g' , 72 : 'h' , 73 : 'i' , 74 : 'j' , 75 : 'k' , 76 : 'l' , 77 : 'm' , 78 : 'n' , 79 : 'o' , 80 : 'p' , 81 : 'q' , 82 : 'r' , 83 : 's' , 84 : 't' , 85 : 'u' , 86 : 'v' , 87 : 'w' , 88 : 'x' , 89 : 'y' , 90 : 'z' , 107 : '+' , 109 : '-' , 110 : '.' , 188 : ',' , 190 : '.' , 191 : '/' , 192 : '`' , 219 : '[' , 220 : '\\' , 221 : ']' , 222 : '\'' } } ; for ( var i in ret . FUNCTION _KEYS ) { var name = ret . FUNCTION _KEYS [ i ] . toLowerCase ( ) ; ret [ name ] = parseInt ( i , 10 ) ; }
oop . mixin ( ret , ret . MODIFIER _KEYS ) ; oop . mixin ( ret , ret . PRINTABLE _KEYS ) ; oop . mixin ( ret , ret . FUNCTION _KEYS ) ; ret . enter = ret [ "return" ] ; ret . escape = ret . esc ; ret . del = ret [ "delete" ] ; ret [ 173 ] = '-' ; return ret ; } ) ( ) ; oop . mixin ( exports , Keys ) ; exports . keyCodeToString = function ( keyCode ) { return ( Keys [ keyCode ] || String . fromCharCode ( keyCode ) ) . toLowerCase ( ) ; } } ) ; define ( 'ace/lib/oop' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { exports . inherits = ( function ( ) { var tempCtor = function ( ) { } ; return function ( ctor , superCtor ) { tempCtor . prototype = superCtor . prototype ; ctor . super _ = superCtor . prototype ; ctor . prototype = new tempCtor ( ) ; ctor . prototype . constructor = ctor ; } ; } ( ) ) ; exports . mixin = function ( obj , mixin ) { for ( var key in mixin ) { obj [ key ] = mixin [ key ] ; }
return obj ; } ; exports . implement = function ( proto , mixin ) { exports . mixin ( proto , mixin ) ; } ; } ) ; define ( 'ace/lib/useragent' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { exports . OS = { LINUX : "LINUX" , MAC : "MAC" , WINDOWS : "WINDOWS" } ; exports . getOS = function ( ) { if ( exports . isMac ) { return exports . OS . MAC ; } else if ( exports . isLinux ) { return exports . OS . LINUX ; } else { return exports . OS . WINDOWS ; } } ; if ( typeof navigator != "object" )
return ; var os = ( navigator . platform . match ( /mac|win|linux/i ) || [ "other" ] ) [ 0 ] . toLowerCase ( ) ; var ua = navigator . userAgent ; exports . isWin = ( os == "win" ) ; exports . isMac = ( os == "mac" ) ; exports . isLinux = ( os == "linux" ) ; exports . isIE = ( navigator . appName == "Microsoft Internet Explorer" || navigator . appName . indexOf ( "MSAppHost" ) >= 0 ) && parseFloat ( navigator . userAgent . match ( /MSIE ([0-9]+[\.0-9]+)/ ) [ 1 ] ) ; exports . isOldIE = exports . isIE && exports . isIE < 9 ; exports . isGecko = exports . isMozilla = window . controllers && window . navigator . product === "Gecko" ; exports . isOldGecko = exports . isGecko && parseInt ( ( navigator . userAgent . match ( /rv\:(\d+)/ ) || [ ] ) [ 1 ] , 10 ) < 4 ; exports . isOpera = window . opera && Object . prototype . toString . call ( window . opera ) == "[object Opera]" ; exports . isWebKit = parseFloat ( ua . split ( "WebKit/" ) [ 1 ] ) || undefined ; exports . isChrome = parseFloat ( ua . split ( " Chrome/" ) [ 1 ] ) || undefined ; exports . isAIR = ua . indexOf ( "AdobeAIR" ) >= 0 ; exports . isIPad = ua . indexOf ( "iPad" ) >= 0 ; exports . isTouchPad = ua . indexOf ( "TouchPad" ) >= 0 ; } ) ; define ( 'ace/editor' , [ 'require' , 'exports' , 'module' , 'ace/lib/fixoldbrowsers' , 'ace/lib/oop' , 'ace/lib/dom' , 'ace/lib/lang' , 'ace/lib/useragent' , 'ace/keyboard/textinput' , 'ace/mouse/mouse_handler' , 'ace/mouse/fold_handler' , 'ace/keyboard/keybinding' , 'ace/edit_session' , 'ace/search' , 'ace/range' , 'ace/lib/event_emitter' , 'ace/commands/command_manager' , 'ace/commands/default_commands' , 'ace/config' ] , function ( require , exports , module ) { require ( "./lib/fixoldbrowsers" ) ; var oop = require ( "./lib/oop" ) ; var dom = require ( "./lib/dom" ) ; var lang = require ( "./lib/lang" ) ; var useragent = require ( "./lib/useragent" ) ; var TextInput = require ( "./keyboard/textinput" ) . TextInput ; var MouseHandler = require ( "./mouse/mouse_handler" ) . MouseHandler ; var FoldHandler = require ( "./mouse/fold_handler" ) . FoldHandler ; var KeyBinding = require ( "./keyboard/keybinding" ) . KeyBinding ; var EditSession = require ( "./edit_session" ) . EditSession ; var Search = require ( "./search" ) . Search ; var Range = require ( "./range" ) . Range ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var CommandManager = require ( "./commands/command_manager" ) . CommandManager ; var defaultCommands = require ( "./commands/default_commands" ) . commands ; var config = require ( "./config" ) ; var Editor = function ( renderer , session ) { var container = renderer . getContainerElement ( ) ; this . container = container ; this . renderer = renderer ; this . commands = new CommandManager ( useragent . isMac ? "mac" : "win" , defaultCommands ) ; this . textInput = new TextInput ( renderer . getTextAreaContainer ( ) , this ) ; this . renderer . textarea = this . textInput . getElement ( ) ; this . keyBinding = new KeyBinding ( this ) ; this . $mouseHandler = new MouseHandler ( this ) ; new FoldHandler ( this ) ; this . $blockScrolling = 0 ; this . $search = new Search ( ) . set ( { wrap : true } ) ; this . $historyTracker = this . $historyTracker . bind ( this ) ; this . commands . on ( "exec" , this . $historyTracker ) ; this . $initOperationListeners ( ) ; this . _$emitInputEvent = lang . delayedCall ( function ( ) { this . _signal ( "input" , { } ) ; this . session . bgTokenizer && this . session . bgTokenizer . scheduleStart ( ) ; } . bind ( this ) ) ; this . on ( "change" , function ( _ , _self ) { _self . _$emitInputEvent . schedule ( 31 ) ; } ) ; this . setSession ( session || new EditSession ( "" ) ) ; config . resetOptions ( this ) ; config . _emit ( "editor" , this ) ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . $initOperationListeners = function ( ) { function last ( a ) { return a [ a . length - 1 ] } ; this . selections = [ ] ; this . commands . on ( "exec" , function ( e ) { this . startOperation ( e ) ; var command = e . command ; if ( command . group == "fileJump" ) { var prev = this . prevOp ; if ( ! prev || prev . command . group != "fileJump" ) { this . lastFileJumpPos = last ( this . selections ) } } else { this . lastFileJumpPos = null ; } } . bind ( this ) , true ) ; this . commands . on ( "afterExec" , function ( e ) { var command = e . command ; if ( command . group == "fileJump" ) { if ( this . lastFileJumpPos && ! this . curOp . selectionChanged ) { this . selection . fromJSON ( this . lastFileJumpPos ) ; return } }
this . endOperation ( e ) ; } . bind ( this ) , true ) ; this . $opResetTimer = lang . delayedCall ( this . endOperation . bind ( this ) ) ; this . on ( "change" , function ( ) { this . curOp || this . startOperation ( ) ; this . curOp . docChanged = true ; } . bind ( this ) , true ) ; this . on ( "changeSelection" , function ( ) { this . curOp || this . startOperation ( ) ; this . curOp . selectionChanged = true ; } . bind ( this ) , true ) ; }
this . curOp = null ; this . prevOp = { } ; this . startOperation = function ( commadEvent ) { if ( this . curOp ) { if ( ! commadEvent || this . curOp . command )
return ; this . prevOp = this . curOp ; }
if ( ! commadEvent ) { this . previousCommand = null ; commadEvent = { } ; }
this . $opResetTimer . schedule ( ) ; this . curOp = { command : commadEvent . command || { } , args : commadEvent . args } ; this . selections . push ( this . selection . toJSON ( ) ) ; } ; this . endOperation = function ( ) { if ( this . curOp ) { this . prevOp = this . curOp ; this . curOp = null ; } } ; this . $historyTracker = function ( e ) { if ( ! this . $mergeUndoDeltas )
return ; var prev = this . prevOp ; var mergeableCommands = [ "backspace" , "del" , "insertstring" ] ; var shouldMerge = prev . command && ( e . command . name == prev . command . name ) ; if ( e . command . name == "insertstring" ) { var text = e . args ; if ( this . mergeNextCommand === undefined )
this . mergeNextCommand = true ; shouldMerge = shouldMerge && this . mergeNextCommand && ( ! /\s/ . test ( text ) || /\s/ . test ( prev . args ) )
this . mergeNextCommand = true ; } else { shouldMerge = shouldMerge && mergeableCommands . indexOf ( e . command . name ) !== - 1 }
if ( this . $mergeUndoDeltas != "always" && Date . now ( ) - this . sequenceStartTime > 2000 ) { shouldMerge = false ; }
if ( shouldMerge )
this . session . mergeUndoDeltas = true ; else if ( mergeableCommands . indexOf ( e . command . name ) !== - 1 )
this . sequenceStartTime = Date . now ( ) ; } ; this . setKeyboardHandler = function ( keyboardHandler ) { if ( ! keyboardHandler ) { this . keyBinding . setKeyboardHandler ( null ) ; } else if ( typeof keyboardHandler == "string" ) { this . $keybindingId = keyboardHandler ; var _self = this ; config . loadModule ( [ "keybinding" , keyboardHandler ] , function ( module ) { if ( _self . $keybindingId == keyboardHandler )
_self . keyBinding . setKeyboardHandler ( module && module . handler ) ; } ) ; } else { this . $keybindingId = null ; this . keyBinding . setKeyboardHandler ( keyboardHandler ) ; } } ; this . getKeyboardHandler = function ( ) { return this . keyBinding . getKeyboardHandler ( ) ; } ; this . setSession = function ( session ) { if ( this . session == session )
return ; if ( this . session ) { var oldSession = this . session ; this . session . removeEventListener ( "change" , this . $onDocumentChange ) ; this . session . removeEventListener ( "changeMode" , this . $onChangeMode ) ; this . session . removeEventListener ( "tokenizerUpdate" , this . $onTokenizerUpdate ) ; this . session . removeEventListener ( "changeTabSize" , this . $onChangeTabSize ) ; this . session . removeEventListener ( "changeWrapLimit" , this . $onChangeWrapLimit ) ; this . session . removeEventListener ( "changeWrapMode" , this . $onChangeWrapMode ) ; this . session . removeEventListener ( "onChangeFold" , this . $onChangeFold ) ; this . session . removeEventListener ( "changeFrontMarker" , this . $onChangeFrontMarker ) ; this . session . removeEventListener ( "changeBackMarker" , this . $onChangeBackMarker ) ; this . session . removeEventListener ( "changeBreakpoint" , this . $onChangeBreakpoint ) ; this . session . removeEventListener ( "changeAnnotation" , this . $onChangeAnnotation ) ; this . session . removeEventListener ( "changeOverwrite" , this . $onCursorChange ) ; this . session . removeEventListener ( "changeScrollTop" , this . $onScrollTopChange ) ; this . session . removeEventListener ( "changeScrollLeft" , this . $onScrollLeftChange ) ; var selection = this . session . getSelection ( ) ; selection . removeEventListener ( "changeCursor" , this . $onCursorChange ) ; selection . removeEventListener ( "changeSelection" , this . $onSelectionChange ) ; }
this . session = session ; this . $onDocumentChange = this . onDocumentChange . bind ( this ) ; session . addEventListener ( "change" , this . $onDocumentChange ) ; this . renderer . setSession ( session ) ; this . $onChangeMode = this . onChangeMode . bind ( this ) ; session . addEventListener ( "changeMode" , this . $onChangeMode ) ; this . $onTokenizerUpdate = this . onTokenizerUpdate . bind ( this ) ; session . addEventListener ( "tokenizerUpdate" , this . $onTokenizerUpdate ) ; this . $onChangeTabSize = this . renderer . onChangeTabSize . bind ( this . renderer ) ; session . addEventListener ( "changeTabSize" , this . $onChangeTabSize ) ; this . $onChangeWrapLimit = this . onChangeWrapLimit . bind ( this ) ; session . addEventListener ( "changeWrapLimit" , this . $onChangeWrapLimit ) ; this . $onChangeWrapMode = this . onChangeWrapMode . bind ( this ) ; session . addEventListener ( "changeWrapMode" , this . $onChangeWrapMode ) ; this . $onChangeFold = this . onChangeFold . bind ( this ) ; session . addEventListener ( "changeFold" , this . $onChangeFold ) ; this . $onChangeFrontMarker = this . onChangeFrontMarker . bind ( this ) ; this . session . addEventListener ( "changeFrontMarker" , this . $onChangeFrontMarker ) ; this . $onChangeBackMarker = this . onChangeBackMarker . bind ( this ) ; this . session . addEventListener ( "changeBackMarker" , this . $onChangeBackMarker ) ; this . $onChangeBreakpoint = this . onChangeBreakpoint . bind ( this ) ; this . session . addEventListener ( "changeBreakpoint" , this . $onChangeBreakpoint ) ; this . $onChangeAnnotation = this . onChangeAnnotation . bind ( this ) ; this . session . addEventListener ( "changeAnnotation" , this . $onChangeAnnotation ) ; this . $onCursorChange = this . onCursorChange . bind ( this ) ; this . session . addEventListener ( "changeOverwrite" , this . $onCursorChange ) ; this . $onScrollTopChange = this . onScrollTopChange . bind ( this ) ; this . session . addEventListener ( "changeScrollTop" , this . $onScrollTopChange ) ; this . $onScrollLeftChange = this . onScrollLeftChange . bind ( this ) ; this . session . addEventListener ( "changeScrollLeft" , this . $onScrollLeftChange ) ; this . selection = session . getSelection ( ) ; this . selection . addEventListener ( "changeCursor" , this . $onCursorChange ) ; this . $onSelectionChange = this . onSelectionChange . bind ( this ) ; this . selection . addEventListener ( "changeSelection" , this . $onSelectionChange ) ; this . onChangeMode ( ) ; this . $blockScrolling += 1 ; this . onCursorChange ( ) ; this . $blockScrolling -= 1 ; this . onScrollTopChange ( ) ; this . onScrollLeftChange ( ) ; this . onSelectionChange ( ) ; this . onChangeFrontMarker ( ) ; this . onChangeBackMarker ( ) ; this . onChangeBreakpoint ( ) ; this . onChangeAnnotation ( ) ; this . session . getUseWrapMode ( ) && this . renderer . adjustWrapLimit ( ) ; this . renderer . updateFull ( ) ; this . _emit ( "changeSession" , { session : session , oldSession : oldSession } ) ; } ; this . getSession = function ( ) { return this . session ; } ; this . setValue = function ( val , cursorPos ) { this . session . doc . setValue ( val ) ; if ( ! cursorPos )
this . selectAll ( ) ; else if ( cursorPos == 1 )
this . navigateFileEnd ( ) ; else if ( cursorPos == - 1 )
this . navigateFileStart ( ) ; return val ; } ; this . getValue = function ( ) { return this . session . getValue ( ) ; } ; this . getSelection = function ( ) { return this . selection ; } ; this . resize = function ( force ) { this . renderer . onResize ( force ) ; } ; this . setTheme = function ( theme ) { this . renderer . setTheme ( theme ) ; } ; this . getTheme = function ( ) { return this . renderer . getTheme ( ) ; } ; this . setStyle = function ( style ) { this . renderer . setStyle ( style ) ; } ; this . unsetStyle = function ( style ) { this . renderer . unsetStyle ( style ) ; } ; this . getFontSize = function ( ) { return this . getOption ( "fontSize" ) || dom . computedStyle ( this . container , "fontSize" ) ; } ; this . setFontSize = function ( size ) { this . setOption ( "fontSize" , size ) ; } ; this . $highlightBrackets = function ( ) { if ( this . session . $bracketHighlight ) { this . session . removeMarker ( this . session . $bracketHighlight ) ; this . session . $bracketHighlight = null ; }
if ( this . $highlightPending ) { return ; }
var self = this ; this . $highlightPending = true ; setTimeout ( function ( ) { self . $highlightPending = false ; var pos = self . session . findMatchingBracket ( self . getCursorPosition ( ) ) ; if ( pos ) { var range = new Range ( pos . row , pos . column , pos . row , pos . column + 1 ) ; } else if ( self . session . $mode . getMatching ) { var range = self . session . $mode . getMatching ( self . session ) ; }
if ( range )
self . session . $bracketHighlight = self . session . addMarker ( range , "ace_bracket" , "text" ) ; } , 50 ) ; } ; this . focus = function ( ) { var _self = this ; setTimeout ( function ( ) { _self . textInput . focus ( ) ; } ) ; this . textInput . focus ( ) ; } ; this . isFocused = function ( ) { return this . textInput . isFocused ( ) ; } ; this . blur = function ( ) { this . textInput . blur ( ) ; } ; this . onFocus = function ( ) { if ( this . $isFocused )
return ; this . $isFocused = true ; this . renderer . showCursor ( ) ; this . renderer . visualizeFocus ( ) ; this . _emit ( "focus" ) ; } ; this . onBlur = function ( ) { if ( ! this . $isFocused )
return ; this . $isFocused = false ; this . renderer . hideCursor ( ) ; this . renderer . visualizeBlur ( ) ; this . _emit ( "blur" ) ; } ; this . $cursorChange = function ( ) { this . renderer . updateCursor ( ) ; } ; this . onDocumentChange = function ( e ) { var delta = e . data ; var range = delta . range ; var lastRow ; if ( range . start . row == range . end . row && delta . action != "insertLines" && delta . action != "removeLines" )
lastRow = range . end . row ; else
lastRow = Infinity ; this . renderer . updateLines ( range . start . row , lastRow ) ; this . _emit ( "change" , e ) ; this . $cursorChange ( ) ; } ; this . onTokenizerUpdate = function ( e ) { var rows = e . data ; this . renderer . updateLines ( rows . first , rows . last ) ; } ; this . onScrollTopChange = function ( ) { this . renderer . scrollToY ( this . session . getScrollTop ( ) ) ; } ; this . onScrollLeftChange = function ( ) { this . renderer . scrollToX ( this . session . getScrollLeft ( ) ) ; } ; this . onCursorChange = function ( ) { this . $cursorChange ( ) ; if ( ! this . $blockScrolling ) { this . renderer . scrollCursorIntoView ( ) ; }
this . $highlightBrackets ( ) ; this . $updateHighlightActiveLine ( ) ; this . _emit ( "changeSelection" ) ; } ; this . $updateHighlightActiveLine = function ( ) { var session = this . getSession ( ) ; var highlight ; if ( this . $highlightActiveLine ) { if ( ( this . $selectionStyle != "line" || ! this . selection . isMultiLine ( ) ) )
highlight = this . getCursorPosition ( ) ; if ( this . renderer . $maxLines && this . session . getLength ( ) === 1 )
highlight = false ; }
if ( session . $highlightLineMarker && ! highlight ) { session . removeMarker ( session . $highlightLineMarker . id ) ; session . $highlightLineMarker = null ; } else if ( ! session . $highlightLineMarker && highlight ) { var range = new Range ( highlight . row , highlight . column , highlight . row , Infinity ) ; range . id = session . addMarker ( range , "ace_active-line" , "screenLine" ) ; session . $highlightLineMarker = range ; } else if ( highlight ) { session . $highlightLineMarker . start . row = highlight . row ; session . $highlightLineMarker . end . row = highlight . row ; session . $highlightLineMarker . start . column = highlight . column ; session . _emit ( "changeBackMarker" ) ; } } ; this . onSelectionChange = function ( e ) { var session = this . session ; if ( session . $selectionMarker ) { session . removeMarker ( session . $selectionMarker ) ; }
session . $selectionMarker = null ; if ( ! this . selection . isEmpty ( ) ) { var range = this . selection . getRange ( ) ; var style = this . getSelectionStyle ( ) ; session . $selectionMarker = session . addMarker ( range , "ace_selection" , style ) ; } else { this . $updateHighlightActiveLine ( ) ; }
var re = this . $highlightSelectedWord && this . $getSelectionHighLightRegexp ( )
this . session . highlight ( re ) ; this . _emit ( "changeSelection" ) ; } ; this . $getSelectionHighLightRegexp = function ( ) { var session = this . session ; var selection = this . getSelectionRange ( ) ; if ( selection . isEmpty ( ) || selection . isMultiLine ( ) )
return ; var startOuter = selection . start . column - 1 ; var endOuter = selection . end . column + 1 ; var line = session . getLine ( selection . start . row ) ; var lineCols = line . length ; var needle = line . substring ( Math . max ( startOuter , 0 ) , Math . min ( endOuter , lineCols ) ) ; if ( ( startOuter >= 0 && /^[\w\d]/ . test ( needle ) ) || ( endOuter <= lineCols && /[\w\d]$/ . test ( needle ) ) )
return ; needle = line . substring ( selection . start . column , selection . end . column ) ; if ( ! /^[\w\d]+$/ . test ( needle ) )
return ; var re = this . $search . $assembleRegExp ( { wholeWord : true , caseSensitive : true , needle : needle } ) ; return re ; } ; this . onChangeFrontMarker = function ( ) { this . renderer . updateFrontMarkers ( ) ; } ; this . onChangeBackMarker = function ( ) { this . renderer . updateBackMarkers ( ) ; } ; this . onChangeBreakpoint = function ( ) { this . renderer . updateBreakpoints ( ) ; } ; this . onChangeAnnotation = function ( ) { this . renderer . setAnnotations ( this . session . getAnnotations ( ) ) ; } ; this . onChangeMode = function ( e ) { this . renderer . updateText ( ) ; this . _emit ( "changeMode" , e ) ; } ; this . onChangeWrapLimit = function ( ) { this . renderer . updateFull ( ) ; } ; this . onChangeWrapMode = function ( ) { this . renderer . onResize ( true ) ; } ; this . onChangeFold = function ( ) { this . $updateHighlightActiveLine ( ) ; this . renderer . updateFull ( ) ; } ; this . getSelectedText = function ( ) { return this . session . getTextRange ( this . getSelectionRange ( ) ) ; } ; this . getCopyText = function ( ) { var text = this . getSelectedText ( ) ; this . _signal ( "copy" , text ) ; return text ; } ; this . onCopy = function ( ) { this . commands . exec ( "copy" , this ) ; } ; this . onCut = function ( ) { this . commands . exec ( "cut" , this ) ; } ; this . onPaste = function ( text ) { if ( this . $readOnly )
return ; this . _emit ( "paste" , text ) ; this . insert ( text ) ; } ; this . execCommand = function ( command , args ) { this . commands . exec ( command , this , args ) ; } ; this . insert = function ( text ) { var session = this . session ; var mode = session . getMode ( ) ; var cursor = this . getCursorPosition ( ) ; if ( this . getBehavioursEnabled ( ) ) { var transform = mode . transformAction ( session . getState ( cursor . row ) , 'insertion' , this , session , text ) ; if ( transform ) { if ( text !== transform . text ) { this . session . mergeUndoDeltas = false ; this . $mergeNextCommand = false ; }
text = transform . text ; } }
if ( text == "\t" )
text = this . session . getTabString ( ) ; if ( ! this . selection . isEmpty ( ) ) { var range = this . getSelectionRange ( ) ; cursor = this . session . remove ( range ) ; this . clearSelection ( ) ; }
else if ( this . session . getOverwrite ( ) ) { var range = new Range . fromPoints ( cursor , cursor ) ; range . end . column += text . length ; this . session . remove ( range ) ; }
if ( text == "\n" || text == "\r\n" ) { var line = session . getLine ( cursor . row )
if ( cursor . column > line . search ( /\S|$/ ) ) { var d = line . substr ( cursor . column ) . search ( /\S|$/ ) ; session . doc . removeInLine ( cursor . row , cursor . column , cursor . column + d ) ; } }
this . clearSelection ( ) ; var start = cursor . column ; var lineState = session . getState ( cursor . row ) ; var line = session . getLine ( cursor . row ) ; var shouldOutdent = mode . checkOutdent ( lineState , line , text ) ; var end = session . insert ( cursor , text ) ; if ( transform && transform . selection ) { if ( transform . selection . length == 2 ) { this . selection . setSelectionRange ( new Range ( cursor . row , start + transform . selection [ 0 ] , cursor . row , start + transform . selection [ 1 ] ) ) ; } else { this . selection . setSelectionRange ( new Range ( cursor . row + transform . selection [ 0 ] , transform . selection [ 1 ] , cursor . row + transform . selection [ 2 ] , transform . selection [ 3 ] ) ) ; } }
if ( session . getDocument ( ) . isNewLine ( text ) ) { var lineIndent = mode . getNextLineIndent ( lineState , line . slice ( 0 , cursor . column ) , session . getTabString ( ) ) ; session . insert ( { row : cursor . row + 1 , column : 0 } , lineIndent ) ; }
if ( shouldOutdent )
mode . autoOutdent ( lineState , session , cursor . row ) ; } ; this . onTextInput = function ( text ) { this . keyBinding . onTextInput ( text ) ; } ; this . onCommandKey = function ( e , hashId , keyCode ) { this . keyBinding . onCommandKey ( e , hashId , keyCode ) ; } ; this . setOverwrite = function ( overwrite ) { this . session . setOverwrite ( overwrite ) ; } ; this . getOverwrite = function ( ) { return this . session . getOverwrite ( ) ; } ; this . toggleOverwrite = function ( ) { this . session . toggleOverwrite ( ) ; } ; this . setScrollSpeed = function ( speed ) { this . setOption ( "scrollSpeed" , speed ) ; } ; this . getScrollSpeed = function ( ) { return this . getOption ( "scrollSpeed" ) ; } ; this . setDragDelay = function ( dragDelay ) { this . setOption ( "dragDelay" , dragDelay ) ; } ; this . getDragDelay = function ( ) { return this . getOption ( "dragDelay" ) ; } ; this . setSelectionStyle = function ( val ) { this . setOption ( "selectionStyle" , val ) ; } ; this . getSelectionStyle = function ( ) { return this . getOption ( "selectionStyle" ) ; } ; this . setHighlightActiveLine = function ( shouldHighlight ) { this . setOption ( "highlightActiveLine" , shouldHighlight ) ; } ; this . getHighlightActiveLine = function ( ) { return this . getOption ( "highlightActiveLine" ) ; } ; this . setHighlightGutterLine = function ( shouldHighlight ) { this . setOption ( "highlightGutterLine" , shouldHighlight ) ; } ; this . getHighlightGutterLine = function ( ) { return this . getOption ( "highlightGutterLine" ) ; } ; this . setHighlightSelectedWord = function ( shouldHighlight ) { this . setOption ( "highlightSelectedWord" , shouldHighlight ) ; } ; this . getHighlightSelectedWord = function ( ) { return this . $highlightSelectedWord ; } ; this . setAnimatedScroll = function ( shouldAnimate ) { this . renderer . setAnimatedScroll ( shouldAnimate ) ; } ; this . getAnimatedScroll = function ( ) { return this . renderer . getAnimatedScroll ( ) ; } ; this . setShowInvisibles = function ( showInvisibles ) { this . renderer . setShowInvisibles ( showInvisibles ) ; } ; this . getShowInvisibles = function ( ) { return this . renderer . getShowInvisibles ( ) ; } ; this . setDisplayIndentGuides = function ( display ) { this . renderer . setDisplayIndentGuides ( display ) ; } ; this . getDisplayIndentGuides = function ( ) { return this . renderer . getDisplayIndentGuides ( ) ; } ; this . setShowPrintMargin = function ( showPrintMargin ) { this . renderer . setShowPrintMargin ( showPrintMargin ) ; } ; this . getShowPrintMargin = function ( ) { return this . renderer . getShowPrintMargin ( ) ; } ; this . setPrintMarginColumn = function ( showPrintMargin ) { this . renderer . setPrintMarginColumn ( showPrintMargin ) ; } ; this . getPrintMarginColumn = function ( ) { return this . renderer . getPrintMarginColumn ( ) ; } ; this . setReadOnly = function ( readOnly ) { this . setOption ( "readOnly" , readOnly ) ; } ; this . getReadOnly = function ( ) { return this . getOption ( "readOnly" ) ; } ; this . setBehavioursEnabled = function ( enabled ) { this . setOption ( "behavioursEnabled" , enabled ) ; } ; this . getBehavioursEnabled = function ( ) { return this . getOption ( "behavioursEnabled" ) ; } ; this . setWrapBehavioursEnabled = function ( enabled ) { this . setOption ( "wrapBehavioursEnabled" , enabled ) ; } ; this . getWrapBehavioursEnabled = function ( ) { return this . getOption ( "wrapBehavioursEnabled" ) ; } ; this . setShowFoldWidgets = function ( show ) { this . setOption ( "showFoldWidgets" , show ) ; } ; this . getShowFoldWidgets = function ( ) { return this . getOption ( "showFoldWidgets" ) ; } ; this . setFadeFoldWidgets = function ( fade ) { this . setOption ( "fadeFoldWidgets" , fade ) ; } ; this . getFadeFoldWidgets = function ( ) { return this . getOption ( "fadeFoldWidgets" ) ; } ; this . remove = function ( dir ) { if ( this . selection . isEmpty ( ) ) { if ( dir == "left" )
this . selection . selectLeft ( ) ; else
this . selection . selectRight ( ) ; }
var range = this . getSelectionRange ( ) ; if ( this . getBehavioursEnabled ( ) ) { var session = this . session ; var state = session . getState ( range . start . row ) ; var new _range = session . getMode ( ) . transformAction ( state , 'deletion' , this , session , range ) ; if ( range . end . column == 0 ) { var text = session . getTextRange ( range ) ; if ( text [ text . length - 1 ] == "\n" ) { var line = session . getLine ( range . end . row )
if ( /^\s+$/ . test ( line ) ) { range . end . column = line . length } } }
if ( new _range )
range = new _range ; }
this . session . remove ( range ) ; this . clearSelection ( ) ; } ; this . removeWordRight = function ( ) { if ( this . selection . isEmpty ( ) )
this . selection . selectWordRight ( ) ; this . session . remove ( this . getSelectionRange ( ) ) ; this . clearSelection ( ) ; } ; this . removeWordLeft = function ( ) { if ( this . selection . isEmpty ( ) )
this . selection . selectWordLeft ( ) ; this . session . remove ( this . getSelectionRange ( ) ) ; this . clearSelection ( ) ; } ; this . removeToLineStart = function ( ) { if ( this . selection . isEmpty ( ) )
this . selection . selectLineStart ( ) ; this . session . remove ( this . getSelectionRange ( ) ) ; this . clearSelection ( ) ; } ; this . removeToLineEnd = function ( ) { if ( this . selection . isEmpty ( ) )
this . selection . selectLineEnd ( ) ; var range = this . getSelectionRange ( ) ; if ( range . start . column == range . end . column && range . start . row == range . end . row ) { range . end . column = 0 ; range . end . row ++ ; }
this . session . remove ( range ) ; this . clearSelection ( ) ; } ; this . splitLine = function ( ) { if ( ! this . selection . isEmpty ( ) ) { this . session . remove ( this . getSelectionRange ( ) ) ; this . clearSelection ( ) ; }
var cursor = this . getCursorPosition ( ) ; this . insert ( "\n" ) ; this . moveCursorToPosition ( cursor ) ; } ; this . transposeLetters = function ( ) { if ( ! this . selection . isEmpty ( ) ) { return ; }
var cursor = this . getCursorPosition ( ) ; var column = cursor . column ; if ( column === 0 )
return ; var line = this . session . getLine ( cursor . row ) ; var swap , range ; if ( column < line . length ) { swap = line . charAt ( column ) + line . charAt ( column - 1 ) ; range = new Range ( cursor . row , column - 1 , cursor . row , column + 1 ) ; }
else { swap = line . charAt ( column - 1 ) + line . charAt ( column - 2 ) ; range = new Range ( cursor . row , column - 2 , cursor . row , column ) ; }
this . session . replace ( range , swap ) ; } ; this . toLowerCase = function ( ) { var originalRange = this . getSelectionRange ( ) ; if ( this . selection . isEmpty ( ) ) { this . selection . selectWord ( ) ; }
var range = this . getSelectionRange ( ) ; var text = this . session . getTextRange ( range ) ; this . session . replace ( range , text . toLowerCase ( ) ) ; this . selection . setSelectionRange ( originalRange ) ; } ; this . toUpperCase = function ( ) { var originalRange = this . getSelectionRange ( ) ; if ( this . selection . isEmpty ( ) ) { this . selection . selectWord ( ) ; }
var range = this . getSelectionRange ( ) ; var text = this . session . getTextRange ( range ) ; this . session . replace ( range , text . toUpperCase ( ) ) ; this . selection . setSelectionRange ( originalRange ) ; } ; this . indent = function ( ) { var session = this . session ; var range = this . getSelectionRange ( ) ; if ( range . start . row < range . end . row ) { var rows = this . $getSelectedRows ( ) ; session . indentRows ( rows . first , rows . last , "\t" ) ; return ; } else if ( range . start . column < range . end . column ) { var text = session . getTextRange ( range )
if ( ! /^\s+$/ . test ( text ) ) { var rows = this . $getSelectedRows ( ) ; session . indentRows ( rows . first , rows . last , "\t" ) ; return ; } }
var line = session . getLine ( range . start . row )
var position = range . start ; var size = session . getTabSize ( ) ; var column = session . documentToScreenColumn ( position . row , position . column ) ; if ( this . session . getUseSoftTabs ( ) ) { var count = ( size - column % size ) ; var indentString = lang . stringRepeat ( " " , count ) ; } else { var count = column % size ; while ( line [ range . start . column ] == " " && count ) { range . start . column -- ; count -- ; }
this . selection . setSelectionRange ( range ) ; indentString = "\t" ; }
return this . insert ( indentString ) ; } ; this . blockIndent = function ( ) { var rows = this . $getSelectedRows ( ) ; this . session . indentRows ( rows . first , rows . last , "\t" ) ; } ; this . blockOutdent = function ( ) { var selection = this . session . getSelection ( ) ; this . session . outdentRows ( selection . getRange ( ) ) ; } ; this . sortLines = function ( ) { var rows = this . $getSelectedRows ( ) ; var session = this . session ; var lines = [ ] ; for ( i = rows . first ; i <= rows . last ; i ++ )
lines . push ( session . getLine ( i ) ) ; lines . sort ( function ( a , b ) { if ( a . toLowerCase ( ) < b . toLowerCase ( ) ) return - 1 ; if ( a . toLowerCase ( ) > b . toLowerCase ( ) ) return 1 ; return 0 ; } ) ; var deleteRange = new Range ( 0 , 0 , 0 , 0 ) ; for ( var i = rows . first ; i <= rows . last ; i ++ ) { var line = session . getLine ( i ) ; deleteRange . start . row = i ; deleteRange . end . row = i ; deleteRange . end . column = line . length ; session . replace ( deleteRange , lines [ i - rows . first ] ) ; } } ; this . toggleCommentLines = function ( ) { var state = this . session . getState ( this . getCursorPosition ( ) . row ) ; var rows = this . $getSelectedRows ( ) ; this . session . getMode ( ) . toggleCommentLines ( state , this . session , rows . first , rows . last ) ; } ; this . toggleBlockComment = function ( ) { var cursor = this . getCursorPosition ( ) ; var state = this . session . getState ( cursor . row ) ; var range = this . getSelectionRange ( ) ; this . session . getMode ( ) . toggleBlockComment ( state , this . session , range , cursor ) ; } ; this . getNumberAt = function ( row , column ) { var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g
_numberRx . lastIndex = 0
var s = this . session . getLine ( row )
while ( _numberRx . lastIndex < column ) { var m = _numberRx . exec ( s )
if ( m . index <= column && m . index + m [ 0 ] . length >= column ) { var number = { value : m [ 0 ] , start : m . index , end : m . index + m [ 0 ] . length }
return number ; } }
return null ; } ; this . modifyNumber = function ( amount ) { var row = this . selection . getCursor ( ) . row ; var column = this . selection . getCursor ( ) . column ; var charRange = new Range ( row , column - 1 , row , column ) ; var c = this . session . getTextRange ( charRange ) ; if ( ! isNaN ( parseFloat ( c ) ) && isFinite ( c ) ) { var nr = this . getNumberAt ( row , column ) ; if ( nr ) { var fp = nr . value . indexOf ( "." ) >= 0 ? nr . start + nr . value . indexOf ( "." ) + 1 : nr . end ; var decimals = nr . start + nr . value . length - fp ; var t = parseFloat ( nr . value ) ; t *= Math . pow ( 10 , decimals ) ; if ( fp !== nr . end && column < fp ) { amount *= Math . pow ( 10 , nr . end - column - 1 ) ; } else { amount *= Math . pow ( 10 , nr . end - column ) ; }
t += amount ; t /= Math . pow ( 10 , decimals ) ; var nnr = t . toFixed ( decimals ) ; var replaceRange = new Range ( row , nr . start , row , nr . end ) ; this . session . replace ( replaceRange , nnr ) ; this . moveCursorTo ( row , Math . max ( nr . start + 1 , column + nnr . length - nr . value . length ) ) ; } } } ; this . removeLines = function ( ) { var rows = this . $getSelectedRows ( ) ; var range ; if ( rows . first === 0 || rows . last + 1 < this . session . getLength ( ) )
range = new Range ( rows . first , 0 , rows . last + 1 , 0 ) ; else
range = new Range ( rows . first - 1 , this . session . getLine ( rows . first - 1 ) . length , rows . last , this . session . getLine ( rows . last ) . length ) ; this . session . remove ( range ) ; this . clearSelection ( ) ; } ; this . duplicateSelection = function ( ) { var sel = this . selection ; var doc = this . session ; var range = sel . getRange ( ) ; var reverse = sel . isBackwards ( ) ; if ( range . isEmpty ( ) ) { var row = range . start . row ; doc . duplicateLines ( row , row ) ; } else { var point = reverse ? range . start : range . end ; var endPoint = doc . insert ( point , doc . getTextRange ( range ) , false ) ; range . start = point ; range . end = endPoint ; sel . setSelectionRange ( range , reverse ) } } ; this . moveLinesDown = function ( ) { this . $moveLines ( function ( firstRow , lastRow ) { return this . session . moveLinesDown ( firstRow , lastRow ) ; } ) ; } ; this . moveLinesUp = function ( ) { this . $moveLines ( function ( firstRow , lastRow ) { return this . session . moveLinesUp ( firstRow , lastRow ) ; } ) ; } ; this . moveText = function ( range , toPosition , copy ) { return this . session . moveText ( range , toPosition , copy ) ; } ; this . copyLinesUp = function ( ) { this . $moveLines ( function ( firstRow , lastRow ) { this . session . duplicateLines ( firstRow , lastRow ) ; return 0 ; } ) ; } ; this . copyLinesDown = function ( ) { this . $moveLines ( function ( firstRow , lastRow ) { return this . session . duplicateLines ( firstRow , lastRow ) ; } ) ; } ; this . $moveLines = function ( mover ) { var selection = this . selection ; if ( ! selection . inMultiSelectMode || this . inVirtualSelectionMode ) { var range = selection . toOrientedRange ( ) ; var rows = this . $getSelectedRows ( range ) ; var linesMoved = mover . call ( this , rows . first , rows . last ) ; range . moveBy ( linesMoved , 0 ) ; selection . fromOrientedRange ( range ) ; } else { var ranges = selection . rangeList . ranges ; selection . rangeList . detach ( this . session ) ; for ( var i = ranges . length ; i -- ; ) { var rangeIndex = i ; var rows = ranges [ i ] . collapseRows ( ) ; var last = rows . end . row ; var first = rows . start . row ; while ( i -- ) { var rows = ranges [ i ] . collapseRows ( ) ; if ( first - rows . end . row <= 1 )
first = rows . end . row ; else
break ; }
i ++ ; var linesMoved = mover . call ( this , first , last ) ; while ( rangeIndex >= i ) { ranges [ rangeIndex ] . moveBy ( linesMoved , 0 ) ; rangeIndex -- ; } }
selection . fromOrientedRange ( selection . ranges [ 0 ] ) ; selection . rangeList . attach ( this . session ) ; } } ; this . $getSelectedRows = function ( ) { var range = this . getSelectionRange ( ) . collapseRows ( ) ; return { first : range . start . row , last : range . end . row } ; } ; this . onCompositionStart = function ( text ) { this . renderer . showComposition ( this . getCursorPosition ( ) ) ; } ; this . onCompositionUpdate = function ( text ) { this . renderer . setCompositionText ( text ) ; } ; this . onCompositionEnd = function ( ) { this . renderer . hideComposition ( ) ; } ; this . getFirstVisibleRow = function ( ) { return this . renderer . getFirstVisibleRow ( ) ; } ; this . getLastVisibleRow = function ( ) { return this . renderer . getLastVisibleRow ( ) ; } ; this . isRowVisible = function ( row ) { return ( row >= this . getFirstVisibleRow ( ) && row <= this . getLastVisibleRow ( ) ) ; } ; this . isRowFullyVisible = function ( row ) { return ( row >= this . renderer . getFirstFullyVisibleRow ( ) && row <= this . renderer . getLastFullyVisibleRow ( ) ) ; } ; this . $getVisibleRowCount = function ( ) { return this . renderer . getScrollBottomRow ( ) - this . renderer . getScrollTopRow ( ) + 1 ; } ; this . $moveByPage = function ( dir , select ) { var renderer = this . renderer ; var config = this . renderer . layerConfig ; var rows = dir * Math . floor ( config . height / config . lineHeight ) ; this . $blockScrolling ++ ; if ( select == true ) { this . selection . $moveSelection ( function ( ) { this . moveCursorBy ( rows , 0 ) ; } ) ; } else if ( select == false ) { this . selection . moveCursorBy ( rows , 0 ) ; this . selection . clearSelection ( ) ; }
this . $blockScrolling -- ; var scrollTop = renderer . scrollTop ; renderer . scrollBy ( 0 , rows * config . lineHeight ) ; if ( select != null )
renderer . scrollCursorIntoView ( null , 0.5 ) ; renderer . animateScrolling ( scrollTop ) ; } ; this . selectPageDown = function ( ) { this . $moveByPage ( 1 , true ) ; } ; this . selectPageUp = function ( ) { this . $moveByPage ( - 1 , true ) ; } ; this . gotoPageDown = function ( ) { this . $moveByPage ( 1 , false ) ; } ; this . gotoPageUp = function ( ) { this . $moveByPage ( - 1 , false ) ; } ; this . scrollPageDown = function ( ) { this . $moveByPage ( 1 ) ; } ; this . scrollPageUp = function ( ) { this . $moveByPage ( - 1 ) ; } ; this . scrollToRow = function ( row ) { this . renderer . scrollToRow ( row ) ; } ; this . scrollToLine = function ( line , center , animate , callback ) { this . renderer . scrollToLine ( line , center , animate , callback ) ; } ; this . centerSelection = function ( ) { var range = this . getSelectionRange ( ) ; var pos = { row : Math . floor ( range . start . row + ( range . end . row - range . start . row ) / 2 ) , column : Math . floor ( range . start . column + ( range . end . column - range . start . column ) / 2 ) }
this . renderer . alignCursor ( pos , 0.5 ) ; } ; this . getCursorPosition = function ( ) { return this . selection . getCursor ( ) ; } ; this . getCursorPositionScreen = function ( ) { return this . session . documentToScreenPosition ( this . getCursorPosition ( ) ) ; } ; this . getSelectionRange = function ( ) { return this . selection . getRange ( ) ; } ; this . selectAll = function ( ) { this . $blockScrolling += 1 ; this . selection . selectAll ( ) ; this . $blockScrolling -= 1 ; } ; this . clearSelection = function ( ) { this . selection . clearSelection ( ) ; } ; this . moveCursorTo = function ( row , column ) { this . selection . moveCursorTo ( row , column ) ; } ; this . moveCursorToPosition = function ( pos ) { this . selection . moveCursorToPosition ( pos ) ; } ; this . jumpToMatching = function ( select ) { var cursor = this . getCursorPosition ( ) ; var range = this . session . getBracketRange ( cursor ) ; if ( ! range ) { range = this . find ( { needle : /[{}()\[\]]/g , preventScroll : true , start : { row : cursor . row , column : cursor . column - 1 } } ) ; if ( ! range )
return ; var pos = range . start ; if ( pos . row == cursor . row && Math . abs ( pos . column - cursor . column ) < 2 )
range = this . session . getBracketRange ( pos ) ; }
pos = range && range . cursor || pos ; if ( pos ) { if ( select ) { if ( range && range . isEqual ( this . getSelectionRange ( ) ) )
this . clearSelection ( ) ; else
this . selection . selectTo ( pos . row , pos . column ) ; } else { this . clearSelection ( ) ; this . moveCursorTo ( pos . row , pos . column ) ; } } } ; this . gotoLine = function ( lineNumber , column , animate ) { this . selection . clearSelection ( ) ; this . session . unfold ( { row : lineNumber - 1 , column : column || 0 } ) ; this . $blockScrolling += 1 ; this . exitMultiSelectMode && this . exitMultiSelectMode ( ) ; this . moveCursorTo ( lineNumber - 1 , column || 0 ) ; this . $blockScrolling -= 1 ; if ( ! this . isRowFullyVisible ( lineNumber - 1 ) )
this . scrollToLine ( lineNumber - 1 , true , animate ) ; } ; this . navigateTo = function ( row , column ) { this . clearSelection ( ) ; this . moveCursorTo ( row , column ) ; } ; this . navigateUp = function ( times ) { if ( this . selection . isMultiLine ( ) && ! this . selection . isBackwards ( ) ) { var selectionStart = this . selection . anchor . getPosition ( ) ; return this . moveCursorToPosition ( selectionStart ) ; }
this . selection . clearSelection ( ) ; times = times || 1 ; this . selection . moveCursorBy ( - times , 0 ) ; } ; this . navigateDown = function ( times ) { if ( this . selection . isMultiLine ( ) && this . selection . isBackwards ( ) ) { var selectionEnd = this . selection . anchor . getPosition ( ) ; return this . moveCursorToPosition ( selectionEnd ) ; }
this . selection . clearSelection ( ) ; times = times || 1 ; this . selection . moveCursorBy ( times , 0 ) ; } ; this . navigateLeft = function ( times ) { if ( ! this . selection . isEmpty ( ) ) { var selectionStart = this . getSelectionRange ( ) . start ; this . moveCursorToPosition ( selectionStart ) ; }
else { times = times || 1 ; while ( times -- ) { this . selection . moveCursorLeft ( ) ; } }
this . clearSelection ( ) ; } ; this . navigateRight = function ( times ) { if ( ! this . selection . isEmpty ( ) ) { var selectionEnd = this . getSelectionRange ( ) . end ; this . moveCursorToPosition ( selectionEnd ) ; }
else { times = times || 1 ; while ( times -- ) { this . selection . moveCursorRight ( ) ; } }
this . clearSelection ( ) ; } ; this . navigateLineStart = function ( ) { this . selection . moveCursorLineStart ( ) ; this . clearSelection ( ) ; } ; this . navigateLineEnd = function ( ) { this . selection . moveCursorLineEnd ( ) ; this . clearSelection ( ) ; } ; this . navigateFileEnd = function ( ) { var scrollTop = this . renderer . scrollTop ; this . selection . moveCursorFileEnd ( ) ; this . clearSelection ( ) ; this . renderer . animateScrolling ( scrollTop ) ; } ; this . navigateFileStart = function ( ) { var scrollTop = this . renderer . scrollTop ; this . selection . moveCursorFileStart ( ) ; this . clearSelection ( ) ; this . renderer . animateScrolling ( scrollTop ) ; } ; this . navigateWordRight = function ( ) { this . selection . moveCursorWordRight ( ) ; this . clearSelection ( ) ; } ; this . navigateWordLeft = function ( ) { this . selection . moveCursorWordLeft ( ) ; this . clearSelection ( ) ; } ; this . replace = function ( replacement , options ) { if ( options )
this . $search . set ( options ) ; var range = this . $search . find ( this . session ) ; var replaced = 0 ; if ( ! range )
return replaced ; if ( this . $tryReplace ( range , replacement ) ) { replaced = 1 ; }
if ( range !== null ) { this . selection . setSelectionRange ( range ) ; this . renderer . scrollSelectionIntoView ( range . start , range . end ) ; }
return replaced ; } ; this . replaceAll = function ( replacement , options ) { if ( options ) { this . $search . set ( options ) ; }
var ranges = this . $search . findAll ( this . session ) ; var replaced = 0 ; if ( ! ranges . length )
return replaced ; this . $blockScrolling += 1 ; var selection = this . getSelectionRange ( ) ; this . clearSelection ( ) ; this . selection . moveCursorTo ( 0 , 0 ) ; for ( var i = ranges . length - 1 ; i >= 0 ; -- i ) { if ( this . $tryReplace ( ranges [ i ] , replacement ) ) { replaced ++ ; } }
this . selection . setSelectionRange ( selection ) ; this . $blockScrolling -= 1 ; return replaced ; } ; this . $tryReplace = function ( range , replacement ) { var input = this . session . getTextRange ( range ) ; replacement = this . $search . replace ( input , replacement ) ; if ( replacement !== null ) { range . end = this . session . replace ( range , replacement ) ; return range ; } else { return null ; } } ; this . getLastSearchOptions = function ( ) { return this . $search . getOptions ( ) ; } ; this . find = function ( needle , options , animate ) { if ( ! options )
options = { } ; if ( typeof needle == "string" || needle instanceof RegExp )
options . needle = needle ; else if ( typeof needle == "object" )
oop . mixin ( options , needle ) ; var range = this . selection . getRange ( ) ; if ( options . needle == null ) { needle = this . session . getTextRange ( range ) || this . $search . $options . needle ; if ( ! needle ) { range = this . session . getWordRange ( range . start . row , range . start . column ) ; needle = this . session . getTextRange ( range ) ; }
this . $search . set ( { needle : needle } ) ; }
this . $search . set ( options ) ; if ( ! options . start )
this . $search . set ( { start : range } ) ; var newRange = this . $search . find ( this . session ) ; if ( options . preventScroll )
return newRange ; if ( newRange ) { this . revealRange ( newRange , animate ) ; return newRange ; }
if ( options . backwards )
range . start = range . end ; else
range . end = range . start ; this . selection . setRange ( range ) ; } ; this . findNext = function ( options , animate ) { this . find ( { skipCurrent : true , backwards : false } , options , animate ) ; } ; this . findPrevious = function ( options , animate ) { this . find ( options , { skipCurrent : true , backwards : true } , animate ) ; } ; this . revealRange = function ( range , animate ) { this . $blockScrolling += 1 ; this . session . unfold ( range ) ; this . selection . setSelectionRange ( range ) ; this . $blockScrolling -= 1 ; var scrollTop = this . renderer . scrollTop ; this . renderer . scrollSelectionIntoView ( range . start , range . end , 0.5 ) ; if ( animate != false )
this . renderer . animateScrolling ( scrollTop ) ; } ; this . undo = function ( ) { this . $blockScrolling ++ ; this . session . getUndoManager ( ) . undo ( ) ; this . $blockScrolling -- ; this . renderer . scrollCursorIntoView ( null , 0.5 ) ; } ; this . redo = function ( ) { this . $blockScrolling ++ ; this . session . getUndoManager ( ) . redo ( ) ; this . $blockScrolling -- ; this . renderer . scrollCursorIntoView ( null , 0.5 ) ; } ; this . destroy = function ( ) { this . renderer . destroy ( ) ; this . _emit ( "destroy" , this ) ; } ; this . setAutoScrollEditorIntoView = function ( enable ) { if ( enable === false )
return ; var rect ; var self = this ; var shouldScroll = false ; if ( ! this . $scrollAnchor )
this . $scrollAnchor = document . createElement ( "div" ) ; var scrollAnchor = this . $scrollAnchor ; scrollAnchor . style . cssText = "position:absolute" ; this . container . insertBefore ( scrollAnchor , this . container . firstChild ) ; var onChangeSelection = this . on ( "changeSelection" , function ( ) { shouldScroll = true ; } ) ; var onBeforeRender = this . renderer . on ( "beforeRender" , function ( ) { if ( shouldScroll )
rect = self . renderer . container . getBoundingClientRect ( ) ; } ) ; var onAfterRender = this . renderer . on ( "afterRender" , function ( ) { if ( shouldScroll && rect && self . isFocused ( ) ) { var renderer = self . renderer ; var pos = renderer . $cursorLayer . $pixelPos ; var config = renderer . layerConfig ; var top = pos . top - config . offset ; if ( pos . top >= 0 && top + rect . top < 0 ) { shouldScroll = true ; } else if ( pos . top < config . height && pos . top + rect . top + config . lineHeight > window . innerHeight ) { shouldScroll = false ; } else { shouldScroll = null ; }
if ( shouldScroll != null ) { scrollAnchor . style . top = top + "px" ; scrollAnchor . style . left = pos . left + "px" ; scrollAnchor . style . height = config . lineHeight + "px" ; scrollAnchor . scrollIntoView ( shouldScroll ) ; }
shouldScroll = rect = null ; } } ) ; this . setAutoScrollEditorIntoView = function ( enable ) { if ( enable === true )
return ; delete this . setAutoScrollEditorIntoView ; this . removeEventListener ( "changeSelection" , onChangeSelection ) ; this . renderer . removeEventListener ( "afterRender" , onAfterRender ) ; this . renderer . removeEventListener ( "beforeRender" , onBeforeRender ) ; } ; } ; this . $resetCursorStyle = function ( ) { var style = this . $cursorStyle || "ace" ; var cursorLayer = this . renderer . $cursorLayer ; if ( ! cursorLayer )
return ; cursorLayer . setSmoothBlinking ( style == "smooth" ) ; cursorLayer . isBlinking = ! this . $readOnly && style != "wide" ; } ; } ) . call ( Editor . prototype ) ; config . defineOptions ( Editor . prototype , "editor" , { selectionStyle : { set : function ( style ) { this . onSelectionChange ( ) ; this . _emit ( "changeSelectionStyle" , { data : style } ) ; } , initialValue : "line" } , highlightActiveLine : { set : function ( ) { this . $updateHighlightActiveLine ( ) ; } , initialValue : true } , highlightSelectedWord : { set : function ( shouldHighlight ) { this . $onSelectionChange ( ) ; } , initialValue : true } , readOnly : { set : function ( readOnly ) { this . textInput . setReadOnly ( readOnly ) ; this . $resetCursorStyle ( ) ; } , initialValue : false } , cursorStyle : { set : function ( val ) { this . $resetCursorStyle ( ) ; } , values : [ "ace" , "slim" , "smooth" , "wide" ] , initialValue : "ace" } , mergeUndoDeltas : { values : [ false , true , "always" ] , initialValue : true } , behavioursEnabled : { initialValue : true } , wrapBehavioursEnabled : { initialValue : true } , hScrollBarAlwaysVisible : "renderer" , vScrollBarAlwaysVisible : "renderer" , highlightGutterLine : "renderer" , animatedScroll : "renderer" , showInvisibles : "renderer" , showPrintMargin : "renderer" , printMarginColumn : "renderer" , printMargin : "renderer" , fadeFoldWidgets : "renderer" , showFoldWidgets : "renderer" , showGutter : "renderer" , displayIndentGuides : "renderer" , fontSize : "renderer" , fontFamily : "renderer" , maxLines : "renderer" , minLines : "renderer" , scrollPastEnd : "renderer" , fixedWidthGutter : "renderer" , scrollSpeed : "$mouseHandler" , dragDelay : "$mouseHandler" , dragEnabled : "$mouseHandler" , focusTimout : "$mouseHandler" , firstLineNumber : "session" , overwrite : "session" , newLineMode : "session" , useWorker : "session" , useSoftTabs : "session" , tabSize : "session" , wrap : "session" , foldStyle : "session" } ) ; exports . Editor = Editor ; } ) ; define ( 'ace/lib/lang' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { exports . stringReverse = function ( string ) { return string . split ( "" ) . reverse ( ) . join ( "" ) ; } ; exports . stringRepeat = function ( string , count ) { var result = '' ; while ( count > 0 ) { if ( count & 1 )
result += string ; if ( count >>= 1 )
string += string ; }
return result ; } ; var trimBeginRegexp = /^\s\s*/ ; var trimEndRegexp = /\s\s*$/ ; exports . stringTrimLeft = function ( string ) { return string . replace ( trimBeginRegexp , '' ) ; } ; exports . stringTrimRight = function ( string ) { return string . replace ( trimEndRegexp , '' ) ; } ; exports . copyObject = function ( obj ) { var copy = { } ; for ( var key in obj ) { copy [ key ] = obj [ key ] ; }
return copy ; } ; exports . copyArray = function ( array ) { var copy = [ ] ; for ( var i = 0 , l = array . length ; i < l ; i ++ ) { if ( array [ i ] && typeof array [ i ] == "object" )
copy [ i ] = this . copyObject ( array [ i ] ) ; else
copy [ i ] = array [ i ] ; }
return copy ; } ; exports . deepCopy = function ( obj ) { if ( typeof obj != "object" ) { return obj ; }
var copy = obj . constructor ( ) ; for ( var key in obj ) { if ( typeof obj [ key ] == "object" ) { copy [ key ] = this . deepCopy ( obj [ key ] ) ; } else { copy [ key ] = obj [ key ] ; } }
return copy ; } ; exports . arrayToMap = function ( arr ) { var map = { } ; for ( var i = 0 ; i < arr . length ; i ++ ) { map [ arr [ i ] ] = 1 ; }
return map ; } ; exports . createMap = function ( props ) { var map = Object . create ( null ) ; for ( var i in props ) { map [ i ] = props [ i ] ; }
return map ; } ; exports . arrayRemove = function ( array , value ) { for ( var i = 0 ; i <= array . length ; i ++ ) { if ( value === array [ i ] ) { array . splice ( i , 1 ) ; } } } ; exports . escapeRegExp = function ( str ) { return str . replace ( /([.*+?^${}()|[\]\/\\])/g , '\\$1' ) ; } ; exports . escapeHTML = function ( str ) { return str . replace ( /&/g , "&" ) . replace ( /"/g , """ ) . replace ( /'/g , "'" ) . replace ( /</g , "<" ) ; } ; exports . getMatchOffsets = function ( string , regExp ) { var matches = [ ] ; string . replace ( regExp , function ( str ) { matches . push ( { offset : arguments [ arguments . length - 2 ] , length : str . length } ) ; } ) ; return matches ; } ; exports . deferredCall = function ( fcn ) { var timer = null ; var callback = function ( ) { timer = null ; fcn ( ) ; } ; var deferred = function ( timeout ) { deferred . cancel ( ) ; timer = setTimeout ( callback , timeout || 0 ) ; return deferred ; } ; deferred . schedule = deferred ; deferred . call = function ( ) { this . cancel ( ) ; fcn ( ) ; return deferred ; } ; deferred . cancel = function ( ) { clearTimeout ( timer ) ; timer = null ; return deferred ; } ; return deferred ; } ; exports . delayedCall = function ( fcn , defaultTimeout ) { var timer = null ; var callback = function ( ) { timer = null ; fcn ( ) ; } ; var _self = function ( timeout ) { timer && clearTimeout ( timer ) ; timer = setTimeout ( callback , timeout || defaultTimeout ) ; } ; _self . delay = _self ; _self . schedule = function ( timeout ) { if ( timer == null )
timer = setTimeout ( callback , timeout || 0 ) ; } ; _self . call = function ( ) { this . cancel ( ) ; fcn ( ) ; } ; _self . cancel = function ( ) { timer && clearTimeout ( timer ) ; timer = null ; } ; _self . isPending = function ( ) { return timer ; } ; return _self ; } ; } ) ; define ( 'ace/keyboard/textinput' , [ 'require' , 'exports' , 'module' , 'ace/lib/event' , 'ace/lib/useragent' , 'ace/lib/dom' , 'ace/lib/lang' ] , function ( require , exports , module ) { var event = require ( "../lib/event" ) ; var useragent = require ( "../lib/useragent" ) ; var dom = require ( "../lib/dom" ) ; var lang = require ( "../lib/lang" ) ; var BROKEN _SETDATA = useragent . isChrome < 18 ; var TextInput = function ( parentNode , host ) { var text = dom . createElement ( "textarea" ) ; text . className = "ace_text-input" ; if ( useragent . isTouchPad )
text . setAttribute ( "x-palm-disable-auto-cap" , true ) ; text . wrap = "off" ; text . autocorrect = "off" ; text . autocapitalize = "off" ; text . spellcheck = false ; text . style . opacity = "0" ; parentNode . insertBefore ( text , parentNode . firstChild ) ; var PLACEHOLDER = "\x01\x01" ; var cut = false ; var copied = false ; var pasted = false ; var inComposition = false ; var tempStyle = '' ; var isSelectionEmpty = true ; try { var isFocused = document . activeElement === text ; } catch ( e ) { }
event . addListener ( text , "blur" , function ( ) { host . onBlur ( ) ; isFocused = false ; } ) ; event . addListener ( text , "focus" , function ( ) { isFocused = true ; host . onFocus ( ) ; resetSelection ( ) ; } ) ; this . focus = function ( ) { text . focus ( ) ; } ; this . blur = function ( ) { text . blur ( ) ; } ; this . isFocused = function ( ) { return isFocused ; } ; var syncSelection = lang . delayedCall ( function ( ) { isFocused && resetSelection ( isSelectionEmpty ) ; } ) ; var syncValue = lang . delayedCall ( function ( ) { if ( ! inComposition ) { text . value = PLACEHOLDER ; isFocused && resetSelection ( ) ; } } ) ; function resetSelection ( isEmpty ) { if ( inComposition )
return ; if ( inputHandler ) { selectionStart = 0 ; selectionEnd = isEmpty ? 0 : text . value . length - 1 ; } else { var selectionStart = isEmpty ? 2 : 1 ; var selectionEnd = 2 ; }
try { text . setSelectionRange ( selectionStart , selectionEnd ) ; } catch ( e ) { } }
function resetValue ( ) { if ( inComposition )
return ; text . value = PLACEHOLDER ; if ( useragent . isWebKit )
syncValue . schedule ( ) ; }
useragent . isWebKit || host . addEventListener ( 'changeSelection' , function ( ) { if ( host . selection . isEmpty ( ) != isSelectionEmpty ) { isSelectionEmpty = ! isSelectionEmpty ; syncSelection . schedule ( ) ; } } ) ; resetValue ( ) ; if ( isFocused )
host . onFocus ( ) ; var isAllSelected = function ( text ) { return text . selectionStart === 0 && text . selectionEnd === text . value . length ; } ; if ( ! text . setSelectionRange && text . createTextRange ) { text . setSelectionRange = function ( selectionStart , selectionEnd ) { var range = this . createTextRange ( ) ; range . collapse ( true ) ; range . moveStart ( 'character' , selectionStart ) ; range . moveEnd ( 'character' , selectionEnd ) ; range . select ( ) ; } ; isAllSelected = function ( text ) { try { var range = text . ownerDocument . selection . createRange ( ) ; } catch ( e ) { }
if ( ! range || range . parentElement ( ) != text ) return false ; return range . text == text . value ; } }
if ( useragent . isOldIE ) { var inPropertyChange = false ; var onPropertyChange = function ( e ) { if ( inPropertyChange )
return ; var data = text . value ; if ( inComposition || ! data || data == PLACEHOLDER )
return ; if ( e && data == PLACEHOLDER [ 0 ] )
return syncProperty . schedule ( ) ; sendText ( data ) ; inPropertyChange = true ; resetValue ( ) ; inPropertyChange = false ; } ; var syncProperty = lang . delayedCall ( onPropertyChange ) ; event . addListener ( text , "propertychange" , onPropertyChange ) ; var keytable = { 13 : 1 , 27 : 1 } ; event . addListener ( text , "keyup" , function ( e ) { if ( inComposition && ( ! text . value || keytable [ e . keyCode ] ) )
setTimeout ( onCompositionEnd , 0 ) ; if ( ( text . value . charCodeAt ( 0 ) || 0 ) < 129 ) { return syncProperty . call ( ) ; }
inComposition ? onCompositionUpdate ( ) : onCompositionStart ( ) ; } ) ; event . addListener ( text , "keydown" , function ( e ) { syncProperty . schedule ( 50 ) ; } ) ; }
var onSelect = function ( e ) { if ( cut ) { cut = false ; } else if ( copied ) { copied = false ; } else if ( isAllSelected ( text ) ) { host . selectAll ( ) ; resetSelection ( ) ; } else if ( inputHandler ) { resetSelection ( host . selection . isEmpty ( ) ) ; } } ; var inputHandler = null ; this . setInputHandler = function ( cb ) { inputHandler = cb } ; this . getInputHandler = function ( ) { return inputHandler } ; var afterContextMenu = false ; var sendText = function ( data ) { if ( inputHandler ) { data = inputHandler ( data ) ; inputHandler = null ; }
if ( pasted ) { resetSelection ( ) ; if ( data )
host . onPaste ( data ) ; pasted = false ; } else if ( data == PLACEHOLDER . charAt ( 0 ) ) { if ( afterContextMenu )
host . execCommand ( "del" , { source : "ace" } ) ; } else { if ( data . substring ( 0 , 2 ) == PLACEHOLDER )
data = data . substr ( 2 ) ; else if ( data . charAt ( 0 ) == PLACEHOLDER . charAt ( 0 ) )
data = data . substr ( 1 ) ; else if ( data . charAt ( data . length - 1 ) == PLACEHOLDER . charAt ( 0 ) )
data = data . slice ( 0 , - 1 ) ; if ( data . charAt ( data . length - 1 ) == PLACEHOLDER . charAt ( 0 ) )
data = data . slice ( 0 , - 1 ) ; if ( data )
host . onTextInput ( data ) ; }
if ( afterContextMenu )
afterContextMenu = false ; } ; var onInput = function ( e ) { if ( inComposition )
return ; var data = text . value ; sendText ( data ) ; resetValue ( ) ; } ; var onCut = function ( e ) { var data = host . getCopyText ( ) ; if ( ! data ) { event . preventDefault ( e ) ; return ; }
var clipboardData = e . clipboardData || window . clipboardData ; if ( clipboardData && ! BROKEN _SETDATA ) { var supported = clipboardData . setData ( "Text" , data ) ; if ( supported ) { host . onCut ( ) ; event . preventDefault ( e ) ; } }
if ( ! supported ) { cut = true ; text . value = data ; text . select ( ) ; setTimeout ( function ( ) { cut = false ; resetValue ( ) ; resetSelection ( ) ; host . onCut ( ) ; } ) ; } } ; var onCopy = function ( e ) { var data = host . getCopyText ( ) ; if ( ! data ) { event . preventDefault ( e ) ; return ; }
var clipboardData = e . clipboardData || window . clipboardData ; if ( clipboardData && ! BROKEN _SETDATA ) { var supported = clipboardData . setData ( "Text" , data ) ; if ( supported ) { host . onCopy ( ) ; event . preventDefault ( e ) ; } }
if ( ! supported ) { copied = true ; text . value = data ; text . select ( ) ; setTimeout ( function ( ) { copied = false ; resetValue ( ) ; resetSelection ( ) ; host . onCopy ( ) ; } ) ; } } ; var onPaste = function ( e ) { var clipboardData = e . clipboardData || window . clipboardData ; if ( clipboardData ) { var data = clipboardData . getData ( "Text" ) ; if ( data )
host . onPaste ( data ) ; if ( useragent . isIE )
setTimeout ( resetSelection ) ; event . preventDefault ( e ) ; }
else { text . value = "" ; pasted = true ; } } ; event . addCommandKeyListener ( text , host . onCommandKey . bind ( host ) ) ; event . addListener ( text , "select" , onSelect ) ; event . addListener ( text , "input" , onInput ) ; event . addListener ( text , "cut" , onCut ) ; event . addListener ( text , "copy" , onCopy ) ; event . addListener ( text , "paste" , onPaste ) ; if ( ! ( 'oncut' in text ) || ! ( 'oncopy' in text ) || ! ( 'onpaste' in text ) ) { event . addListener ( parentNode , "keydown" , function ( e ) { if ( ( useragent . isMac && ! e . metaKey ) || ! e . ctrlKey )
return ; switch ( e . keyCode ) { case 67 : onCopy ( e ) ; break ; case 86 : onPaste ( e ) ; break ; case 88 : onCut ( e ) ; break ; } } ) ; }
var onCompositionStart = function ( e ) { if ( inComposition ) return ; inComposition = { } ; host . onCompositionStart ( ) ; setTimeout ( onCompositionUpdate , 0 ) ; host . on ( "mousedown" , onCompositionEnd ) ; if ( ! host . selection . isEmpty ( ) ) { host . insert ( "" ) ; host . session . markUndoGroup ( ) ; host . selection . clearSelection ( ) ; }
host . session . markUndoGroup ( ) ; } ; var onCompositionUpdate = function ( ) { if ( ! inComposition ) return ; var val = text . value . replace ( /\x01/g , "" ) ; if ( inComposition . lastValue === val ) return ; host . onCompositionUpdate ( val ) ; if ( inComposition . lastValue )
host . undo ( ) ; inComposition . lastValue = val ; if ( inComposition . lastValue ) { var r = host . selection . getRange ( ) ; host . insert ( inComposition . lastValue ) ; host . session . markUndoGroup ( ) ; inComposition . range = host . selection . getRange ( ) ; host . selection . setRange ( r ) ; host . selection . clearSelection ( ) ; } } ; var onCompositionEnd = function ( e ) { var c = inComposition ; inComposition = false ; var timer = setTimeout ( function ( ) { timer = null ; var str = text . value . replace ( /\x01/g , "" ) ; if ( inComposition )
return
else if ( str == c . lastValue )
resetValue ( ) ; else if ( ! c . lastValue && str ) { resetValue ( ) ; sendText ( str ) ; } } ) ; inputHandler = function compositionInputHandler ( str ) { if ( timer )
clearTimeout ( timer ) ; str = str . replace ( /\x01/g , "" ) ; if ( str == c . lastValue )
return "" ; if ( c . lastValue && timer )
host . undo ( ) ; return str ; } ; host . onCompositionEnd ( ) ; host . removeListener ( "mousedown" , onCompositionEnd ) ; if ( e . type == "compositionend" && c . range ) { host . selection . setRange ( c . range ) ; } } ; var syncComposition = lang . delayedCall ( onCompositionUpdate , 50 ) ; event . addListener ( text , "compositionstart" , onCompositionStart ) ; if ( useragent . isGecko ) { event . addListener ( text , "text" , function ( ) { syncComposition . schedule ( ) } ) ; } else { event . addListener ( text , "keyup" , function ( ) { syncComposition . schedule ( ) } ) ; event . addListener ( text , "keydown" , function ( ) { syncComposition . schedule ( ) } ) ; }
event . addListener ( text , "compositionend" , onCompositionEnd ) ; this . getElement = function ( ) { return text ; } ; this . setReadOnly = function ( readOnly ) { text . readOnly = readOnly ; } ; this . onContextMenu = function ( e ) { afterContextMenu = true ; if ( ! tempStyle )
tempStyle = text . style . cssText ; text . style . cssText = "z-index:100000;" + ( useragent . isIE ? "opacity:0.1;" : "" ) ; resetSelection ( host . selection . isEmpty ( ) ) ; host . _emit ( "nativecontextmenu" , { target : host , domEvent : e } ) ; var rect = host . container . getBoundingClientRect ( ) ; var style = dom . computedStyle ( host . container ) ; var top = rect . top + ( parseInt ( style . borderTopWidth ) || 0 ) ; var left = rect . left + ( parseInt ( rect . borderLeftWidth ) || 0 ) ; var maxTop = rect . bottom - top - text . clientHeight ; var move = function ( e ) { text . style . left = e . clientX - left - 2 + "px" ; text . style . top = Math . min ( e . clientY - top - 2 , maxTop ) + "px" ; } ; move ( e ) ; if ( e . type != "mousedown" )
return ; if ( host . renderer . $keepTextAreaAtCursor )
host . renderer . $keepTextAreaAtCursor = null ; if ( useragent . isWin )
event . capture ( host . container , move , onContextMenuClose ) ; } ; this . onContextMenuClose = onContextMenuClose ; function onContextMenuClose ( ) { setTimeout ( function ( ) { if ( tempStyle ) { text . style . cssText = tempStyle ; tempStyle = '' ; }
if ( host . renderer . $keepTextAreaAtCursor == null ) { host . renderer . $keepTextAreaAtCursor = true ; host . renderer . $moveTextAreaToCursor ( ) ; } } , 0 ) ; }
if ( ! useragent . isGecko || useragent . isMac ) { event . addListener ( text , "contextmenu" , function ( e ) { host . textInput . onContextMenu ( e ) ; onContextMenuClose ( ) ; } ) ; } } ; exports . TextInput = TextInput ; } ) ; define ( 'ace/mouse/mouse_handler' , [ 'require' , 'exports' , 'module' , 'ace/lib/event' , 'ace/lib/useragent' , 'ace/mouse/default_handlers' , 'ace/mouse/default_gutter_handler' , 'ace/mouse/mouse_event' , 'ace/mouse/dragdrop_handler' , 'ace/config' ] , function ( require , exports , module ) { var event = require ( "../lib/event" ) ; var useragent = require ( "../lib/useragent" ) ; var DefaultHandlers = require ( "./default_handlers" ) . DefaultHandlers ; var DefaultGutterHandler = require ( "./default_gutter_handler" ) . GutterHandler ; var MouseEvent = require ( "./mouse_event" ) . MouseEvent ; var DragdropHandler = require ( "./dragdrop_handler" ) . DragdropHandler ; var config = require ( "../config" ) ; var MouseHandler = function ( editor ) { this . editor = editor ; new DefaultHandlers ( this ) ; new DefaultGutterHandler ( this ) ; new DragdropHandler ( this ) ; var mouseTarget = editor . renderer . getMouseEventTarget ( ) ; event . addListener ( mouseTarget , "click" , this . onMouseEvent . bind ( this , "click" ) ) ; event . addListener ( mouseTarget , "mousemove" , this . onMouseMove . bind ( this , "mousemove" ) ) ; event . addMultiMouseDownListener ( mouseTarget , [ 300 , 300 , 250 ] , this , "onMouseEvent" ) ; if ( editor . renderer . scrollBarV ) { event . addMultiMouseDownListener ( editor . renderer . scrollBarV . inner , [ 300 , 300 , 250 ] , this , "onMouseEvent" ) ; event . addMultiMouseDownListener ( editor . renderer . scrollBarH . inner , [ 300 , 300 , 250 ] , this , "onMouseEvent" ) ; }
event . addMouseWheelListener ( editor . container , this . onMouseWheel . bind ( this , "mousewheel" ) ) ; var gutterEl = editor . renderer . $gutter ; event . addListener ( gutterEl , "mousedown" , this . onMouseEvent . bind ( this , "guttermousedown" ) ) ; event . addListener ( gutterEl , "click" , this . onMouseEvent . bind ( this , "gutterclick" ) ) ; event . addListener ( gutterEl , "dblclick" , this . onMouseEvent . bind ( this , "gutterdblclick" ) ) ; event . addListener ( gutterEl , "mousemove" , this . onMouseEvent . bind ( this , "guttermousemove" ) ) ; event . addListener ( mouseTarget , "mousedown" , function ( e ) { editor . focus ( ) ; } ) ; event . addListener ( gutterEl , "mousedown" , function ( e ) { editor . focus ( ) ; return event . preventDefault ( e ) ; } ) ; } ; ( function ( ) { this . onMouseEvent = function ( name , e ) { this . editor . _emit ( name , new MouseEvent ( e , this . editor ) ) ; } ; this . onMouseMove = function ( name , e ) { var listeners = this . editor . _eventRegistry && this . editor . _eventRegistry . mousemove ; if ( ! listeners || ! listeners . length )
return ; this . editor . _emit ( name , new MouseEvent ( e , this . editor ) ) ; } ; this . onMouseWheel = function ( name , e ) { var mouseEvent = new MouseEvent ( e , this . editor ) ; mouseEvent . speed = this . $scrollSpeed * 2 ; mouseEvent . wheelX = e . wheelX ; mouseEvent . wheelY = e . wheelY ; this . editor . _emit ( name , mouseEvent ) ; } ; this . setState = function ( state ) { this . state = state ; } ; this . captureMouse = function ( ev , mouseMoveHandler ) { this . x = ev . x ; this . y = ev . y ; this . isMousePressed = true ; var renderer = this . editor . renderer ; if ( renderer . $keepTextAreaAtCursor )
renderer . $keepTextAreaAtCursor = null ; var self = this ; var onMouseMove = function ( e ) { self . x = e . clientX ; self . y = e . clientY ; mouseMoveHandler && mouseMoveHandler ( e ) ; } ; var onCaptureEnd = function ( e ) { clearInterval ( timerId ) ; onCaptureInterval ( ) ; self [ self . state + "End" ] && self [ self . state + "End" ] ( e ) ; self . $clickSelection = null ; if ( renderer . $keepTextAreaAtCursor == null ) { renderer . $keepTextAreaAtCursor = true ; renderer . $moveTextAreaToCursor ( ) ; }
self . isMousePressed = false ; self . onMouseEvent ( "mouseup" , e ) ; } ; var onCaptureInterval = function ( ) { self [ self . state ] && self [ self . state ] ( ) ; } ; if ( useragent . isOldIE && ev . domEvent . type == "dblclick" ) { return setTimeout ( function ( ) { onCaptureEnd ( ev ) ; } ) ; }
event . capture ( this . editor . container , onMouseMove , onCaptureEnd ) ; var timerId = setInterval ( onCaptureInterval , 20 ) ; } ; } ) . call ( MouseHandler . prototype ) ; config . defineOptions ( MouseHandler . prototype , "mouseHandler" , { scrollSpeed : { initialValue : 2 } , dragDelay : { initialValue : 150 } , dragEnabled : { initialValue : true } , focusTimout : { initialValue : 0 } } ) ; exports . MouseHandler = MouseHandler ; } ) ; define ( 'ace/mouse/default_handlers' , [ 'require' , 'exports' , 'module' , 'ace/lib/dom' , 'ace/lib/event' , 'ace/lib/useragent' ] , function ( require , exports , module ) { var dom = require ( "../lib/dom" ) ; var event = require ( "../lib/event" ) ; var useragent = require ( "../lib/useragent" ) ; var DRAG _OFFSET = 0 ; function DefaultHandlers ( mouseHandler ) { mouseHandler . $clickSelection = null ; var editor = mouseHandler . editor ; editor . setDefaultHandler ( "mousedown" , this . onMouseDown . bind ( mouseHandler ) ) ; editor . setDefaultHandler ( "dblclick" , this . onDoubleClick . bind ( mouseHandler ) ) ; editor . setDefaultHandler ( "tripleclick" , this . onTripleClick . bind ( mouseHandler ) ) ; editor . setDefaultHandler ( "quadclick" , this . onQuadClick . bind ( mouseHandler ) ) ; editor . setDefaultHandler ( "mousewheel" , this . onMouseWheel . bind ( mouseHandler ) ) ; var exports = [ "select" , "startSelect" , "selectEnd" , "selectAllEnd" , "selectByWordsEnd" , "selectByLinesEnd" , "dragWait" , "dragWaitEnd" , "focusWait" ] ; exports . forEach ( function ( x ) { mouseHandler [ x ] = this [ x ] ; } , this ) ; mouseHandler . selectByLines = this . extendSelectionBy . bind ( mouseHandler , "getLineRange" ) ; mouseHandler . selectByWords = this . extendSelectionBy . bind ( mouseHandler , "getWordRange" ) ; }
( function ( ) { this . onMouseDown = function ( ev ) { var inSelection = ev . inSelection ( ) ; var pos = ev . getDocumentPosition ( ) ; this . mousedownEvent = ev ; var editor = this . editor ; var button = ev . getButton ( ) ; if ( button !== 0 ) { var selectionRange = editor . getSelectionRange ( ) ; var selectionEmpty = selectionRange . isEmpty ( ) ; if ( selectionEmpty ) { editor . moveCursorToPosition ( pos ) ; editor . selection . clearSelection ( ) ; }
editor . textInput . onContextMenu ( ev . domEvent ) ; return ; }
if ( inSelection && ! editor . isFocused ( ) ) { editor . focus ( ) ; if ( this . $focusTimout && ! this . $clickSelection && ! editor . inMultiSelectMode ) { this . mousedownEvent . time = ( new Date ( ) ) . getTime ( ) ; this . setState ( "focusWait" ) ; this . captureMouse ( ev ) ; return ; } }
if ( ! inSelection || this . $clickSelection || ev . getShiftKey ( ) || editor . inMultiSelectMode ) { this . startSelect ( pos ) ; } else if ( inSelection ) { this . mousedownEvent . time = ( new Date ( ) ) . getTime ( ) ; this . startSelect ( pos ) ; }
this . captureMouse ( ev ) ; return ev . preventDefault ( ) ; } ; this . startSelect = function ( pos ) { pos = pos || this . editor . renderer . screenToTextCoordinates ( this . x , this . y ) ; var editor = this . editor ; setTimeout ( function ( ) { if ( this . mousedownEvent . getShiftKey ( ) ) { editor . selection . selectToPosition ( pos ) ; }
else if ( ! this . $clickSelection ) { editor . moveCursorToPosition ( pos ) ; editor . selection . clearSelection ( ) ; } } . bind ( this ) , 0 ) ; if ( editor . container . setCapture ) { editor . container . setCapture ( ) ; }
editor . setStyle ( "ace_selecting" ) ; this . setState ( "select" ) ; } ; this . select = function ( ) { var anchor , editor = this . editor ; var cursor = editor . renderer . screenToTextCoordinates ( this . x , this . y ) ; if ( this . $clickSelection ) { var cmp = this . $clickSelection . comparePoint ( cursor ) ; if ( cmp == - 1 ) { anchor = this . $clickSelection . end ; } else if ( cmp == 1 ) { anchor = this . $clickSelection . start ; } else { var orientedRange = calcRangeOrientation ( this . $clickSelection , cursor ) ; cursor = orientedRange . cursor ; anchor = orientedRange . anchor ; }
editor . selection . setSelectionAnchor ( anchor . row , anchor . column ) ; }
editor . selection . selectToPosition ( cursor ) ; editor . renderer . scrollCursorIntoView ( ) ; } ; this . extendSelectionBy = function ( unitName ) { var anchor , editor = this . editor ; var cursor = editor . renderer . screenToTextCoordinates ( this . x , this . y ) ; var range = editor . selection [ unitName ] ( cursor . row , cursor . column ) ; if ( this . $clickSelection ) { var cmpStart = this . $clickSelection . comparePoint ( range . start ) ; var cmpEnd = this . $clickSelection . comparePoint ( range . end ) ; if ( cmpStart == - 1 && cmpEnd <= 0 ) { anchor = this . $clickSelection . end ; if ( range . end . row != cursor . row || range . end . column != cursor . column )
cursor = range . start ; } else if ( cmpEnd == 1 && cmpStart >= 0 ) { anchor = this . $clickSelection . start ; if ( range . start . row != cursor . row || range . start . column != cursor . column )
cursor = range . end ; } else if ( cmpStart == - 1 && cmpEnd == 1 ) { cursor = range . end ; anchor = range . start ; } else { var orientedRange = calcRangeOrientation ( this . $clickSelection , cursor ) ; cursor = orientedRange . cursor ; anchor = orientedRange . anchor ; }
editor . selection . setSelectionAnchor ( anchor . row , anchor . column ) ; }
editor . selection . selectToPosition ( cursor ) ; editor . renderer . scrollCursorIntoView ( ) ; } ; this . selectEnd = this . selectAllEnd = this . selectByWordsEnd = this . selectByLinesEnd = function ( ) { this . editor . unsetStyle ( "ace_selecting" ) ; if ( this . editor . container . releaseCapture ) { this . editor . container . releaseCapture ( ) ; } } ; this . focusWait = function ( ) { var distance = calcDistance ( this . mousedownEvent . x , this . mousedownEvent . y , this . x , this . y ) ; var time = ( new Date ( ) ) . getTime ( ) ; if ( distance > DRAG _OFFSET || time - this . mousedownEvent . time > this . $focusTimout )
this . startSelect ( this . mousedownEvent . getDocumentPosition ( ) ) ; } ; this . onDoubleClick = function ( ev ) { var pos = ev . getDocumentPosition ( ) ; var editor = this . editor ; var session = editor . session ; var range = session . getBracketRange ( pos ) ; if ( range ) { if ( range . isEmpty ( ) ) { range . start . column -- ; range . end . column ++ ; }
this . $clickSelection = range ; this . setState ( "select" ) ; return ; }
this . $clickSelection = editor . selection . getWordRange ( pos . row , pos . column ) ; this . setState ( "selectByWords" ) ; } ; this . onTripleClick = function ( ev ) { var pos = ev . getDocumentPosition ( ) ; var editor = this . editor ; this . setState ( "selectByLines" ) ; this . $clickSelection = editor . selection . getLineRange ( pos . row ) ; } ; this . onQuadClick = function ( ev ) { var editor = this . editor ; editor . selectAll ( ) ; this . $clickSelection = editor . getSelectionRange ( ) ; this . setState ( "selectAll" ) ; } ; this . onMouseWheel = function ( ev ) { if ( ev . getShiftKey ( ) || ev . getAccelKey ( ) )
return ; var t = ev . domEvent . timeStamp ; var dt = t - ( this . $lastScrollTime || 0 ) ; var editor = this . editor ; var isScrolable = editor . renderer . isScrollableBy ( ev . wheelX * ev . speed , ev . wheelY * ev . speed ) ; if ( isScrolable || dt < 200 ) { this . $lastScrollTime = t ; editor . renderer . scrollBy ( ev . wheelX * ev . speed , ev . wheelY * ev . speed ) ; return ev . stop ( ) ; } } ; } ) . call ( DefaultHandlers . prototype ) ; exports . DefaultHandlers = DefaultHandlers ; function calcDistance ( ax , ay , bx , by ) { return Math . sqrt ( Math . pow ( bx - ax , 2 ) + Math . pow ( by - ay , 2 ) ) ; }
function calcRangeOrientation ( range , cursor ) { if ( range . start . row == range . end . row )
var cmp = 2 * cursor . column - range . start . column - range . end . column ; else if ( range . start . row == range . end . row - 1 && ! range . start . column && ! range . end . column )
var cmp = cursor . column - 4 ; else
var cmp = 2 * cursor . row - range . start . row - range . end . row ; if ( cmp < 0 )
return { cursor : range . start , anchor : range . end } ; else
return { cursor : range . end , anchor : range . start } ; } } ) ; define ( 'ace/mouse/default_gutter_handler' , [ 'require' , 'exports' , 'module' , 'ace/lib/dom' , 'ace/lib/event' ] , function ( require , exports , module ) { var dom = require ( "../lib/dom" ) ; var event = require ( "../lib/event" ) ; function GutterHandler ( mouseHandler ) { var editor = mouseHandler . editor ; var gutter = editor . renderer . $gutterLayer ; mouseHandler . editor . setDefaultHandler ( "guttermousedown" , function ( e ) { if ( ! editor . isFocused ( ) || e . getButton ( ) != 0 )
return ; var gutterRegion = gutter . getRegion ( e ) ; if ( gutterRegion == "foldWidgets" )
return ; var row = e . getDocumentPosition ( ) . row ; var selection = editor . session . selection ; if ( e . getShiftKey ( ) )
selection . selectTo ( row , 0 ) ; else { if ( e . domEvent . detail == 2 ) { editor . selectAll ( ) ; return e . preventDefault ( ) ; }
mouseHandler . $clickSelection = editor . selection . getLineRange ( row ) ; }
mouseHandler . setState ( "selectByLines" ) ; mouseHandler . captureMouse ( e ) ; return e . preventDefault ( ) ; } ) ; var tooltipTimeout , mouseEvent , tooltip , tooltipAnnotation ; function createTooltip ( ) { tooltip = dom . createElement ( "div" ) ; tooltip . className = "ace_gutter-tooltip" ; tooltip . style . display = "none" ; editor . container . appendChild ( tooltip ) ; }
function showTooltip ( ) { if ( ! tooltip ) { createTooltip ( ) ; }
var row = mouseEvent . getDocumentPosition ( ) . row ; var annotation = gutter . $annotations [ row ] ; if ( ! annotation )
return hideTooltip ( ) ; var maxRow = editor . session . getLength ( ) ; if ( row == maxRow ) { var screenRow = editor . renderer . pixelToScreenCoordinates ( 0 , mouseEvent . y ) . row ; var pos = mouseEvent . $pos ; if ( screenRow > editor . session . documentToScreenRow ( pos . row , pos . column ) )
return hideTooltip ( ) ; }
if ( tooltipAnnotation == annotation )
return ; tooltipAnnotation = annotation . text . join ( "<br/>" ) ; tooltip . style . display = "block" ; tooltip . innerHTML = tooltipAnnotation ; editor . on ( "mousewheel" , hideTooltip ) ; moveTooltip ( mouseEvent ) ; }
function hideTooltip ( ) { if ( tooltipTimeout )
tooltipTimeout = clearTimeout ( tooltipTimeout ) ; if ( tooltipAnnotation ) { tooltip . style . display = "none" ; tooltipAnnotation = null ; editor . removeEventListener ( "mousewheel" , hideTooltip ) ; } }
function moveTooltip ( e ) { var rect = editor . renderer . $gutter . getBoundingClientRect ( ) ; tooltip . style . left = e . x + 15 + "px" ; if ( e . y + 3 * editor . renderer . lineHeight + 15 < rect . bottom ) { tooltip . style . bottom = "" ; tooltip . style . top = e . y + 15 + "px" ; } else { tooltip . style . top = "" ; var innerHeight = window . innerHeight || document . documentElement . clientHeight ; tooltip . style . bottom = innerHeight - e . y + 5 + "px" ; } }
mouseHandler . editor . setDefaultHandler ( "guttermousemove" , function ( e ) { var target = e . domEvent . target || e . domEvent . srcElement ; if ( dom . hasCssClass ( target , "ace_fold-widget" ) )
return hideTooltip ( ) ; if ( tooltipAnnotation )
moveTooltip ( e ) ; mouseEvent = e ; if ( tooltipTimeout )
return ; tooltipTimeout = setTimeout ( function ( ) { tooltipTimeout = null ; if ( mouseEvent && ! mouseHandler . isMousePressed )
showTooltip ( ) ; else
hideTooltip ( ) ; } , 50 ) ; } ) ; event . addListener ( editor . renderer . $gutter , "mouseout" , function ( e ) { mouseEvent = null ; if ( ! tooltipAnnotation || tooltipTimeout )
return ; tooltipTimeout = setTimeout ( function ( ) { tooltipTimeout = null ; hideTooltip ( ) ; } , 50 ) ; } ) ; editor . on ( "changeSession" , hideTooltip ) ; }
exports . GutterHandler = GutterHandler ; } ) ; define ( 'ace/mouse/mouse_event' , [ 'require' , 'exports' , 'module' , 'ace/lib/event' , 'ace/lib/useragent' ] , function ( require , exports , module ) { var event = require ( "../lib/event" ) ; var useragent = require ( "../lib/useragent" ) ; var MouseEvent = exports . MouseEvent = function ( domEvent , editor ) { this . domEvent = domEvent ; this . editor = editor ; this . x = this . clientX = domEvent . clientX ; this . y = this . clientY = domEvent . clientY ; this . $pos = null ; this . $inSelection = null ; this . propagationStopped = false ; this . defaultPrevented = false ; } ; ( function ( ) { this . stopPropagation = function ( ) { event . stopPropagation ( this . domEvent ) ; this . propagationStopped = true ; } ; this . preventDefault = function ( ) { event . preventDefault ( this . domEvent ) ; this . defaultPrevented = true ; } ; this . stop = function ( ) { this . stopPropagation ( ) ; this . preventDefault ( ) ; } ; this . getDocumentPosition = function ( ) { if ( this . $pos )
return this . $pos ; this . $pos = this . editor . renderer . screenToTextCoordinates ( this . clientX , this . clientY ) ; return this . $pos ; } ; this . inSelection = function ( ) { if ( this . $inSelection !== null )
return this . $inSelection ; var editor = this . editor ; var selectionRange = editor . getSelectionRange ( ) ; if ( selectionRange . isEmpty ( ) )
this . $inSelection = false ; else { var pos = this . getDocumentPosition ( ) ; this . $inSelection = selectionRange . contains ( pos . row , pos . column ) ; }
return this . $inSelection ; } ; this . getButton = function ( ) { return event . getButton ( this . domEvent ) ; } ; this . getShiftKey = function ( ) { return this . domEvent . shiftKey ; } ; this . getAccelKey = useragent . isMac ? function ( ) { return this . domEvent . metaKey ; } : function ( ) { return this . domEvent . ctrlKey ; } ; } ) . call ( MouseEvent . prototype ) ; } ) ; define ( 'ace/mouse/dragdrop_handler' , [ 'require' , 'exports' , 'module' , 'ace/lib/dom' , 'ace/lib/event' , 'ace/lib/useragent' ] , function ( require , exports , module ) { var dom = require ( "../lib/dom" ) ; var event = require ( "../lib/event" ) ; var useragent = require ( "../lib/useragent" ) ; var AUTOSCROLL _DELAY = 200 ; var SCROLL _CURSOR _DELAY = 200 ; var SCROLL _CURSOR _HYSTERESIS = 5 ; function DragdropHandler ( mouseHandler ) { var editor = mouseHandler . editor ; var proxy = dom . createElement ( "img" ) ; proxy . src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" ; if ( useragent . isOpera ) { proxy . style . cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;visibility:hidden" ; editor . container . appendChild ( proxy ) ; }
var exports = [ "dragWait" , "dragWaitEnd" , "startDrag" , "dragReadyEnd" , "onMouseDrag" ] ; exports . forEach ( function ( x ) { mouseHandler [ x ] = this [ x ] ; } , this ) ; editor . addEventListener ( "mousedown" , this . onMouseDown . bind ( mouseHandler ) ) ; var mouseTarget = editor . container ; var dragSelectionMarker , x , y ; var timerId , range ; var dragCursor , counter = 0 ; var dragOperation ; var autoScrollStartTime ; var cursorMovedTime ; var cursorPointOnCaretMoved ; this . onDragStart = function ( e ) { if ( this . cancelDrag || ! mouseTarget . draggable ) { var self = this ; setTimeout ( function ( ) { self . startSelect ( ) ; self . captureMouse ( e ) ; } , 0 ) ; return e . preventDefault ( ) ; }
if ( useragent . isOpera ) { proxy . style . visibility = "visible" ; setTimeout ( function ( ) { proxy . style . visibility = "hidden" ; } , 0 ) ; }
range = editor . getSelectionRange ( ) ; var dataTransfer = e . dataTransfer ; dataTransfer . effectAllowed = editor . getReadOnly ( ) ? "copy" : "copyMove" ; dataTransfer . setDragImage && dataTransfer . setDragImage ( proxy , 0 , 0 ) ; dataTransfer . clearData ( ) ; dataTransfer . setData ( "Text" , editor . session . getTextRange ( ) ) ; this . setState ( "drag" ) ; } ; this . onDragEnd = function ( e ) { mouseTarget . draggable = false ; this . setState ( null ) ; if ( ! editor . getReadOnly ( ) ) { var dropEffect = e . dataTransfer . dropEffect ; if ( ! dragOperation && dropEffect == "move" )
editor . session . remove ( editor . getSelectionRange ( ) ) ; editor . renderer . $cursorLayer . setBlinking ( true ) ; }
this . editor . unsetStyle ( "ace_dragging" ) ; } ; this . onDragEnter = function ( e ) { if ( editor . getReadOnly ( ) || ! canAccept ( e . dataTransfer ) )
return ; if ( ! dragSelectionMarker )
addDragMarker ( ) ; counter ++ ; e . dataTransfer . dropEffect = dragOperation = getDropEffect ( e ) ; return event . preventDefault ( e ) ; } ; this . onDragOver = function ( e ) { if ( editor . getReadOnly ( ) || ! canAccept ( e . dataTransfer ) )
return ; if ( ! dragSelectionMarker ) { addDragMarker ( ) ; counter ++ ; }
if ( onMouseMoveTimer !== null )
onMouseMoveTimer = null ; x = e . clientX ; y = e . clientY ; e . dataTransfer . dropEffect = dragOperation = getDropEffect ( e ) ; return event . preventDefault ( e ) ; } ; this . onDragLeave = function ( e ) { counter -- ; if ( counter <= 0 && dragSelectionMarker ) { clearDragMarker ( ) ; dragOperation = null ; return event . preventDefault ( e ) ; } } ; this . onDrop = function ( e ) { if ( ! dragSelectionMarker )
return ; var dataTransfer = e . dataTransfer ; var isInternal = this . state == "drag" ; if ( isInternal ) { switch ( dragOperation ) { case "move" : if ( range . contains ( dragCursor . row , dragCursor . column ) ) { range = { start : dragCursor , end : dragCursor } ; } else { range = editor . moveText ( range , dragCursor ) ; }
break ; case "copy" : range = editor . moveText ( range , dragCursor , true ) ; break ; } } else { var dropData = dataTransfer . getData ( 'Text' ) ; range = { start : dragCursor , end : editor . session . insert ( dragCursor , dropData ) } ; editor . focus ( ) ; dragOperation = null ; }
clearDragMarker ( ) ; return event . preventDefault ( e ) ; } ; event . addListener ( mouseTarget , "dragstart" , this . onDragStart . bind ( mouseHandler ) ) ; event . addListener ( mouseTarget , "dragend" , this . onDragEnd . bind ( mouseHandler ) ) ; event . addListener ( mouseTarget , "dragenter" , this . onDragEnter . bind ( mouseHandler ) ) ; event . addListener ( mouseTarget , "dragover" , this . onDragOver . bind ( mouseHandler ) ) ; event . addListener ( mouseTarget , "dragleave" , this . onDragLeave . bind ( mouseHandler ) ) ; event . addListener ( mouseTarget , "drop" , this . onDrop . bind ( mouseHandler ) ) ; function scrollCursorIntoView ( cursor , prevCursor ) { var now = new Date ( ) . getTime ( ) ; var vMovement = ! prevCursor || cursor . row != prevCursor . row ; var hMovement = ! prevCursor || cursor . column != prevCursor . column ; if ( ! cursorMovedTime || vMovement || hMovement ) { editor . $blockScrolling += 1 ; editor . moveCursorToPosition ( cursor ) ; editor . $blockScrolling -= 1 ; cursorMovedTime = now ; cursorPointOnCaretMoved = { x : x , y : y } ; } else { var distance = calcDistance ( cursorPointOnCaretMoved . x , cursorPointOnCaretMoved . y , x , y ) ; if ( distance > SCROLL _CURSOR _HYSTERESIS ) { cursorMovedTime = null ; } else if ( now - cursorMovedTime >= SCROLL _CURSOR _DELAY ) { editor . renderer . scrollCursorIntoView ( ) ; cursorMovedTime = null ; } } }
function autoScroll ( cursor , prevCursor ) { var now = new Date ( ) . getTime ( ) ; var lineHeight = editor . renderer . layerConfig . lineHeight ; var characterWidth = editor . renderer . layerConfig . characterWidth ; var editorRect = editor . renderer . scroller . getBoundingClientRect ( ) ; var offsets = { x : { left : x - editorRect . left , right : editorRect . right - x } , y : { top : y - editorRect . top , bottom : editorRect . bottom - y } } ; var nearestXOffset = Math . min ( offsets . x . left , offsets . x . right ) ; var nearestYOffset = Math . min ( offsets . y . top , offsets . y . bottom ) ; var scrollCursor = { row : cursor . row , column : cursor . column } ; if ( nearestXOffset / characterWidth <= 2 ) { scrollCursor . column += ( offsets . x . left < offsets . x . right ? - 3 : + 2 ) ; }
if ( nearestYOffset / lineHeight <= 1 ) { scrollCursor . row += ( offsets . y . top < offsets . y . bottom ? - 1 : + 1 ) ; }
var vScroll = cursor . row != scrollCursor . row ; var hScroll = cursor . column != scrollCursor . column ; var vMovement = ! prevCursor || cursor . row != prevCursor . row ; if ( vScroll || ( hScroll && ! vMovement ) ) { if ( ! autoScrollStartTime )
autoScrollStartTime = now ; else if ( now - autoScrollStartTime >= AUTOSCROLL _DELAY )
editor . renderer . scrollCursorIntoView ( scrollCursor ) ; } else { autoScrollStartTime = null ; } }
function onDragInterval ( ) { var prevCursor = dragCursor ; dragCursor = editor . renderer . screenToTextCoordinates ( x , y ) ; scrollCursorIntoView ( dragCursor , prevCursor ) ; autoScroll ( dragCursor , prevCursor ) ; }
function addDragMarker ( ) { range = editor . selection . toOrientedRange ( ) ; dragSelectionMarker = editor . session . addMarker ( range , "ace_selection" , editor . getSelectionStyle ( ) ) ; editor . clearSelection ( ) ; clearInterval ( timerId ) ; timerId = setInterval ( onDragInterval , 20 ) ; counter = 0 ; event . addListener ( document , "mousemove" , onMouseMove ) ; }
function clearDragMarker ( ) { clearInterval ( timerId ) ; editor . session . removeMarker ( dragSelectionMarker ) ; dragSelectionMarker = null ; editor . $blockScrolling += 1 ; editor . selection . fromOrientedRange ( range ) ; editor . $blockScrolling -= 1 ; range = null ; counter = 0 ; autoScrollStartTime = null ; cursorMovedTime = null ; event . removeListener ( document , "mousemove" , onMouseMove ) ; }
var onMouseMoveTimer = null ; function onMouseMove ( ) { if ( onMouseMoveTimer == null ) { onMouseMoveTimer = setTimeout ( function ( ) { if ( onMouseMoveTimer != null && dragSelectionMarker )
clearDragMarker ( ) ; } , 20 ) ; } }
function canAccept ( dataTransfer ) { var types = dataTransfer . types ; return ! types || Array . prototype . some . call ( types , function ( type ) { return type == 'text/plain' || type == 'Text' ; } ) ; }
function getDropEffect ( e ) { var copyAllowed = [ 'copy' , 'copymove' , 'all' , 'uninitialized' ] ; var moveAllowed = [ 'move' , 'copymove' , 'linkmove' , 'all' , 'uninitialized' ] ; var copyModifierState = useragent . isMac ? e . altKey : e . ctrlKey ; var effectAllowed = "uninitialized" ; try { effectAllowed = e . dataTransfer . effectAllowed . toLowerCase ( ) ; } catch ( e ) { }
var dropEffect = "none" ; if ( copyModifierState && copyAllowed . indexOf ( effectAllowed ) >= 0 )
dropEffect = "copy" ; else if ( moveAllowed . indexOf ( effectAllowed ) >= 0 )
dropEffect = "move" ; else if ( copyAllowed . indexOf ( effectAllowed ) >= 0 )
dropEffect = "copy" ; return dropEffect ; } }
( function ( ) { this . dragWait = function ( ) { var interval = ( new Date ( ) ) . getTime ( ) - this . mousedownEvent . time ; if ( interval > this . editor . getDragDelay ( ) )
this . startDrag ( ) ; } ; this . dragWaitEnd = function ( ) { var target = this . editor . container ; target . draggable = false ; this . startSelect ( this . mousedownEvent . getDocumentPosition ( ) ) ; this . selectEnd ( ) ; } ; this . dragReadyEnd = function ( e ) { this . editor . renderer . $cursorLayer . setBlinking ( ! this . editor . getReadOnly ( ) ) ; this . editor . unsetStyle ( "ace_dragging" ) ; this . dragWaitEnd ( ) ; } ; this . startDrag = function ( ) { this . cancelDrag = false ; var target = this . editor . container ; target . draggable = true ; this . editor . renderer . $cursorLayer . setBlinking ( false ) ; this . editor . setStyle ( "ace_dragging" ) ; this . setState ( "dragReady" ) ; } ; this . onMouseDrag = function ( e ) { var target = this . editor . container ; if ( useragent . isIE && this . state == "dragReady" ) { var distance = calcDistance ( this . mousedownEvent . x , this . mousedownEvent . y , this . x , this . y ) ; if ( distance > 3 )
target . dragDrop ( ) ; }
if ( this . state === "dragWait" ) { var distance = calcDistance ( this . mousedownEvent . x , this . mousedownEvent . y , this . x , this . y ) ; if ( distance > 0 ) { target . draggable = false ; this . startSelect ( this . mousedownEvent . getDocumentPosition ( ) ) ; } } } ; this . onMouseDown = function ( e ) { if ( ! this . $dragEnabled )
return ; this . mousedownEvent = e ; var editor = this . editor ; var inSelection = e . inSelection ( ) ; var button = e . getButton ( ) ; var clickCount = e . domEvent . detail || 1 ; if ( clickCount === 1 && button === 0 && inSelection ) { this . mousedownEvent . time = ( new Date ( ) ) . getTime ( ) ; var eventTarget = e . domEvent . target || e . domEvent . srcElement ; if ( "unselectable" in eventTarget )
eventTarget . unselectable = "on" ; if ( editor . getDragDelay ( ) ) { if ( useragent . isWebKit ) { self . cancelDrag = true ; var mouseTarget = editor . container ; mouseTarget . draggable = true ; }
this . setState ( "dragWait" ) ; } else { this . startDrag ( ) ; }
this . captureMouse ( e , this . onMouseDrag . bind ( this ) ) ; e . defaultPrevented = true ; } } ; } ) . call ( DragdropHandler . prototype ) ; function calcDistance ( ax , ay , bx , by ) { return Math . sqrt ( Math . pow ( bx - ax , 2 ) + Math . pow ( by - ay , 2 ) ) ; }
exports . DragdropHandler = DragdropHandler ; } ) ; define ( 'ace/config' , [ 'require' , 'exports' , 'module' , 'ace/lib/lang' , 'ace/lib/oop' , 'ace/lib/net' , 'ace/lib/event_emitter' ] , function ( require , exports , module ) { "no use strict" ; var lang = require ( "./lib/lang" ) ; var oop = require ( "./lib/oop" ) ; var net = require ( "./lib/net" ) ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var global = ( function ( ) { return this ; } ) ( ) ; var options = { packaged : false , workerPath : null , modePath : null , themePath : null , basePath : "" , suffix : ".js" , $moduleUrls : { } } ; exports . get = function ( key ) { if ( ! options . hasOwnProperty ( key ) )
throw new Error ( "Unknown config key: " + key ) ; return options [ key ] ; } ; exports . set = function ( key , value ) { if ( ! options . hasOwnProperty ( key ) )
throw new Error ( "Unknown config key: " + key ) ; options [ key ] = value ; } ; exports . all = function ( ) { return lang . copyObject ( options ) ; } ; oop . implement ( exports , EventEmitter ) ; exports . moduleUrl = function ( name , component ) { if ( options . $moduleUrls [ name ] )
return options . $moduleUrls [ name ] ; var parts = name . split ( "/" ) ; component = component || parts [ parts . length - 2 ] || "" ; var sep = component == "snippets" ? "/" : "-" ; var base = parts [ parts . length - 1 ] ; if ( sep == "-" ) { var re = new RegExp ( "^" + component + "[\\-_]|[\\-_]" + component + "$" , "g" ) ; base = base . replace ( re , "" ) ; }
if ( ( ! base || base == component ) && parts . length > 1 )
base = parts [ parts . length - 2 ] ; var path = options [ component + "Path" ] ; if ( path == null ) { path = options . basePath ; } else if ( sep == "/" ) { component = sep = "" ; }
if ( path && path . slice ( - 1 ) != "/" )
path += "/" ; return path + component + sep + base + this . get ( "suffix" ) ; } ; exports . setModuleUrl = function ( name , subst ) { return options . $moduleUrls [ name ] = subst ; } ; exports . $loading = { } ; exports . loadModule = function ( moduleName , onLoad ) { var module , moduleType ; if ( Array . isArray ( moduleName ) ) { moduleType = moduleName [ 0 ] ; moduleName = moduleName [ 1 ] ; }
try { module = require ( moduleName ) ; } catch ( e ) { }
if ( module && ! exports . $loading [ moduleName ] )
return onLoad && onLoad ( module ) ; if ( ! exports . $loading [ moduleName ] )
exports . $loading [ moduleName ] = [ ] ; exports . $loading [ moduleName ] . push ( onLoad ) ; if ( exports . $loading [ moduleName ] . length > 1 )
return ; var afterLoad = function ( ) { require ( [ moduleName ] , function ( module ) { exports . _emit ( "load.module" , { name : moduleName , module : module } ) ; var listeners = exports . $loading [ moduleName ] ; exports . $loading [ moduleName ] = null ; listeners . forEach ( function ( onLoad ) { onLoad && onLoad ( module ) ; } ) ; } ) ; } ; if ( ! exports . get ( "packaged" ) )
return afterLoad ( ) ; net . loadScript ( exports . moduleUrl ( moduleName , moduleType ) , afterLoad ) ; } ; exports . init = function ( ) { options . packaged = require . packaged || module . packaged || ( global . define && define . packaged ) ; if ( ! global . document )
return "" ; var scriptOptions = { } ; var scriptUrl = "" ; var scripts = document . getElementsByTagName ( "script" ) ; for ( var i = 0 ; i < scripts . length ; i ++ ) { var script = scripts [ i ] ; var src = script . src || script . getAttribute ( "src" ) ; if ( ! src )
continue ; var attributes = script . attributes ; for ( var j = 0 , l = attributes . length ; j < l ; j ++ ) { var attr = attributes [ j ] ; if ( attr . name . indexOf ( "data-ace-" ) === 0 ) { scriptOptions [ deHyphenate ( attr . name . replace ( /^data-ace-/ , "" ) ) ] = attr . value ; } }
var m = src . match ( /^(.*)\/ace(\-\w+)?\.js(\?|$)/ ) ; if ( m )
scriptUrl = m [ 1 ] ; }
if ( scriptUrl ) { scriptOptions . base = scriptOptions . base || scriptUrl ; scriptOptions . packaged = true ; }
scriptOptions . basePath = scriptOptions . base ; scriptOptions . workerPath = scriptOptions . workerPath || scriptOptions . base ; scriptOptions . modePath = scriptOptions . modePath || scriptOptions . base ; scriptOptions . themePath = scriptOptions . themePath || scriptOptions . base ; delete scriptOptions . base ; for ( var key in scriptOptions )
if ( typeof scriptOptions [ key ] !== "undefined" )
exports . set ( key , scriptOptions [ key ] ) ; } ; function deHyphenate ( str ) { return str . replace ( /-(.)/g , function ( m , m1 ) { return m1 . toUpperCase ( ) ; } ) ; }
var optionsProvider = { setOptions : function ( optList ) { Object . keys ( optList ) . forEach ( function ( key ) { this . setOption ( key , optList [ key ] ) ; } , this ) ; } , getOptions : function ( optionNames ) { var result = { } ; if ( ! optionNames ) { optionNames = Object . keys ( this . $options ) ; } else if ( ! Array . isArray ( optionNames ) ) { result = optionNames ; optionNames = Object . keys ( result ) ; }
optionNames . forEach ( function ( key ) { result [ key ] = this . getOption ( key ) ; } , this ) ; return result ; } , setOption : function ( name , value ) { if ( this [ "$" + name ] === value )
return ; var opt = this . $options [ name ] ; if ( ! opt ) { if ( typeof console != "undefined" && console . warn )
console . warn ( 'misspelled option "' + name + '"' ) ; return undefined ; }
if ( opt . forwardTo )
return this [ opt . forwardTo ] && this [ opt . forwardTo ] . setOption ( name , value ) ; if ( ! opt . handlesSet )
this [ "$" + name ] = value ; if ( opt && opt . set )
opt . set . call ( this , value ) ; } , getOption : function ( name ) { var opt = this . $options [ name ] ; if ( ! opt ) { if ( typeof console != "undefined" && console . warn )
console . warn ( 'misspelled option "' + name + '"' ) ; return undefined ; }
if ( opt . forwardTo )
return this [ opt . forwardTo ] && this [ opt . forwardTo ] . getOption ( name ) ; return opt && opt . get ? opt . get . call ( this ) : this [ "$" + name ] ; } } ; var defaultOptions = { } ; exports . defineOptions = function ( obj , path , options ) { if ( ! obj . $options )
defaultOptions [ path ] = obj . $options = { } ; Object . keys ( options ) . forEach ( function ( key ) { var opt = options [ key ] ; if ( typeof opt == "string" )
opt = { forwardTo : opt } ; opt . name || ( opt . name = key ) ; obj . $options [ opt . name ] = opt ; if ( "initialValue" in opt )
obj [ "$" + opt . name ] = opt . initialValue ; } ) ; oop . implement ( obj , optionsProvider ) ; return this ; } ; exports . resetOptions = function ( obj ) { Object . keys ( obj . $options ) . forEach ( function ( key ) { var opt = obj . $options [ key ] ; if ( "value" in opt )
obj . setOption ( key , opt . value ) ; } ) ; } ; exports . setDefaultValue = function ( path , name , value ) { var opts = defaultOptions [ path ] || ( defaultOptions [ path ] = { } ) ; if ( opts [ name ] ) { if ( opts . forwardTo )
exports . setDefaultValue ( opts . forwardTo , name , value ) ; else
opts [ name ] . value = value ; } } ; exports . setDefaultValues = function ( path , optionHash ) { Object . keys ( optionHash ) . forEach ( function ( key ) { exports . setDefaultValue ( path , key , optionHash [ key ] ) ; } ) ; } ; } ) ; define ( 'ace/lib/net' , [ 'require' , 'exports' , 'module' , 'ace/lib/dom' ] , function ( require , exports , module ) { var dom = require ( "./dom" ) ; exports . get = function ( url , callback ) { var xhr = new XMLHttpRequest ( ) ; xhr . open ( 'GET' , url , true ) ; xhr . onreadystatechange = function ( ) { if ( xhr . readyState === 4 ) { callback ( xhr . responseText ) ; } } ; xhr . send ( null ) ; } ; exports . loadScript = function ( path , callback ) { var head = dom . getDocumentHead ( ) ; var s = document . createElement ( 'script' ) ; s . src = path ; head . appendChild ( s ) ; s . onload = s . onreadystatechange = function ( _ , isAbort ) { if ( isAbort || ! s . readyState || s . readyState == "loaded" || s . readyState == "complete" ) { s = s . onload = s . onreadystatechange = null ; if ( ! isAbort )
callback ( ) ; } } ; } ; } ) ; define ( 'ace/lib/event_emitter' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { var EventEmitter = { } ; var stopPropagation = function ( ) { this . propagationStopped = true ; } ; var preventDefault = function ( ) { this . defaultPrevented = true ; } ; EventEmitter . _emit = EventEmitter . _dispatchEvent = function ( eventName , e ) { this . _eventRegistry || ( this . _eventRegistry = { } ) ; this . _defaultHandlers || ( this . _defaultHandlers = { } ) ; var listeners = this . _eventRegistry [ eventName ] || [ ] ; var defaultHandler = this . _defaultHandlers [ eventName ] ; if ( ! listeners . length && ! defaultHandler )
return ; if ( typeof e != "object" || ! e )
e = { } ; if ( ! e . type )
e . type = eventName ; if ( ! e . stopPropagation )
e . stopPropagation = stopPropagation ; if ( ! e . preventDefault )
e . preventDefault = preventDefault ; listeners = listeners . slice ( ) ; for ( var i = 0 ; i < listeners . length ; i ++ ) { listeners [ i ] ( e , this ) ; if ( e . propagationStopped )
break ; }
if ( defaultHandler && ! e . defaultPrevented )
return defaultHandler ( e , this ) ; } ; EventEmitter . _signal = function ( eventName , e ) { var listeners = ( this . _eventRegistry || { } ) [ eventName ] ; if ( ! listeners )
return ; listeners = listeners . slice ( ) ; for ( var i = 0 ; i < listeners . length ; i ++ )
listeners [ i ] ( e , this ) ; } ; EventEmitter . once = function ( eventName , callback ) { var _self = this ; callback && this . addEventListener ( eventName , function newCallback ( ) { _self . removeEventListener ( eventName , newCallback ) ; callback . apply ( null , arguments ) ; } ) ; } ; EventEmitter . setDefaultHandler = function ( eventName , callback ) { var handlers = this . _defaultHandlers
if ( ! handlers )
handlers = this . _defaultHandlers = { _disabled _ : { } } ; if ( handlers [ eventName ] ) { var old = handlers [ eventName ] ; var disabled = handlers . _disabled _ [ eventName ] ; if ( ! disabled )
handlers . _disabled _ [ eventName ] = disabled = [ ] ; disabled . push ( old ) ; var i = disabled . indexOf ( callback ) ; if ( i != - 1 )
disabled . splice ( i , 1 ) ; }
handlers [ eventName ] = callback ; } ; EventEmitter . removeDefaultHandler = function ( eventName , callback ) { var handlers = this . _defaultHandlers
if ( ! handlers )
return ; var disabled = handlers . _disabled _ [ eventName ] ; if ( handlers [ eventName ] == callback ) { var old = handlers [ eventName ] ; if ( disabled )
this . setDefaultHandler ( eventName , disabled . pop ( ) ) ; } else if ( disabled ) { var i = disabled . indexOf ( callback ) ; if ( i != - 1 )
disabled . splice ( i , 1 ) ; } } ; EventEmitter . on = EventEmitter . addEventListener = function ( eventName , callback , capturing ) { this . _eventRegistry = this . _eventRegistry || { } ; var listeners = this . _eventRegistry [ eventName ] ; if ( ! listeners )
listeners = this . _eventRegistry [ eventName ] = [ ] ; if ( listeners . indexOf ( callback ) == - 1 )
listeners [ capturing ? "unshift" : "push" ] ( callback ) ; return callback ; } ; EventEmitter . off = EventEmitter . removeListener = EventEmitter . removeEventListener = function ( eventName , callback ) { this . _eventRegistry = this . _eventRegistry || { } ; var listeners = this . _eventRegistry [ eventName ] ; if ( ! listeners )
return ; var index = listeners . indexOf ( callback ) ; if ( index !== - 1 )
listeners . splice ( index , 1 ) ; } ; EventEmitter . removeAllListeners = function ( eventName ) { if ( this . _eventRegistry ) this . _eventRegistry [ eventName ] = [ ] ; } ; exports . EventEmitter = EventEmitter ; } ) ; define ( 'ace/mouse/fold_handler' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { function FoldHandler ( editor ) { editor . on ( "click" , function ( e ) { var position = e . getDocumentPosition ( ) ; var session = editor . session ; var fold = session . getFoldAt ( position . row , position . column , 1 ) ; if ( fold ) { if ( e . getAccelKey ( ) )
session . removeFold ( fold ) ; else
session . expandFold ( fold ) ; e . stop ( ) ; } } ) ; editor . on ( "gutterclick" , function ( e ) { var gutterRegion = editor . renderer . $gutterLayer . getRegion ( e ) ; if ( gutterRegion == "foldWidgets" ) { var row = e . getDocumentPosition ( ) . row ; var session = editor . session ; if ( session . foldWidgets && session . foldWidgets [ row ] )
editor . session . onFoldWidgetClick ( row , e ) ; if ( ! editor . isFocused ( ) )
editor . focus ( ) ; e . stop ( ) ; } } ) ; editor . on ( "gutterdblclick" , function ( e ) { var gutterRegion = editor . renderer . $gutterLayer . getRegion ( e ) ; if ( gutterRegion == "foldWidgets" ) { var row = e . getDocumentPosition ( ) . row ; var session = editor . session ; var data = session . getParentFoldRangeData ( row , true ) ; var range = data . range || data . firstRange ; if ( range ) { var row = range . start . row ; var fold = session . getFoldAt ( row , session . getLine ( row ) . length , 1 ) ; if ( fold ) { session . removeFold ( fold ) ; } else { session . addFold ( "..." , range ) ; editor . renderer . scrollCursorIntoView ( { row : range . start . row , column : 0 } ) ; } }
e . stop ( ) ; } } ) ; }
exports . FoldHandler = FoldHandler ; } ) ; define ( 'ace/keyboard/keybinding' , [ 'require' , 'exports' , 'module' , 'ace/lib/keys' , 'ace/lib/event' ] , function ( require , exports , module ) { var keyUtil = require ( "../lib/keys" ) ; var event = require ( "../lib/event" ) ; var KeyBinding = function ( editor ) { this . $editor = editor ; this . $data = { } ; this . $handlers = [ ] ; this . setDefaultHandler ( editor . commands ) ; } ; ( function ( ) { this . setDefaultHandler = function ( kb ) { this . removeKeyboardHandler ( this . $defaultHandler ) ; this . $defaultHandler = kb ; this . addKeyboardHandler ( kb , 0 ) ; this . $data = { editor : this . $editor } ; } ; this . setKeyboardHandler = function ( kb ) { var h = this . $handlers ; if ( h [ h . length - 1 ] == kb )
return ; while ( h [ h . length - 1 ] && h [ h . length - 1 ] != this . $defaultHandler )
this . removeKeyboardHandler ( h [ h . length - 1 ] ) ; this . addKeyboardHandler ( kb , 1 ) ; } ; this . addKeyboardHandler = function ( kb , pos ) { if ( ! kb )
return ; var i = this . $handlers . indexOf ( kb ) ; if ( i != - 1 )
this . $handlers . splice ( i , 1 ) ; if ( pos == undefined )
this . $handlers . push ( kb ) ; else
this . $handlers . splice ( pos , 0 , kb ) ; if ( i == - 1 && kb . attach )
kb . attach ( this . $editor ) ; } ; this . removeKeyboardHandler = function ( kb ) { var i = this . $handlers . indexOf ( kb ) ; if ( i == - 1 )
return false ; this . $handlers . splice ( i , 1 ) ; kb . detach && kb . detach ( this . $editor ) ; return true ; } ; this . getKeyboardHandler = function ( ) { return this . $handlers [ this . $handlers . length - 1 ] ; } ; this . $callKeyboardHandlers = function ( hashId , keyString , keyCode , e ) { var toExecute ; var success = false ; var commands = this . $editor . commands ; for ( var i = this . $handlers . length ; i -- ; ) { toExecute = this . $handlers [ i ] . handleKeyboard ( this . $data , hashId , keyString , keyCode , e ) ; if ( ! toExecute || ! toExecute . command )
continue ; if ( toExecute . command == "null" ) { success = true ; } else { success = commands . exec ( toExecute . command , this . $editor , toExecute . args , e ) ; }
if ( success && e && hashId != - 1 && toExecute . passEvent != true && toExecute . command . passEvent != true ) { event . stopEvent ( e ) ; }
if ( success )
break ; }
return success ; } ; this . onCommandKey = function ( e , hashId , keyCode ) { var keyString = keyUtil . keyCodeToString ( keyCode ) ; this . $callKeyboardHandlers ( hashId , keyString , keyCode , e ) ; } ; this . onTextInput = function ( text ) { var success = this . $callKeyboardHandlers ( - 1 , text ) ; if ( ! success )
this . $editor . commands . exec ( "insertstring" , this . $editor , text ) ; } ; } ) . call ( KeyBinding . prototype ) ; exports . KeyBinding = KeyBinding ; } ) ; define ( 'ace/edit_session' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/lang' , 'ace/config' , 'ace/lib/event_emitter' , 'ace/selection' , 'ace/mode/text' , 'ace/range' , 'ace/document' , 'ace/background_tokenizer' , 'ace/search_highlight' , 'ace/edit_session/folding' , 'ace/edit_session/bracket_match' ] , function ( require , exports , module ) { var oop = require ( "./lib/oop" ) ; var lang = require ( "./lib/lang" ) ; var config = require ( "./config" ) ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var Selection = require ( "./selection" ) . Selection ; var TextMode = require ( "./mode/text" ) . Mode ; var Range = require ( "./range" ) . Range ; var Document = require ( "./document" ) . Document ; var BackgroundTokenizer = require ( "./background_tokenizer" ) . BackgroundTokenizer ; var SearchHighlight = require ( "./search_highlight" ) . SearchHighlight ; var EditSession = function ( text , mode ) { this . $breakpoints = [ ] ; this . $decorations = [ ] ; this . $frontMarkers = { } ; this . $backMarkers = { } ; this . $markerId = 1 ; this . $undoSelect = true ; this . $foldData = [ ] ; this . $foldData . toString = function ( ) { return this . join ( "\n" ) ; }
this . on ( "changeFold" , this . onChangeFold . bind ( this ) ) ; this . $onChange = this . onChange . bind ( this ) ; if ( typeof text != "object" || ! text . getLine )
text = new Document ( text ) ; this . setDocument ( text ) ; this . selection = new Selection ( this ) ; config . resetOptions ( this ) ; this . setMode ( mode ) ; config . _emit ( "session" , this ) ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . setDocument = function ( doc ) { if ( this . doc )
this . doc . removeListener ( "change" , this . $onChange ) ; this . doc = doc ; doc . on ( "change" , this . $onChange ) ; if ( this . bgTokenizer )
this . bgTokenizer . setDocument ( this . getDocument ( ) ) ; this . resetCaches ( ) ; } ; this . getDocument = function ( ) { return this . doc ; } ; this . $resetRowCache = function ( docRow ) { if ( ! docRow ) { this . $docRowCache = [ ] ; this . $screenRowCache = [ ] ; return ; }
var l = this . $docRowCache . length ; var i = this . $getRowCacheIndex ( this . $docRowCache , docRow ) + 1 ; if ( l > i ) { this . $docRowCache . splice ( i , l ) ; this . $screenRowCache . splice ( i , l ) ; } } ; this . $getRowCacheIndex = function ( cacheArray , val ) { var low = 0 ; var hi = cacheArray . length - 1 ; while ( low <= hi ) { var mid = ( low + hi ) >> 1 ; var c = cacheArray [ mid ] ; if ( val > c )
low = mid + 1 ; else if ( val < c )
hi = mid - 1 ; else
return mid ; }
return low - 1 ; } ; this . resetCaches = function ( ) { this . $modified = true ; this . $wrapData = [ ] ; this . $rowLengthCache = [ ] ; this . $resetRowCache ( 0 ) ; if ( this . bgTokenizer )
this . bgTokenizer . start ( 0 ) ; } ; this . onChangeFold = function ( e ) { var fold = e . data ; this . $resetRowCache ( fold . start . row ) ; } ; this . onChange = function ( e ) { var delta = e . data ; this . $modified = true ; this . $resetRowCache ( delta . range . start . row ) ; var removedFolds = this . $updateInternalDataOnChange ( e ) ; if ( ! this . $fromUndo && this . $undoManager && ! delta . ignore ) { this . $deltasDoc . push ( delta ) ; if ( removedFolds && removedFolds . length != 0 ) { this . $deltasFold . push ( { action : "removeFolds" , folds : removedFolds } ) ; }
this . $informUndoManager . schedule ( ) ; }
this . bgTokenizer . $updateOnChange ( delta ) ; this . _emit ( "change" , e ) ; } ; this . setValue = function ( text ) { this . doc . setValue ( text ) ; this . selection . moveCursorTo ( 0 , 0 ) ; this . selection . clearSelection ( ) ; this . $resetRowCache ( 0 ) ; this . $deltas = [ ] ; this . $deltasDoc = [ ] ; this . $deltasFold = [ ] ; this . getUndoManager ( ) . reset ( ) ; } ; this . getValue = this . toString = function ( ) { return this . doc . getValue ( ) ; } ; this . getSelection = function ( ) { return this . selection ; } ; this . getState = function ( row ) { return this . bgTokenizer . getState ( row ) ; } ; this . getTokens = function ( row ) { return this . bgTokenizer . getTokens ( row ) ; } ; this . getTokenAt = function ( row , column ) { var tokens = this . bgTokenizer . getTokens ( row ) ; var token , c = 0 ; if ( column == null ) { i = tokens . length - 1 ; c = this . getLine ( row ) . length ; } else { for ( var i = 0 ; i < tokens . length ; i ++ ) { c += tokens [ i ] . value . length ; if ( c >= column )
break ; } }
token = tokens [ i ] ; if ( ! token )
return null ; token . index = i ; token . start = c - token . value . length ; return token ; } ; this . setUndoManager = function ( undoManager ) { this . $undoManager = undoManager ; this . $deltas = [ ] ; this . $deltasDoc = [ ] ; this . $deltasFold = [ ] ; if ( this . $informUndoManager )
this . $informUndoManager . cancel ( ) ; if ( undoManager ) { var self = this ; this . $syncInformUndoManager = function ( ) { self . $informUndoManager . cancel ( ) ; if ( self . $deltasFold . length ) { self . $deltas . push ( { group : "fold" , deltas : self . $deltasFold } ) ; self . $deltasFold = [ ] ; }
if ( self . $deltasDoc . length ) { self . $deltas . push ( { group : "doc" , deltas : self . $deltasDoc } ) ; self . $deltasDoc = [ ] ; }
if ( self . $deltas . length > 0 ) { undoManager . execute ( { action : "aceupdate" , args : [ self . $deltas , self ] , merge : self . mergeUndoDeltas } ) ; }
self . mergeUndoDeltas = false ; self . $deltas = [ ] ; }
this . $informUndoManager = lang . delayedCall ( this . $syncInformUndoManager ) ; } } ; this . markUndoGroup = function ( ) { if ( this . $syncInformUndoManager )
this . $syncInformUndoManager ( ) ; } ; this . $defaultUndoManager = { undo : function ( ) { } , redo : function ( ) { } , reset : function ( ) { } } ; this . getUndoManager = function ( ) { return this . $undoManager || this . $defaultUndoManager ; } ; this . getTabString = function ( ) { if ( this . getUseSoftTabs ( ) ) { return lang . stringRepeat ( " " , this . getTabSize ( ) ) ; } else { return "\t" ; } } ; this . setUseSoftTabs = function ( val ) { this . setOption ( "useSoftTabs" , val ) ; } ; this . getUseSoftTabs = function ( ) { return this . $useSoftTabs && ! this . $mode . $indentWithTabs ; } ; this . setTabSize = function ( tabSize ) { this . setOption ( "tabSize" , tabSize ) } ; this . getTabSize = function ( ) { return this . $tabSize ; } ; this . isTabStop = function ( position ) { return this . $useSoftTabs && ( position . column % this . $tabSize == 0 ) ; } ; this . $overwrite = false ; this . setOverwrite = function ( overwrite ) { this . setOption ( "overwrite" , overwrite ) } ; this . getOverwrite = function ( ) { return this . $overwrite ; } ; this . toggleOverwrite = function ( ) { this . setOverwrite ( ! this . $overwrite ) ; } ; this . addGutterDecoration = function ( row , className ) { if ( ! this . $decorations [ row ] )
this . $decorations [ row ] = "" ; this . $decorations [ row ] += " " + className ; this . _emit ( "changeBreakpoint" , { } ) ; } ; this . removeGutterDecoration = function ( row , className ) { this . $decorations [ row ] = ( this . $decorations [ row ] || "" ) . replace ( " " + className , "" ) ; this . _emit ( "changeBreakpoint" , { } ) ; } ; this . getBreakpoints = function ( ) { return this . $breakpoints ; } ; this . setBreakpoints = function ( rows ) { this . $breakpoints = [ ] ; for ( var i = 0 ; i < rows . length ; i ++ ) { this . $breakpoints [ rows [ i ] ] = "ace_breakpoint" ; }
this . _emit ( "changeBreakpoint" , { } ) ; } ; this . clearBreakpoints = function ( ) { this . $breakpoints = [ ] ; this . _emit ( "changeBreakpoint" , { } ) ; } ; this . setBreakpoint = function ( row , className ) { if ( className === undefined )
className = "ace_breakpoint" ; if ( className )
this . $breakpoints [ row ] = className ; else
delete this . $breakpoints [ row ] ; this . _emit ( "changeBreakpoint" , { } ) ; } ; this . clearBreakpoint = function ( row ) { delete this . $breakpoints [ row ] ; this . _emit ( "changeBreakpoint" , { } ) ; } ; this . addMarker = function ( range , clazz , type , inFront ) { var id = this . $markerId ++ ; var marker = { range : range , type : type || "line" , renderer : typeof type == "function" ? type : null , clazz : clazz , inFront : ! ! inFront , id : id }
if ( inFront ) { this . $frontMarkers [ id ] = marker ; this . _emit ( "changeFrontMarker" ) } else { this . $backMarkers [ id ] = marker ; this . _emit ( "changeBackMarker" ) }
return id ; } ; this . addDynamicMarker = function ( marker , inFront ) { if ( ! marker . update )
return ; var id = this . $markerId ++ ; marker . id = id ; marker . inFront = ! ! inFront ; if ( inFront ) { this . $frontMarkers [ id ] = marker ; this . _emit ( "changeFrontMarker" ) } else { this . $backMarkers [ id ] = marker ; this . _emit ( "changeBackMarker" ) }
return marker ; } ; this . removeMarker = function ( markerId ) { var marker = this . $frontMarkers [ markerId ] || this . $backMarkers [ markerId ] ; if ( ! marker )
return ; var markers = marker . inFront ? this . $frontMarkers : this . $backMarkers ; if ( marker ) { delete ( markers [ markerId ] ) ; this . _emit ( marker . inFront ? "changeFrontMarker" : "changeBackMarker" ) ; } } ; this . getMarkers = function ( inFront ) { return inFront ? this . $frontMarkers : this . $backMarkers ; } ; this . highlight = function ( re ) { if ( ! this . $searchHighlight ) { var highlight = new SearchHighlight ( null , "ace_selected-word" , "text" ) ; this . $searchHighlight = this . addDynamicMarker ( highlight ) ; }
this . $searchHighlight . setRegexp ( re ) ; }
this . highlightLines = function ( startRow , endRow , clazz , inFront ) { if ( typeof endRow != "number" ) { clazz = endRow ; endRow = startRow ; }
if ( ! clazz )
clazz = "ace_step" ; var range = new Range ( startRow , 0 , endRow , Infinity ) ; range . id = this . addMarker ( range , clazz , "fullLine" , inFront ) ; return range ; } ; this . setAnnotations = function ( annotations ) { this . $annotations = annotations ; this . _emit ( "changeAnnotation" , { } ) ; } ; this . getAnnotations = function ( ) { return this . $annotations || [ ] ; } ; this . clearAnnotations = function ( ) { this . setAnnotations ( [ ] ) ; } ; this . $detectNewLine = function ( text ) { var match = text . match ( /^.*?(\r?\n)/m ) ; if ( match ) { this . $autoNewLine = match [ 1 ] ; } else { this . $autoNewLine = "\n" ; } } ; this . getWordRange = function ( row , column ) { var line = this . getLine ( row ) ; var inToken = false ; if ( column > 0 )
inToken = ! ! line . charAt ( column - 1 ) . match ( this . tokenRe ) ; if ( ! inToken )
inToken = ! ! line . charAt ( column ) . match ( this . tokenRe ) ; if ( inToken )
var re = this . tokenRe ; else if ( /^\s+$/ . test ( line . slice ( column - 1 , column + 1 ) ) )
var re = /\s/ ; else
var re = this . nonTokenRe ; var start = column ; if ( start > 0 ) { do { start -- ; }
while ( start >= 0 && line . charAt ( start ) . match ( re ) ) ; start ++ ; }
var end = column ; while ( end < line . length && line . charAt ( end ) . match ( re ) ) { end ++ ; }
return new Range ( row , start , row , end ) ; } ; this . getAWordRange = function ( row , column ) { var wordRange = this . getWordRange ( row , column ) ; var line = this . getLine ( wordRange . end . row ) ; while ( line . charAt ( wordRange . end . column ) . match ( /[ \t]/ ) ) { wordRange . end . column += 1 ; }
return wordRange ; } ; this . setNewLineMode = function ( newLineMode ) { this . doc . setNewLineMode ( newLineMode ) ; } ; this . getNewLineMode = function ( ) { return this . doc . getNewLineMode ( ) ; } ; this . setUseWorker = function ( useWorker ) { this . setOption ( "useWorker" , useWorker ) ; } ; this . getUseWorker = function ( ) { return this . $useWorker ; } ; this . onReloadTokenizer = function ( e ) { var rows = e . data ; this . bgTokenizer . start ( rows . first ) ; this . _emit ( "tokenizerUpdate" , e ) ; } ; this . $modes = { } ; this . $mode = null ; this . $modeId = null ; this . setMode = function ( mode , cb ) { if ( mode && typeof mode === "object" ) { if ( mode . getTokenizer )
return this . $onChangeMode ( mode ) ; var options = mode ; var path = options . path ; } else { path = mode || "ace/mode/text" ; }
if ( ! this . $modes [ "ace/mode/text" ] )
this . $modes [ "ace/mode/text" ] = new TextMode ( ) ; if ( this . $modes [ path ] && ! options ) { this . $onChangeMode ( this . $modes [ path ] ) ; cb && cb ( ) ; return ; }
this . $modeId = path ; config . loadModule ( [ "mode" , path ] , function ( m ) { if ( this . $modeId !== path )
return cb && cb ( ) ; if ( this . $modes [ path ] && ! options )
return this . $onChangeMode ( this . $modes [ path ] ) ; if ( m && m . Mode ) { m = new m . Mode ( options ) ; if ( ! options ) { this . $modes [ path ] = m ; m . $id = path ; }
this . $onChangeMode ( m ) ; cb && cb ( ) ; } } . bind ( this ) ) ; if ( ! this . $mode )
this . $onChangeMode ( this . $modes [ "ace/mode/text" ] , true ) ; } ; this . $onChangeMode = function ( mode , $isPlaceholder ) { if ( ! $isPlaceholder )
this . $modeId = mode . $id ; if ( this . $mode === mode )
return ; this . $mode = mode ; this . $stopWorker ( ) ; if ( this . $useWorker )
this . $startWorker ( ) ; var tokenizer = mode . getTokenizer ( ) ; if ( tokenizer . addEventListener !== undefined ) { var onReloadTokenizer = this . onReloadTokenizer . bind ( this ) ; tokenizer . addEventListener ( "update" , onReloadTokenizer ) ; }
if ( ! this . bgTokenizer ) { this . bgTokenizer = new BackgroundTokenizer ( tokenizer ) ; var _self = this ; this . bgTokenizer . addEventListener ( "update" , function ( e ) { _self . _emit ( "tokenizerUpdate" , e ) ; } ) ; } else { this . bgTokenizer . setTokenizer ( tokenizer ) ; }
this . bgTokenizer . setDocument ( this . getDocument ( ) ) ; this . tokenRe = mode . tokenRe ; this . nonTokenRe = mode . nonTokenRe ; this . $options . wrapMethod . set . call ( this , this . $wrapMethod ) ; if ( ! $isPlaceholder ) { this . $setFolding ( mode . foldingRules ) ; this . _emit ( "changeMode" ) ; this . bgTokenizer . start ( 0 ) ; } } ; this . $stopWorker = function ( ) { if ( this . $worker )
this . $worker . terminate ( ) ; this . $worker = null ; } ; this . $startWorker = function ( ) { if ( typeof Worker !== "undefined" && ! require . noWorker ) { try { this . $worker = this . $mode . createWorker ( this ) ; } catch ( e ) { console . log ( "Could not load worker" ) ; console . log ( e ) ; this . $worker = null ; } }
else
this . $worker = null ; } ; this . getMode = function ( ) { return this . $mode ; } ; this . $scrollTop = 0 ; this . setScrollTop = function ( scrollTop ) { if ( this . $scrollTop === scrollTop || isNaN ( scrollTop ) )
return ; this . $scrollTop = scrollTop ; this . _signal ( "changeScrollTop" , scrollTop ) ; } ; this . getScrollTop = function ( ) { return this . $scrollTop ; } ; this . $scrollLeft = 0 ; this . setScrollLeft = function ( scrollLeft ) { if ( this . $scrollLeft === scrollLeft || isNaN ( scrollLeft ) )
return ; this . $scrollLeft = scrollLeft ; this . _signal ( "changeScrollLeft" , scrollLeft ) ; } ; this . getScrollLeft = function ( ) { return this . $scrollLeft ; } ; this . getScreenWidth = function ( ) { this . $computeWidth ( ) ; return this . screenWidth ; } ; this . $computeWidth = function ( force ) { if ( this . $modified || force ) { this . $modified = false ; if ( this . $useWrapMode )
return this . screenWidth = this . $wrapLimit ; var lines = this . doc . getAllLines ( ) ; var cache = this . $rowLengthCache ; var longestScreenLine = 0 ; var foldIndex = 0 ; var foldLine = this . $foldData [ foldIndex ] ; var foldStart = foldLine ? foldLine . start . row : Infinity ; var len = lines . length ; for ( var i = 0 ; i < len ; i ++ ) { if ( i > foldStart ) { i = foldLine . end . row + 1 ; if ( i >= len )
break ; foldLine = this . $foldData [ foldIndex ++ ] ; foldStart = foldLine ? foldLine . start . row : Infinity ; }
if ( cache [ i ] == null )
cache [ i ] = this . $getStringScreenWidth ( lines [ i ] ) [ 0 ] ; if ( cache [ i ] > longestScreenLine )
longestScreenLine = cache [ i ] ; }
this . screenWidth = longestScreenLine ; } } ; this . getLine = function ( row ) { return this . doc . getLine ( row ) ; } ; this . getLines = function ( firstRow , lastRow ) { return this . doc . getLines ( firstRow , lastRow ) ; } ; this . getLength = function ( ) { return this . doc . getLength ( ) ; } ; this . getTextRange = function ( range ) { return this . doc . getTextRange ( range || this . selection . getRange ( ) ) ; } ; this . insert = function ( position , text ) { return this . doc . insert ( position , text ) ; } ; this . remove = function ( range ) { return this . doc . remove ( range ) ; } ; this . undoChanges = function ( deltas , dontSelect ) { if ( ! deltas . length )
return ; this . $fromUndo = true ; var lastUndoRange = null ; for ( var i = deltas . length - 1 ; i != - 1 ; i -- ) { var delta = deltas [ i ] ; if ( delta . group == "doc" ) { this . doc . revertDeltas ( delta . deltas ) ; lastUndoRange = this . $getUndoSelection ( delta . deltas , true , lastUndoRange ) ; } else { delta . deltas . forEach ( function ( foldDelta ) { this . addFolds ( foldDelta . folds ) ; } , this ) ; } }
this . $fromUndo = false ; lastUndoRange && this . $undoSelect && ! dontSelect && this . selection . setSelectionRange ( lastUndoRange ) ; return lastUndoRange ; } ; this . redoChanges = function ( deltas , dontSelect ) { if ( ! deltas . length )
return ; this . $fromUndo = true ; var lastUndoRange = null ; for ( var i = 0 ; i < deltas . length ; i ++ ) { var delta = deltas [ i ] ; if ( delta . group == "doc" ) { this . doc . applyDeltas ( delta . deltas ) ; lastUndoRange = this . $getUndoSelection ( delta . deltas , false , lastUndoRange ) ; } }
this . $fromUndo = false ; lastUndoRange && this . $undoSelect && ! dontSelect && this . selection . setSelectionRange ( lastUndoRange ) ; return lastUndoRange ; } ; this . setUndoSelect = function ( enable ) { this . $undoSelect = enable ; } ; this . $getUndoSelection = function ( deltas , isUndo , lastUndoRange ) { function isInsert ( delta ) { var insert = delta . action === "insertText" || delta . action === "insertLines" ; return isUndo ? ! insert : insert ; }
var delta = deltas [ 0 ] ; var range , point ; var lastDeltaIsInsert = false ; if ( isInsert ( delta ) ) { range = Range . fromPoints ( delta . range . start , delta . range . end ) ; lastDeltaIsInsert = true ; } else { range = Range . fromPoints ( delta . range . start , delta . range . start ) ; lastDeltaIsInsert = false ; }
for ( var i = 1 ; i < deltas . length ; i ++ ) { delta = deltas [ i ] ; if ( isInsert ( delta ) ) { point = delta . range . start ; if ( range . compare ( point . row , point . column ) == - 1 ) { range . setStart ( delta . range . start ) ; }
point = delta . range . end ; if ( range . compare ( point . row , point . column ) == 1 ) { range . setEnd ( delta . range . end ) ; }
lastDeltaIsInsert = true ; } else { point = delta . range . start ; if ( range . compare ( point . row , point . column ) == - 1 ) { range = Range . fromPoints ( delta . range . start , delta . range . start ) ; }
lastDeltaIsInsert = false ; } }
if ( lastUndoRange != null ) { if ( Range . comparePoints ( lastUndoRange . start , range . start ) == 0 ) { lastUndoRange . start . column += range . end . column - range . start . column ; lastUndoRange . end . column += range . end . column - range . start . column ; }
var cmp = lastUndoRange . compareRange ( range ) ; if ( cmp == 1 ) { range . setStart ( lastUndoRange . start ) ; } else if ( cmp == - 1 ) { range . setEnd ( lastUndoRange . end ) ; } }
return range ; } ; this . replace = function ( range , text ) { return this . doc . replace ( range , text ) ; } ; this . moveText = function ( fromRange , toPosition , copy ) { var text = this . getTextRange ( fromRange ) ; var folds = this . getFoldsInRange ( fromRange ) ; var toRange = Range . fromPoints ( toPosition , toPosition ) ; if ( ! copy ) { this . remove ( fromRange ) ; var rowDiff = fromRange . start . row - fromRange . end . row ; var collDiff = rowDiff ? - fromRange . end . column : fromRange . start . column - fromRange . end . column ; if ( collDiff ) { if ( toRange . start . row == fromRange . end . row && toRange . start . column > fromRange . end . column )
toRange . start . column += collDiff ; if ( toRange . end . row == fromRange . end . row && toRange . end . column > fromRange . end . column )
toRange . end . column += collDiff ; }
if ( rowDiff && toRange . start . row >= fromRange . end . row ) { toRange . start . row += rowDiff ; toRange . end . row += rowDiff ; } }
toRange . end = this . insert ( toRange . start , text ) ; if ( folds . length ) { var oldStart = fromRange . start ; var newStart = toRange . start ; var rowDiff = newStart . row - oldStart . row ; var collDiff = newStart . column - oldStart . column ; this . addFolds ( folds . map ( function ( x ) { x = x . clone ( ) ; if ( x . start . row == oldStart . row )
x . start . column += collDiff ; if ( x . end . row == oldStart . row )
x . end . column += collDiff ; x . start . row += rowDiff ; x . end . row += rowDiff ; return x ; } ) ) ; }
return toRange ; } ; this . indentRows = function ( startRow , endRow , indentString ) { indentString = indentString . replace ( /\t/g , this . getTabString ( ) ) ; for ( var row = startRow ; row <= endRow ; row ++ )
this . insert ( { row : row , column : 0 } , indentString ) ; } ; this . outdentRows = function ( range ) { var rowRange = range . collapseRows ( ) ; var deleteRange = new Range ( 0 , 0 , 0 , 0 ) ; var size = this . getTabSize ( ) ; for ( var i = rowRange . start . row ; i <= rowRange . end . row ; ++ i ) { var line = this . getLine ( i ) ; deleteRange . start . row = i ; deleteRange . end . row = i ; for ( var j = 0 ; j < size ; ++ j )
if ( line . charAt ( j ) != ' ' )
break ; if ( j < size && line . charAt ( j ) == '\t' ) { deleteRange . start . column = j ; deleteRange . end . column = j + 1 ; } else { deleteRange . start . column = 0 ; deleteRange . end . column = j ; }
this . remove ( deleteRange ) ; } } ; this . $moveLines = function ( firstRow , lastRow , dir ) { firstRow = this . getRowFoldStart ( firstRow ) ; lastRow = this . getRowFoldEnd ( lastRow ) ; if ( dir < 0 ) { var row = this . getRowFoldStart ( firstRow + dir ) ; if ( row < 0 ) return 0 ; var diff = row - firstRow ; } else if ( dir > 0 ) { var row = this . getRowFoldEnd ( lastRow + dir ) ; if ( row > this . doc . getLength ( ) - 1 ) return 0 ; var diff = row - lastRow ; } else { firstRow = this . $clipRowToDocument ( firstRow ) ; lastRow = this . $clipRowToDocument ( lastRow ) ; var diff = lastRow - firstRow + 1 ; }
var range = new Range ( firstRow , 0 , lastRow , Number . MAX _VALUE ) ; var folds = this . getFoldsInRange ( range ) . map ( function ( x ) { x = x . clone ( ) ; x . start . row += diff ; x . end . row += diff ; return x ; } ) ; var lines = dir == 0 ? this . doc . getLines ( firstRow , lastRow ) : this . doc . removeLines ( firstRow , lastRow ) ; this . doc . insertLines ( firstRow + diff , lines ) ; folds . length && this . addFolds ( folds ) ; return diff ; } ; this . moveLinesUp = function ( firstRow , lastRow ) { return this . $moveLines ( firstRow , lastRow , - 1 ) ; } ; this . moveLinesDown = function ( firstRow , lastRow ) { return this . $moveLines ( firstRow , lastRow , 1 ) ; } ; this . duplicateLines = function ( firstRow , lastRow ) { return this . $moveLines ( firstRow , lastRow , 0 ) ; } ; this . $clipRowToDocument = function ( row ) { return Math . max ( 0 , Math . min ( row , this . doc . getLength ( ) - 1 ) ) ; } ; this . $clipColumnToRow = function ( row , column ) { if ( column < 0 )
return 0 ; return Math . min ( this . doc . getLine ( row ) . length , column ) ; } ; this . $clipPositionToDocument = function ( row , column ) { column = Math . max ( 0 , column ) ; if ( row < 0 ) { row = 0 ; column = 0 ; } else { var len = this . doc . getLength ( ) ; if ( row >= len ) { row = len - 1 ; column = this . doc . getLine ( len - 1 ) . length ; } else { column = Math . min ( this . doc . getLine ( row ) . length , column ) ; } }
return { row : row , column : column } ; } ; this . $clipRangeToDocument = function ( range ) { if ( range . start . row < 0 ) { range . start . row = 0 ; range . start . column = 0 ; } else { range . start . column = this . $clipColumnToRow ( range . start . row , range . start . column ) ; }
var len = this . doc . getLength ( ) - 1 ; if ( range . end . row > len ) { range . end . row = len ; range . end . column = this . doc . getLine ( len ) . length ; } else { range . end . column = this . $clipColumnToRow ( range . end . row , range . end . column ) ; }
return range ; } ; this . $wrapLimit = 80 ; this . $useWrapMode = false ; this . $wrapLimitRange = { min : null , max : null } ; this . setUseWrapMode = function ( useWrapMode ) { if ( useWrapMode != this . $useWrapMode ) { this . $useWrapMode = useWrapMode ; this . $modified = true ; this . $resetRowCache ( 0 ) ; if ( useWrapMode ) { var len = this . getLength ( ) ; this . $wrapData = [ ] ; for ( var i = 0 ; i < len ; i ++ ) { this . $wrapData . push ( [ ] ) ; }
this . $updateWrapData ( 0 , len - 1 ) ; }
this . _emit ( "changeWrapMode" ) ; } } ; this . getUseWrapMode = function ( ) { return this . $useWrapMode ; } ; this . setWrapLimitRange = function ( min , max ) { if ( this . $wrapLimitRange . min !== min || this . $wrapLimitRange . max !== max ) { this . $wrapLimitRange = { min : min , max : max } ; this . $modified = true ; this . _emit ( "changeWrapMode" ) ; } } ; this . adjustWrapLimit = function ( desiredLimit , $printMargin ) { var limits = this . $wrapLimitRange
if ( limits . max < 0 )
limits = { min : $printMargin , max : $printMargin } ; var wrapLimit = this . $constrainWrapLimit ( desiredLimit , limits . min , limits . max ) ; if ( wrapLimit != this . $wrapLimit && wrapLimit > 1 ) { this . $wrapLimit = wrapLimit ; this . $modified = true ; if ( this . $useWrapMode ) { this . $updateWrapData ( 0 , this . getLength ( ) - 1 ) ; this . $resetRowCache ( 0 ) ; this . _emit ( "changeWrapLimit" ) ; }
return true ; }
return false ; } ; this . $constrainWrapLimit = function ( wrapLimit , min , max ) { if ( min )
wrapLimit = Math . max ( min , wrapLimit ) ; if ( max )
wrapLimit = Math . min ( max , wrapLimit ) ; return wrapLimit ; } ; this . getWrapLimit = function ( ) { return this . $wrapLimit ; } ; this . setWrapLimit = function ( limit ) { this . setWrapLimitRange ( limit , limit ) ; } ; this . getWrapLimitRange = function ( ) { return { min : this . $wrapLimitRange . min , max : this . $wrapLimitRange . max } ; } ; this . $updateInternalDataOnChange = function ( e ) { var useWrapMode = this . $useWrapMode ; var len ; var action = e . data . action ; var firstRow = e . data . range . start . row ; var lastRow = e . data . range . end . row ; var start = e . data . range . start ; var end = e . data . range . end ; var removedFolds = null ; if ( action . indexOf ( "Lines" ) != - 1 ) { if ( action == "insertLines" ) { lastRow = firstRow + ( e . data . lines . length ) ; } else { lastRow = firstRow ; }
len = e . data . lines ? e . data . lines . length : lastRow - firstRow ; } else { len = lastRow - firstRow ; }
this . $updating = true ; if ( len != 0 ) { if ( action . indexOf ( "remove" ) != - 1 ) { this [ useWrapMode ? "$wrapData" : "$rowLengthCache" ] . splice ( firstRow , len ) ; var foldLines = this . $foldData ; removedFolds = this . getFoldsInRange ( e . data . range ) ; this . removeFolds ( removedFolds ) ; var foldLine = this . getFoldLine ( end . row ) ; var idx = 0 ; if ( foldLine ) { foldLine . addRemoveChars ( end . row , end . column , start . column - end . column ) ; foldLine . shiftRow ( - len ) ; var foldLineBefore = this . getFoldLine ( firstRow ) ; if ( foldLineBefore && foldLineBefore !== foldLine ) { foldLineBefore . merge ( foldLine ) ; foldLine = foldLineBefore ; }
idx = foldLines . indexOf ( foldLine ) + 1 ; }
for ( idx ; idx < foldLines . length ; idx ++ ) { var foldLine = foldLines [ idx ] ; if ( foldLine . start . row >= end . row ) { foldLine . shiftRow ( - len ) ; } }
lastRow = firstRow ; } else { var args ; if ( useWrapMode ) { args = [ firstRow , 0 ] ; for ( var i = 0 ; i < len ; i ++ ) args . push ( [ ] ) ; this . $wrapData . splice . apply ( this . $wrapData , args ) ; } else { args = Array ( len ) ; args . unshift ( firstRow , 0 ) ; this . $rowLengthCache . splice . apply ( this . $rowLengthCache , args ) ; }
var foldLines = this . $foldData ; var foldLine = this . getFoldLine ( firstRow ) ; var idx = 0 ; if ( foldLine ) { var cmp = foldLine . range . compareInside ( start . row , start . column )
if ( cmp == 0 ) { foldLine = foldLine . split ( start . row , start . column ) ; foldLine . shiftRow ( len ) ; foldLine . addRemoveChars ( lastRow , 0 , end . column - start . column ) ; } else
if ( cmp == - 1 ) { foldLine . addRemoveChars ( firstRow , 0 , end . column - start . column ) ; foldLine . shiftRow ( len ) ; }
idx = foldLines . indexOf ( foldLine ) + 1 ; }
for ( idx ; idx < foldLines . length ; idx ++ ) { var foldLine = foldLines [ idx ] ; if ( foldLine . start . row >= firstRow ) { foldLine . shiftRow ( len ) ; } } } } else { len = Math . abs ( e . data . range . start . column - e . data . range . end . column ) ; if ( action . indexOf ( "remove" ) != - 1 ) { removedFolds = this . getFoldsInRange ( e . data . range ) ; this . removeFolds ( removedFolds ) ; len = - len ; }
var foldLine = this . getFoldLine ( firstRow ) ; if ( foldLine ) { foldLine . addRemoveChars ( firstRow , start . column , len ) ; } }
if ( useWrapMode && this . $wrapData . length != this . doc . getLength ( ) ) { console . error ( "doc.getLength() and $wrapData.length have to be the same!" ) ; }
this . $updating = false ; if ( useWrapMode )
this . $updateWrapData ( firstRow , lastRow ) ; else
this . $updateRowLengthCache ( firstRow , lastRow ) ; return removedFolds ; } ; this . $updateRowLengthCache = function ( firstRow , lastRow , b ) { this . $rowLengthCache [ firstRow ] = null ; this . $rowLengthCache [ lastRow ] = null ; } ; this . $updateWrapData = function ( firstRow , lastRow ) { var lines = this . doc . getAllLines ( ) ; var tabSize = this . getTabSize ( ) ; var wrapData = this . $wrapData ; var wrapLimit = this . $wrapLimit ; var tokens ; var foldLine ; var row = firstRow ; lastRow = Math . min ( lastRow , lines . length - 1 ) ; while ( row <= lastRow ) { foldLine = this . getFoldLine ( row , foldLine ) ; if ( ! foldLine ) { tokens = this . $getDisplayTokens ( lines [ row ] ) ; wrapData [ row ] = this . $computeWrapSplits ( tokens , wrapLimit , tabSize ) ; row ++ ; } else { tokens = [ ] ; foldLine . walk ( function ( placeholder , row , column , lastColumn ) { var walkTokens ; if ( placeholder != null ) { walkTokens = this . $getDisplayTokens ( placeholder , tokens . length ) ; walkTokens [ 0 ] = PLACEHOLDER _START ; for ( var i = 1 ; i < walkTokens . length ; i ++ ) { walkTokens [ i ] = PLACEHOLDER _BODY ; } } else { walkTokens = this . $getDisplayTokens ( lines [ row ] . substring ( lastColumn , column ) , tokens . length ) ; }
tokens = tokens . concat ( walkTokens ) ; } . bind ( this ) , foldLine . end . row , lines [ foldLine . end . row ] . length + 1 ) ; wrapData [ foldLine . start . row ] = this . $computeWrapSplits ( tokens , wrapLimit , tabSize ) ; row = foldLine . end . row + 1 ; } } } ; var CHAR = 1 , CHAR _EXT = 2 , PLACEHOLDER _START = 3 , PLACEHOLDER _BODY = 4 , PUNCTUATION = 9 , SPACE = 10 , TAB = 11 , TAB _SPACE = 12 ; this . $computeWrapSplits = function ( tokens , wrapLimit ) { if ( tokens . length == 0 ) { return [ ] ; }
var splits = [ ] ; var displayLength = tokens . length ; var lastSplit = 0 , lastDocSplit = 0 ; var isCode = this . $wrapAsCode ; function addSplit ( screenPos ) { var displayed = tokens . slice ( lastSplit , screenPos ) ; var len = displayed . length ; displayed . join ( "" ) . replace ( /12/g , function ( ) { len -= 1 ; } ) . replace ( /2/g , function ( ) { len -= 1 ; } ) ; lastDocSplit += len ; splits . push ( lastDocSplit ) ; lastSplit = screenPos ; }
while ( displayLength - lastSplit > wrapLimit ) { var split = lastSplit + wrapLimit ; if ( tokens [ split - 1 ] >= SPACE && tokens [ split ] >= SPACE ) { addSplit ( split ) ; continue ; }
if ( tokens [ split ] == PLACEHOLDER _START || tokens [ split ] == PLACEHOLDER _BODY ) { for ( split ; split != lastSplit - 1 ; split -- ) { if ( tokens [ split ] == PLACEHOLDER _START ) { break ; } }
if ( split > lastSplit ) { addSplit ( split ) ; continue ; }
split = lastSplit + wrapLimit ; for ( split ; split < tokens . length ; split ++ ) { if ( tokens [ split ] != PLACEHOLDER _BODY ) { break ; } }
if ( split == tokens . length ) { break ; }
addSplit ( split ) ; continue ; }
var minSplit = Math . max ( split - ( isCode ? 10 : wrapLimit - ( wrapLimit >> 2 ) ) , lastSplit - 1 ) ; while ( split > minSplit && tokens [ split ] < PLACEHOLDER _START ) { split -- ; }
if ( isCode ) { while ( split > minSplit && tokens [ split ] < PLACEHOLDER _START ) { split -- ; }
while ( split > minSplit && tokens [ split ] == PUNCTUATION ) { split -- ; } } else { while ( split > minSplit && tokens [ split ] < SPACE ) { split -- ; } }
if ( split > minSplit ) { addSplit ( ++ split ) ; continue ; }
split = lastSplit + wrapLimit ; addSplit ( split ) ; }
return splits ; } ; this . $getDisplayTokens = function ( str , offset ) { var arr = [ ] ; var tabSize ; offset = offset || 0 ; for ( var i = 0 ; i < str . length ; i ++ ) { var c = str . charCodeAt ( i ) ; if ( c == 9 ) { tabSize = this . getScreenTabSize ( arr . length + offset ) ; arr . push ( TAB ) ; for ( var n = 1 ; n < tabSize ; n ++ ) { arr . push ( TAB _SPACE ) ; } }
else if ( c == 32 ) { arr . push ( SPACE ) ; } else if ( ( c > 39 && c < 48 ) || ( c > 57 && c < 64 ) ) { arr . push ( PUNCTUATION ) ; }
else if ( c >= 0x1100 && isFullWidth ( c ) ) { arr . push ( CHAR , CHAR _EXT ) ; } else { arr . push ( CHAR ) ; } }
return arr ; } ; this . $getStringScreenWidth = function ( str , maxScreenColumn , screenColumn ) { if ( maxScreenColumn == 0 )
return [ 0 , 0 ] ; if ( maxScreenColumn == null )
maxScreenColumn = Infinity ; screenColumn = screenColumn || 0 ; var c , column ; for ( column = 0 ; column < str . length ; column ++ ) { c = str . charCodeAt ( column ) ; if ( c == 9 ) { screenColumn += this . getScreenTabSize ( screenColumn ) ; }
else if ( c >= 0x1100 && isFullWidth ( c ) ) { screenColumn += 2 ; } else { screenColumn += 1 ; }
if ( screenColumn > maxScreenColumn ) { break ; } }
return [ screenColumn , column ] ; } ; this . getRowLength = function ( row ) { if ( ! this . $useWrapMode || ! this . $wrapData [ row ] ) { return 1 ; } else { return this . $wrapData [ row ] . length + 1 ; } } ; this . getScreenLastRowColumn = function ( screenRow ) { var pos = this . screenToDocumentPosition ( screenRow , Number . MAX _VALUE ) ; return this . documentToScreenColumn ( pos . row , pos . column ) ; } ; this . getDocumentLastRowColumn = function ( docRow , docColumn ) { var screenRow = this . documentToScreenRow ( docRow , docColumn ) ; return this . getScreenLastRowColumn ( screenRow ) ; } ; this . getDocumentLastRowColumnPosition = function ( docRow , docColumn ) { var screenRow = this . documentToScreenRow ( docRow , docColumn ) ; return this . screenToDocumentPosition ( screenRow , Number . MAX _VALUE / 10 ) ; } ; this . getRowSplitData = function ( row ) { if ( ! this . $useWrapMode ) { return undefined ; } else { return this . $wrapData [ row ] ; } } ; this . getScreenTabSize = function ( screenColumn ) { return this . $tabSize - screenColumn % this . $tabSize ; } ; this . screenToDocumentRow = function ( screenRow , screenColumn ) { return this . screenToDocumentPosition ( screenRow , screenColumn ) . row ; } ; this . screenToDocumentColumn = function ( screenRow , screenColumn ) { return this . screenToDocumentPosition ( screenRow , screenColumn ) . column ; } ; this . screenToDocumentPosition = function ( screenRow , screenColumn ) { if ( screenRow < 0 )
return { row : 0 , column : 0 } ; var line ; var docRow = 0 ; var docColumn = 0 ; var column ; var row = 0 ; var rowLength = 0 ; var rowCache = this . $screenRowCache ; var i = this . $getRowCacheIndex ( rowCache , screenRow ) ; var l = rowCache . length ; if ( l && i >= 0 ) { var row = rowCache [ i ] ; var docRow = this . $docRowCache [ i ] ; var doCache = screenRow > rowCache [ l - 1 ] ; } else { var doCache = ! l ; }
var maxRow = this . getLength ( ) - 1 ; var foldLine = this . getNextFoldLine ( docRow ) ; var foldStart = foldLine ? foldLine . start . row : Infinity ; while ( row <= screenRow ) { rowLength = this . getRowLength ( docRow ) ; if ( row + rowLength - 1 >= screenRow || docRow >= maxRow ) { break ; } else { row += rowLength ; docRow ++ ; if ( docRow > foldStart ) { docRow = foldLine . end . row + 1 ; foldLine = this . getNextFoldLine ( docRow , foldLine ) ; foldStart = foldLine ? foldLine . start . row : Infinity ; } }
if ( doCache ) { this . $docRowCache . push ( docRow ) ; this . $screenRowCache . push ( row ) ; } }
if ( foldLine && foldLine . start . row <= docRow ) { line = this . getFoldDisplayLine ( foldLine ) ; docRow = foldLine . start . row ; } else if ( row + rowLength <= screenRow || docRow > maxRow ) { return { row : maxRow , column : this . getLine ( maxRow ) . length } } else { line = this . getLine ( docRow ) ; foldLine = null ; }
if ( this . $useWrapMode ) { var splits = this . $wrapData [ docRow ] ; if ( splits ) { column = splits [ screenRow - row ] ; if ( screenRow > row && splits . length ) { docColumn = splits [ screenRow - row - 1 ] || splits [ splits . length - 1 ] ; line = line . substring ( docColumn ) ; } } }
docColumn += this . $getStringScreenWidth ( line , screenColumn ) [ 1 ] ; if ( this . $useWrapMode && docColumn >= column )
docColumn = column - 1 ; if ( foldLine )
return foldLine . idxToPosition ( docColumn ) ; return { row : docRow , column : docColumn } ; } ; this . documentToScreenPosition = function ( docRow , docColumn ) { if ( typeof docColumn === "undefined" )
var pos = this . $clipPositionToDocument ( docRow . row , docRow . column ) ; else
pos = this . $clipPositionToDocument ( docRow , docColumn ) ; docRow = pos . row ; docColumn = pos . column ; var screenRow = 0 ; var foldStartRow = null ; var fold = null ; fold = this . getFoldAt ( docRow , docColumn , 1 ) ; if ( fold ) { docRow = fold . start . row ; docColumn = fold . start . column ; }
var rowEnd , row = 0 ; var rowCache = this . $docRowCache ; var i = this . $getRowCacheIndex ( rowCache , docRow ) ; var l = rowCache . length ; if ( l && i >= 0 ) { var row = rowCache [ i ] ; var screenRow = this . $screenRowCache [ i ] ; var doCache = docRow > rowCache [ l - 1 ] ; } else { var doCache = ! l ; }
var foldLine = this . getNextFoldLine ( row ) ; var foldStart = foldLine ? foldLine . start . row : Infinity ; while ( row < docRow ) { if ( row >= foldStart ) { rowEnd = foldLine . end . row + 1 ; if ( rowEnd > docRow )
break ; foldLine = this . getNextFoldLine ( rowEnd , foldLine ) ; foldStart = foldLine ? foldLine . start . row : Infinity ; }
else { rowEnd = row + 1 ; }
screenRow += this . getRowLength ( row ) ; row = rowEnd ; if ( doCache ) { this . $docRowCache . push ( row ) ; this . $screenRowCache . push ( screenRow ) ; } }
var textLine = "" ; if ( foldLine && row >= foldStart ) { textLine = this . getFoldDisplayLine ( foldLine , docRow , docColumn ) ; foldStartRow = foldLine . start . row ; } else { textLine = this . getLine ( docRow ) . substring ( 0 , docColumn ) ; foldStartRow = docRow ; }
if ( this . $useWrapMode ) { var wrapRow = this . $wrapData [ foldStartRow ] ; var screenRowOffset = 0 ; while ( textLine . length >= wrapRow [ screenRowOffset ] ) { screenRow ++ ; screenRowOffset ++ ; }
textLine = textLine . substring ( wrapRow [ screenRowOffset - 1 ] || 0 , textLine . length ) ; }
return { row : screenRow , column : this . $getStringScreenWidth ( textLine ) [ 0 ] } ; } ; this . documentToScreenColumn = function ( row , docColumn ) { return this . documentToScreenPosition ( row , docColumn ) . column ; } ; this . documentToScreenRow = function ( docRow , docColumn ) { return this . documentToScreenPosition ( docRow , docColumn ) . row ; } ; this . getScreenLength = function ( ) { var screenRows = 0 ; var fold = null ; if ( ! this . $useWrapMode ) { screenRows = this . getLength ( ) ; var foldData = this . $foldData ; for ( var i = 0 ; i < foldData . length ; i ++ ) { fold = foldData [ i ] ; screenRows -= fold . end . row - fold . start . row ; } } else { var lastRow = this . $wrapData . length ; var row = 0 , i = 0 ; var fold = this . $foldData [ i ++ ] ; var foldStart = fold ? fold . start . row : Infinity ; while ( row < lastRow ) { screenRows += this . $wrapData [ row ] . length + 1 ; row ++ ; if ( row > foldStart ) { row = fold . end . row + 1 ; fold = this . $foldData [ i ++ ] ; foldStart = fold ? fold . start . row : Infinity ; } } }
return screenRows ; } ; function isFullWidth ( c ) { if ( c < 0x1100 )
return false ; return c >= 0x1100 && c <= 0x115F || c >= 0x11A3 && c <= 0x11A7 || c >= 0x11FA && c <= 0x11FF || c >= 0x2329 && c <= 0x232A || c >= 0x2E80 && c <= 0x2E99 || c >= 0x2E9B && c <= 0x2EF3 || c >= 0x2F00 && c <= 0x2FD5 || c >= 0x2FF0 && c <= 0x2FFB || c >= 0x3000 && c <= 0x303E || c >= 0x3041 && c <= 0x3096 || c >= 0x3099 && c <= 0x30FF || c >= 0x3105 && c <= 0x312D || c >= 0x3131 && c <= 0x318E || c >= 0x3190 && c <= 0x31BA || c >= 0x31C0 && c <= 0x31E3 || c >= 0x31F0 && c <= 0x321E || c >= 0x3220 && c <= 0x3247 || c >= 0x3250 && c <= 0x32FE || c >= 0x3300 && c <= 0x4DBF || c >= 0x4E00 && c <= 0xA48C || c >= 0xA490 && c <= 0xA4C6 || c >= 0xA960 && c <= 0xA97C || c >= 0xAC00 && c <= 0xD7A3 || c >= 0xD7B0 && c <= 0xD7C6 || c >= 0xD7CB && c <= 0xD7FB || c >= 0xF900 && c <= 0xFAFF || c >= 0xFE10 && c <= 0xFE19 || c >= 0xFE30 && c <= 0xFE52 || c >= 0xFE54 && c <= 0xFE66 || c >= 0xFE68 && c <= 0xFE6B || c >= 0xFF01 && c <= 0xFF60 || c >= 0xFFE0 && c <= 0xFFE6 ; } ; } ) . call ( EditSession . prototype ) ; require ( "./edit_session/folding" ) . Folding . call ( EditSession . prototype ) ; require ( "./edit_session/bracket_match" ) . BracketMatch . call ( EditSession . prototype ) ; config . defineOptions ( EditSession . prototype , "session" , { wrap : { set : function ( value ) { if ( ! value || value == "off" )
value = false ; else if ( value == "free" )
value = true ; else if ( value == "printMargin" )
value = - 1 ; else if ( typeof value == "string" )
value = parseInt ( value , 10 ) || false ; if ( this . $wrap == value )
return ; if ( ! value ) { this . setUseWrapMode ( false ) ; } else { var col = typeof value == "number" ? value : null ; this . setWrapLimitRange ( col , col ) ; this . setUseWrapMode ( true ) ; }
this . $wrap = value ; } , get : function ( ) { return this . getUseWrapMode ( ) ? this . getWrapLimitRange ( ) . min || "free" : "off" ; } , handlesSet : true } , wrapMethod : { set : function ( val ) { if ( val == "auto" )
this . $wrapAsCode = this . $mode . type != "text" ; else
this . $wrapAsCode = val != "text" ; } , initialValue : "auto" } , firstLineNumber : { set : function ( ) { this . _emit ( "changeBreakpoint" ) ; } , initialValue : 1 } , useWorker : { set : function ( useWorker ) { this . $useWorker = useWorker ; this . $stopWorker ( ) ; if ( useWorker )
this . $startWorker ( ) ; } , initialValue : true } , useSoftTabs : { initialValue : true } , tabSize : { set : function ( tabSize ) { if ( isNaN ( tabSize ) || this . $tabSize === tabSize ) return ; this . $modified = true ; this . $rowLengthCache = [ ] ; this . $tabSize = tabSize ; this . _emit ( "changeTabSize" ) ; } , initialValue : 4 , handlesSet : true } , overwrite : { set : function ( val ) { this . _emit ( "changeOverwrite" ) ; } , initialValue : false } , newLineMode : { set : function ( val ) { this . doc . setNewLineMode ( val ) } , get : function ( ) { return this . doc . getNewLineMode ( ) } , handlesSet : true } } ) ; exports . EditSession = EditSession ; } ) ; define ( 'ace/selection' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/lang' , 'ace/lib/event_emitter' , 'ace/range' ] , function ( require , exports , module ) { var oop = require ( "./lib/oop" ) ; var lang = require ( "./lib/lang" ) ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var Range = require ( "./range" ) . Range ; var Selection = function ( session ) { this . session = session ; this . doc = session . getDocument ( ) ; this . clearSelection ( ) ; this . lead = this . selectionLead = this . doc . createAnchor ( 0 , 0 ) ; this . anchor = this . selectionAnchor = this . doc . createAnchor ( 0 , 0 ) ; var self = this ; this . lead . on ( "change" , function ( e ) { self . _emit ( "changeCursor" ) ; if ( ! self . $isEmpty )
self . _emit ( "changeSelection" ) ; if ( ! self . $keepDesiredColumnOnChange && e . old . column != e . value . column )
self . $desiredColumn = null ; } ) ; this . selectionAnchor . on ( "change" , function ( ) { if ( ! self . $isEmpty )
self . _emit ( "changeSelection" ) ; } ) ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . isEmpty = function ( ) { return ( this . $isEmpty || ( this . anchor . row == this . lead . row && this . anchor . column == this . lead . column ) ) ; } ; this . isMultiLine = function ( ) { if ( this . isEmpty ( ) ) { return false ; }
return this . getRange ( ) . isMultiLine ( ) ; } ; this . getCursor = function ( ) { return this . lead . getPosition ( ) ; } ; this . setSelectionAnchor = function ( row , column ) { this . anchor . setPosition ( row , column ) ; if ( this . $isEmpty ) { this . $isEmpty = false ; this . _emit ( "changeSelection" ) ; } } ; this . getSelectionAnchor = function ( ) { if ( this . $isEmpty )
return this . getSelectionLead ( )
else
return this . anchor . getPosition ( ) ; } ; this . getSelectionLead = function ( ) { return this . lead . getPosition ( ) ; } ; this . shiftSelection = function ( columns ) { if ( this . $isEmpty ) { this . moveCursorTo ( this . lead . row , this . lead . column + columns ) ; return ; } ; var anchor = this . getSelectionAnchor ( ) ; var lead = this . getSelectionLead ( ) ; var isBackwards = this . isBackwards ( ) ; if ( ! isBackwards || anchor . column !== 0 )
this . setSelectionAnchor ( anchor . row , anchor . column + columns ) ; if ( isBackwards || lead . column !== 0 ) { this . $moveSelection ( function ( ) { this . moveCursorTo ( lead . row , lead . column + columns ) ; } ) ; } } ; this . isBackwards = function ( ) { var anchor = this . anchor ; var lead = this . lead ; return ( anchor . row > lead . row || ( anchor . row == lead . row && anchor . column > lead . column ) ) ; } ; this . getRange = function ( ) { var anchor = this . anchor ; var lead = this . lead ; if ( this . isEmpty ( ) )
return Range . fromPoints ( lead , lead ) ; if ( this . isBackwards ( ) ) { return Range . fromPoints ( lead , anchor ) ; }
else { return Range . fromPoints ( anchor , lead ) ; } } ; this . clearSelection = function ( ) { if ( ! this . $isEmpty ) { this . $isEmpty = true ; this . _emit ( "changeSelection" ) ; } } ; this . selectAll = function ( ) { var lastRow = this . doc . getLength ( ) - 1 ; this . setSelectionAnchor ( 0 , 0 ) ; this . moveCursorTo ( lastRow , this . doc . getLine ( lastRow ) . length ) ; } ; this . setRange = this . setSelectionRange = function ( range , reverse ) { if ( reverse ) { this . setSelectionAnchor ( range . end . row , range . end . column ) ; this . selectTo ( range . start . row , range . start . column ) ; } else { this . setSelectionAnchor ( range . start . row , range . start . column ) ; this . selectTo ( range . end . row , range . end . column ) ; }
if ( this . getRange ( ) . isEmpty ( ) )
this . $isEmpty = true ; this . $desiredColumn = null ; } ; this . $moveSelection = function ( mover ) { var lead = this . lead ; if ( this . $isEmpty )
this . setSelectionAnchor ( lead . row , lead . column ) ; mover . call ( this ) ; } ; this . selectTo = function ( row , column ) { this . $moveSelection ( function ( ) { this . moveCursorTo ( row , column ) ; } ) ; } ; this . selectToPosition = function ( pos ) { this . $moveSelection ( function ( ) { this . moveCursorToPosition ( pos ) ; } ) ; } ; this . selectUp = function ( ) { this . $moveSelection ( this . moveCursorUp ) ; } ; this . selectDown = function ( ) { this . $moveSelection ( this . moveCursorDown ) ; } ; this . selectRight = function ( ) { this . $moveSelection ( this . moveCursorRight ) ; } ; this . selectLeft = function ( ) { this . $moveSelection ( this . moveCursorLeft ) ; } ; this . selectLineStart = function ( ) { this . $moveSelection ( this . moveCursorLineStart ) ; } ; this . selectLineEnd = function ( ) { this . $moveSelection ( this . moveCursorLineEnd ) ; } ; this . selectFileEnd = function ( ) { this . $moveSelection ( this . moveCursorFileEnd ) ; } ; this . selectFileStart = function ( ) { this . $moveSelection ( this . moveCursorFileStart ) ; } ; this . selectWordRight = function ( ) { this . $moveSelection ( this . moveCursorWordRight ) ; } ; this . selectWordLeft = function ( ) { this . $moveSelection ( this . moveCursorWordLeft ) ; } ; this . getWordRange = function ( row , column ) { if ( typeof column == "undefined" ) { var cursor = row || this . lead ; row = cursor . row ; column = cursor . column ; }
return this . session . getWordRange ( row , column ) ; } ; this . selectWord = function ( ) { this . setSelectionRange ( this . getWordRange ( ) ) ; } ; this . selectAWord = function ( ) { var cursor = this . getCursor ( ) ; var range = this . session . getAWordRange ( cursor . row , cursor . column ) ; this . setSelectionRange ( range ) ; } ; this . getLineRange = function ( row , excludeLastChar ) { var rowStart = typeof row == "number" ? row : this . lead . row ; var rowEnd ; var foldLine = this . session . getFoldLine ( rowStart ) ; if ( foldLine ) { rowStart = foldLine . start . row ; rowEnd = foldLine . end . row ; } else { rowEnd = rowStart ; }
if ( excludeLastChar === true )
return new Range ( rowStart , 0 , rowEnd , this . session . getLine ( rowEnd ) . length ) ; else
return new Range ( rowStart , 0 , rowEnd + 1 , 0 ) ; } ; this . selectLine = function ( ) { this . setSelectionRange ( this . getLineRange ( ) ) ; } ; this . moveCursorUp = function ( ) { this . moveCursorBy ( - 1 , 0 ) ; } ; this . moveCursorDown = function ( ) { this . moveCursorBy ( 1 , 0 ) ; } ; this . moveCursorLeft = function ( ) { var cursor = this . lead . getPosition ( ) , fold ; if ( fold = this . session . getFoldAt ( cursor . row , cursor . column , - 1 ) ) { this . moveCursorTo ( fold . start . row , fold . start . column ) ; } else if ( cursor . column == 0 ) { if ( cursor . row > 0 ) { this . moveCursorTo ( cursor . row - 1 , this . doc . getLine ( cursor . row - 1 ) . length ) ; } }
else { var tabSize = this . session . getTabSize ( ) ; if ( this . session . isTabStop ( cursor ) && this . doc . getLine ( cursor . row ) . slice ( cursor . column - tabSize , cursor . column ) . split ( " " ) . length - 1 == tabSize )
this . moveCursorBy ( 0 , - tabSize ) ; else
this . moveCursorBy ( 0 , - 1 ) ; } } ; this . moveCursorRight = function ( ) { var cursor = this . lead . getPosition ( ) , fold ; if ( fold = this . session . getFoldAt ( cursor . row , cursor . column , 1 ) ) { this . moveCursorTo ( fold . end . row , fold . end . column ) ; }
else if ( this . lead . column == this . doc . getLine ( this . lead . row ) . length ) { if ( this . lead . row < this . doc . getLength ( ) - 1 ) { this . moveCursorTo ( this . lead . row + 1 , 0 ) ; } }
else { var tabSize = this . session . getTabSize ( ) ; var cursor = this . lead ; if ( this . session . isTabStop ( cursor ) && this . doc . getLine ( cursor . row ) . slice ( cursor . column , cursor . column + tabSize ) . split ( " " ) . length - 1 == tabSize )
this . moveCursorBy ( 0 , tabSize ) ; else
this . moveCursorBy ( 0 , 1 ) ; } } ; this . moveCursorLineStart = function ( ) { var row = this . lead . row ; var column = this . lead . column ; var screenRow = this . session . documentToScreenRow ( row , column ) ; var firstColumnPosition = this . session . screenToDocumentPosition ( screenRow , 0 ) ; var beforeCursor = this . session . getDisplayLine ( row , null , firstColumnPosition . row , firstColumnPosition . column ) ; var leadingSpace = beforeCursor . match ( /^\s*/ ) ; if ( leadingSpace [ 0 ] . length != column && ! this . session . $useEmacsStyleLineStart )
firstColumnPosition . column += leadingSpace [ 0 ] . length ; this . moveCursorToPosition ( firstColumnPosition ) ; } ; this . moveCursorLineEnd = function ( ) { var lead = this . lead ; var lineEnd = this . session . getDocumentLastRowColumnPosition ( lead . row , lead . column ) ; if ( this . lead . column == lineEnd . column ) { var line = this . session . getLine ( lineEnd . row ) ; if ( lineEnd . column == line . length ) { var textEnd = line . search ( /\s+$/ ) ; if ( textEnd > 0 )
lineEnd . column = textEnd ; } }
this . moveCursorTo ( lineEnd . row , lineEnd . column ) ; } ; this . moveCursorFileEnd = function ( ) { var row = this . doc . getLength ( ) - 1 ; var column = this . doc . getLine ( row ) . length ; this . moveCursorTo ( row , column ) ; } ; this . moveCursorFileStart = function ( ) { this . moveCursorTo ( 0 , 0 ) ; } ; this . moveCursorLongWordRight = function ( ) { var row = this . lead . row ; var column = this . lead . column ; var line = this . doc . getLine ( row ) ; var rightOfCursor = line . substring ( column ) ; var match ; this . session . nonTokenRe . lastIndex = 0 ; this . session . tokenRe . lastIndex = 0 ; var fold = this . session . getFoldAt ( row , column , 1 ) ; if ( fold ) { this . moveCursorTo ( fold . end . row , fold . end . column ) ; return ; }
if ( match = this . session . nonTokenRe . exec ( rightOfCursor ) ) { column += this . session . nonTokenRe . lastIndex ; this . session . nonTokenRe . lastIndex = 0 ; rightOfCursor = line . substring ( column ) ; }
if ( column >= line . length ) { this . moveCursorTo ( row , line . length ) ; this . moveCursorRight ( ) ; if ( row < this . doc . getLength ( ) - 1 )
this . moveCursorWordRight ( ) ; return ; }
if ( match = this . session . tokenRe . exec ( rightOfCursor ) ) { column += this . session . tokenRe . lastIndex ; this . session . tokenRe . lastIndex = 0 ; }
this . moveCursorTo ( row , column ) ; } ; this . moveCursorLongWordLeft = function ( ) { var row = this . lead . row ; var column = this . lead . column ; var fold ; if ( fold = this . session . getFoldAt ( row , column , - 1 ) ) { this . moveCursorTo ( fold . start . row , fold . start . column ) ; return ; }
var str = this . session . getFoldStringAt ( row , column , - 1 ) ; if ( str == null ) { str = this . doc . getLine ( row ) . substring ( 0 , column ) }
var leftOfCursor = lang . stringReverse ( str ) ; var match ; this . session . nonTokenRe . lastIndex = 0 ; this . session . tokenRe . lastIndex = 0 ; if ( match = this . session . nonTokenRe . exec ( leftOfCursor ) ) { column -= this . session . nonTokenRe . lastIndex ; leftOfCursor = leftOfCursor . slice ( this . session . nonTokenRe . lastIndex ) ; this . session . nonTokenRe . lastIndex = 0 ; }
if ( column <= 0 ) { this . moveCursorTo ( row , 0 ) ; this . moveCursorLeft ( ) ; if ( row > 0 )
this . moveCursorWordLeft ( ) ; return ; }
if ( match = this . session . tokenRe . exec ( leftOfCursor ) ) { column -= this . session . tokenRe . lastIndex ; this . session . tokenRe . lastIndex = 0 ; }
this . moveCursorTo ( row , column ) ; } ; this . $shortWordEndIndex = function ( rightOfCursor ) { var match , index = 0 , ch ; var whitespaceRe = /\s/ ; var tokenRe = this . session . tokenRe ; tokenRe . lastIndex = 0 ; if ( match = this . session . tokenRe . exec ( rightOfCursor ) ) { index = this . session . tokenRe . lastIndex ; } else { while ( ( ch = rightOfCursor [ index ] ) && whitespaceRe . test ( ch ) )
index ++ ; if ( index < 1 ) { tokenRe . lastIndex = 0 ; while ( ( ch = rightOfCursor [ index ] ) && ! tokenRe . test ( ch ) ) { tokenRe . lastIndex = 0 ; index ++ ; if ( whitespaceRe . test ( ch ) ) { if ( index > 2 ) { index --
break ; } else { while ( ( ch = rightOfCursor [ index ] ) && whitespaceRe . test ( ch ) )
index ++ ; if ( index > 2 )
break } } } } }
tokenRe . lastIndex = 0 ; return index ; } ; this . moveCursorShortWordRight = function ( ) { var row = this . lead . row ; var column = this . lead . column ; var line = this . doc . getLine ( row ) ; var rightOfCursor = line . substring ( column ) ; var fold = this . session . getFoldAt ( row , column , 1 ) ; if ( fold )
return this . moveCursorTo ( fold . end . row , fold . end . column ) ; if ( column == line . length ) { var l = this . doc . getLength ( ) ; do { row ++ ; rightOfCursor = this . doc . getLine ( row ) } while ( row < l && /^\s*$/ . test ( rightOfCursor ) )
if ( ! /^\s+/ . test ( rightOfCursor ) )
rightOfCursor = ""
column = 0 ; }
var index = this . $shortWordEndIndex ( rightOfCursor ) ; this . moveCursorTo ( row , column + index ) ; } ; this . moveCursorShortWordLeft = function ( ) { var row = this . lead . row ; var column = this . lead . column ; var fold ; if ( fold = this . session . getFoldAt ( row , column , - 1 ) )
return this . moveCursorTo ( fold . start . row , fold . start . column ) ; var line = this . session . getLine ( row ) . substring ( 0 , column ) ; if ( column == 0 ) { do { row -- ; line = this . doc . getLine ( row ) ; } while ( row > 0 && /^\s*$/ . test ( line ) )
column = line . length ; if ( ! /\s+$/ . test ( line ) )
line = "" }
var leftOfCursor = lang . stringReverse ( line ) ; var index = this . $shortWordEndIndex ( leftOfCursor ) ; return this . moveCursorTo ( row , column - index ) ; } ; this . moveCursorWordRight = function ( ) { if ( this . session . $selectLongWords )
this . moveCursorLongWordRight ( ) ; else
this . moveCursorShortWordRight ( ) ; } ; this . moveCursorWordLeft = function ( ) { if ( this . session . $selectLongWords )
this . moveCursorLongWordLeft ( ) ; else
this . moveCursorShortWordLeft ( ) ; } ; this . moveCursorBy = function ( rows , chars ) { var screenPos = this . session . documentToScreenPosition ( this . lead . row , this . lead . column ) ; if ( chars === 0 ) { if ( this . $desiredColumn )
screenPos . column = this . $desiredColumn ; else
this . $desiredColumn = screenPos . column ; }
var docPos = this . session . screenToDocumentPosition ( screenPos . row + rows , screenPos . column ) ; this . moveCursorTo ( docPos . row , docPos . column + chars , chars === 0 ) ; } ; this . moveCursorToPosition = function ( position ) { this . moveCursorTo ( position . row , position . column ) ; } ; this . moveCursorTo = function ( row , column , keepDesiredColumn ) { var fold = this . session . getFoldAt ( row , column , 1 ) ; if ( fold ) { row = fold . start . row ; column = fold . start . column ; }
this . $keepDesiredColumnOnChange = true ; this . lead . setPosition ( row , column ) ; this . $keepDesiredColumnOnChange = false ; if ( ! keepDesiredColumn )
this . $desiredColumn = null ; } ; this . moveCursorToScreen = function ( row , column , keepDesiredColumn ) { var pos = this . session . screenToDocumentPosition ( row , column ) ; this . moveCursorTo ( pos . row , pos . column , keepDesiredColumn ) ; } ; this . detach = function ( ) { this . lead . detach ( ) ; this . anchor . detach ( ) ; this . session = this . doc = null ; }
this . fromOrientedRange = function ( range ) { this . setSelectionRange ( range , range . cursor == range . start ) ; this . $desiredColumn = range . desiredColumn || this . $desiredColumn ; }
this . toOrientedRange = function ( range ) { var r = this . getRange ( ) ; if ( range ) { range . start . column = r . start . column ; range . start . row = r . start . row ; range . end . column = r . end . column ; range . end . row = r . end . row ; } else { range = r ; }
range . cursor = this . isBackwards ( ) ? range . start : range . end ; range . desiredColumn = this . $desiredColumn ; return range ; }
this . toJSON = function ( ) { if ( this . rangeCount ) { var data = this . ranges . map ( function ( r ) { var r1 = r . clone ( ) ; r1 . isBackwards = r . cursor == r . start ; return r1 ; } ) ; } else { var data = this . getRange ( ) ; data . isBackwards = this . isBackwards ( ) ; }
return data ; } ; this . fromJSON = function ( data ) { if ( data . start == undefined ) { if ( this . rangeList ) { this . toSingleRange ( data [ 0 ] ) ; for ( var i = data . length ; i -- ; ) { var r = Range . fromPoints ( data [ i ] . start , data [ i ] . end ) ; if ( data . isBackwards )
r . cursor = r . start ; this . addRange ( r , true ) ; }
return ; } else
data = data [ 0 ] ; }
if ( this . rangeList )
this . toSingleRange ( data ) ; this . setSelectionRange ( data , data . isBackwards ) ; } ; this . isEqual = function ( data ) { if ( ( data . length || this . rangeCount ) && data . length != this . rangeCount )
return false ; if ( ! data . length || ! this . ranges )
return this . getRange ( ) . isEqual ( data ) ; for ( var i = this . ranges . length ; i -- ; ) { if ( ! this . ranges [ i ] . isEqual ( data [ i ] ) )
return false }
return true ; } } ) . call ( Selection . prototype ) ; exports . Selection = Selection ; } ) ; define ( 'ace/range' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { var comparePoints = function ( p1 , p2 ) { return p1 . row - p2 . row || p1 . column - p2 . column ; } ; var Range = function ( startRow , startColumn , endRow , endColumn ) { this . start = { row : startRow , column : startColumn } ; this . end = { row : endRow , column : endColumn } ; } ; ( function ( ) { this . isEqual = function ( range ) { return this . start . row === range . start . row && this . end . row === range . end . row && this . start . column === range . start . column && this . end . column === range . end . column ; } ; this . toString = function ( ) { return ( "Range: [" + this . start . row + "/" + this . start . column + "] -> [" + this . end . row + "/" + this . end . column + "]" ) ; } ; this . contains = function ( row , column ) { return this . compare ( row , column ) == 0 ; } ; this . compareRange = function ( range ) { var cmp , end = range . end , start = range . start ; cmp = this . compare ( end . row , end . column ) ; if ( cmp == 1 ) { cmp = this . compare ( start . row , start . column ) ; if ( cmp == 1 ) { return 2 ; } else if ( cmp == 0 ) { return 1 ; } else { return 0 ; } } else if ( cmp == - 1 ) { return - 2 ; } else { cmp = this . compare ( start . row , start . column ) ; if ( cmp == - 1 ) { return - 1 ; } else if ( cmp == 1 ) { return 42 ; } else { return 0 ; } } } ; this . comparePoint = function ( p ) { return this . compare ( p . row , p . column ) ; } ; this . containsRange = function ( range ) { return this . comparePoint ( range . start ) == 0 && this . comparePoint ( range . end ) == 0 ; } ; this . intersects = function ( range ) { var cmp = this . compareRange ( range ) ; return ( cmp == - 1 || cmp == 0 || cmp == 1 ) ; } ; this . isEnd = function ( row , column ) { return this . end . row == row && this . end . column == column ; } ; this . isStart = function ( row , column ) { return this . start . row == row && this . start . column == column ; } ; this . setStart = function ( row , column ) { if ( typeof row == "object" ) { this . start . column = row . column ; this . start . row = row . row ; } else { this . start . row = row ; this . start . column = column ; } } ; this . setEnd = function ( row , column ) { if ( typeof row == "object" ) { this . end . column = row . column ; this . end . row = row . row ; } else { this . end . row = row ; this . end . column = column ; } } ; this . inside = function ( row , column ) { if ( this . compare ( row , column ) == 0 ) { if ( this . isEnd ( row , column ) || this . isStart ( row , column ) ) { return false ; } else { return true ; } }
return false ; } ; this . insideStart = function ( row , column ) { if ( this . compare ( row , column ) == 0 ) { if ( this . isEnd ( row , column ) ) { return false ; } else { return true ; } }
return false ; } ; this . insideEnd = function ( row , column ) { if ( this . compare ( row , column ) == 0 ) { if ( this . isStart ( row , column ) ) { return false ; } else { return true ; } }
return false ; } ; this . compare = function ( row , column ) { if ( ! this . isMultiLine ( ) ) { if ( row === this . start . row ) { return column < this . start . column ? - 1 : ( column > this . end . column ? 1 : 0 ) ; } ; }
if ( row < this . start . row )
return - 1 ; if ( row > this . end . row )
return 1 ; if ( this . start . row === row )
return column >= this . start . column ? 0 : - 1 ; if ( this . end . row === row )
return column <= this . end . column ? 0 : 1 ; return 0 ; } ; this . compareStart = function ( row , column ) { if ( this . start . row == row && this . start . column == column ) { return - 1 ; } else { return this . compare ( row , column ) ; } } ; this . compareEnd = function ( row , column ) { if ( this . end . row == row && this . end . column == column ) { return 1 ; } else { return this . compare ( row , column ) ; } } ; this . compareInside = function ( row , column ) { if ( this . end . row == row && this . end . column == column ) { return 1 ; } else if ( this . start . row == row && this . start . column == column ) { return - 1 ; } else { return this . compare ( row , column ) ; } } ; this . clipRows = function ( firstRow , lastRow ) { if ( this . end . row > lastRow )
var end = { row : lastRow + 1 , column : 0 } ; else if ( this . end . row < firstRow )
var end = { row : firstRow , column : 0 } ; if ( this . start . row > lastRow )
var start = { row : lastRow + 1 , column : 0 } ; else if ( this . start . row < firstRow )
var start = { row : firstRow , column : 0 } ; return Range . fromPoints ( start || this . start , end || this . end ) ; } ; this . extend = function ( row , column ) { var cmp = this . compare ( row , column ) ; if ( cmp == 0 )
return this ; else if ( cmp == - 1 )
var start = { row : row , column : column } ; else
var end = { row : row , column : column } ; return Range . fromPoints ( start || this . start , end || this . end ) ; } ; this . isEmpty = function ( ) { return ( this . start . row === this . end . row && this . start . column === this . end . column ) ; } ; this . isMultiLine = function ( ) { return ( this . start . row !== this . end . row ) ; } ; this . clone = function ( ) { return Range . fromPoints ( this . start , this . end ) ; } ; this . collapseRows = function ( ) { if ( this . end . column == 0 )
return new Range ( this . start . row , 0 , Math . max ( this . start . row , this . end . row - 1 ) , 0 )
else
return new Range ( this . start . row , 0 , this . end . row , 0 ) } ; this . toScreenRange = function ( session ) { var screenPosStart = session . documentToScreenPosition ( this . start ) ; var screenPosEnd = session . documentToScreenPosition ( this . end ) ; return new Range ( screenPosStart . row , screenPosStart . column , screenPosEnd . row , screenPosEnd . column ) ; } ; this . moveBy = function ( row , column ) { this . start . row += row ; this . start . column += column ; this . end . row += row ; this . end . column += column ; } ; } ) . call ( Range . prototype ) ; Range . fromPoints = function ( start , end ) { return new Range ( start . row , start . column , end . row , end . column ) ; } ; Range . comparePoints = comparePoints ; Range . comparePoints = function ( p1 , p2 ) { return p1 . row - p2 . row || p1 . column - p2 . column ; } ; exports . Range = Range ; } ) ; define ( 'ace/mode/text' , [ 'require' , 'exports' , 'module' , 'ace/tokenizer' , 'ace/mode/text_highlight_rules' , 'ace/mode/behaviour' , 'ace/unicode' , 'ace/lib/lang' , 'ace/token_iterator' , 'ace/range' ] , function ( require , exports , module ) { var Tokenizer = require ( "../tokenizer" ) . Tokenizer ; var TextHighlightRules = require ( "./text_highlight_rules" ) . TextHighlightRules ; var Behaviour = require ( "./behaviour" ) . Behaviour ; var unicode = require ( "../unicode" ) ; var lang = require ( "../lib/lang" ) ; var TokenIterator = require ( "../token_iterator" ) . TokenIterator ; var Range = require ( "../range" ) . Range ; var Mode = function ( ) { this . HighlightRules = TextHighlightRules ; this . $behaviour = new Behaviour ( ) ; } ; ( function ( ) { this . tokenRe = new RegExp ( "^[" + unicode . packages . L + unicode . packages . Mn + unicode . packages . Mc + unicode . packages . Nd + unicode . packages . Pc + "\\$_]+" , "g" ) ; this . nonTokenRe = new RegExp ( "^(?:[^" + unicode . packages . L + unicode . packages . Mn + unicode . packages . Mc + unicode . packages . Nd + unicode . packages . Pc + "\\$_]|\s])+" , "g" ) ; this . getTokenizer = function ( ) { if ( ! this . $tokenizer ) { this . $highlightRules = new this . HighlightRules ( ) ; this . $tokenizer = new Tokenizer ( this . $highlightRules . getRules ( ) ) ; }
return this . $tokenizer ; } ; this . lineCommentStart = "" ; this . blockComment = "" ; this . toggleCommentLines = function ( state , session , startRow , endRow ) { var doc = session . doc ; var ignoreBlankLines = true ; var shouldRemove = true ; var minIndent = Infinity ; var tabSize = session . getTabSize ( ) ; var insertAtTabStop = false ; if ( ! this . lineCommentStart ) { if ( ! this . blockComment )
return false ; var lineCommentStart = this . blockComment . start ; var lineCommentEnd = this . blockComment . end ; var regexpStart = new RegExp ( "^(\\s*)(?:" + lang . escapeRegExp ( lineCommentStart ) + ")" ) ; var regexpEnd = new RegExp ( "(?:" + lang . escapeRegExp ( lineCommentEnd ) + ")\\s*$" ) ; var comment = function ( line , i ) { if ( testRemove ( line , i ) )
return ; if ( ! ignoreBlankLines || /\S/ . test ( line ) ) { doc . insertInLine ( { row : i , column : line . length } , lineCommentEnd ) ; doc . insertInLine ( { row : i , column : minIndent } , lineCommentStart ) ; } } ; var uncomment = function ( line , i ) { var m ; if ( m = line . match ( regexpEnd ) )
doc . removeInLine ( i , line . length - m [ 0 ] . length , line . length ) ; if ( m = line . match ( regexpStart ) )
doc . removeInLine ( i , m [ 1 ] . length , m [ 0 ] . length ) ; } ; var testRemove = function ( line , row ) { if ( regexpStart . test ( line ) )
return true ; var tokens = session . getTokens ( row ) ; for ( var i = 0 ; i < tokens . length ; i ++ ) { if ( tokens [ i ] . type === 'comment' )
return true ; } } ; } else { if ( Array . isArray ( this . lineCommentStart ) ) { var regexpStart = this . lineCommentStart . map ( lang . escapeRegExp ) . join ( "|" ) ; var lineCommentStart = this . lineCommentStart [ 0 ] ; } else { var regexpStart = lang . escapeRegExp ( this . lineCommentStart ) ; var lineCommentStart = this . lineCommentStart ; }
regexpStart = new RegExp ( "^(\\s*)(?:" + regexpStart + ") ?" ) ; insertAtTabStop = session . getUseSoftTabs ( ) ; var uncomment = function ( line , i ) { var m = line . match ( regexpStart ) ; if ( ! m ) return ; var start = m [ 1 ] . length , end = m [ 0 ] . length ; if ( ! shouldInsertSpace ( line , start , end ) && m [ 0 ] [ end - 1 ] == " " )
end -- ; doc . removeInLine ( i , start , end ) ; } ; var commentWithSpace = lineCommentStart + " " ; var comment = function ( line , i ) { if ( ! ignoreBlankLines || /\S/ . test ( line ) ) { if ( shouldInsertSpace ( line , minIndent , minIndent ) )
doc . insertInLine ( { row : i , column : minIndent } , commentWithSpace ) ; else
doc . insertInLine ( { row : i , column : minIndent } , lineCommentStart ) ; } } ; var testRemove = function ( line , i ) { return regexpStart . test ( line ) ; } ; var shouldInsertSpace = function ( line , before , after ) { var spaces = 0 ; while ( before -- && line . charAt ( before ) == " " )
spaces ++ ; if ( spaces % tabSize != 0 )
return false ; var spaces = 0 ; while ( line . charAt ( after ++ ) == " " )
spaces ++ ; if ( tabSize > 2 )
return spaces % tabSize != tabSize - 1 ; else
return spaces % tabSize == 0 ; return true ; } ; }
function iter ( fun ) { for ( var i = startRow ; i <= endRow ; i ++ )
fun ( doc . getLine ( i ) , i ) ; }
var minEmptyLength = Infinity ; iter ( function ( line , i ) { var indent = line . search ( /\S/ ) ; if ( indent !== - 1 ) { if ( indent < minIndent )
minIndent = indent ; if ( shouldRemove && ! testRemove ( line , i ) )
shouldRemove = false ; } else if ( minEmptyLength > line . length ) { minEmptyLength = line . length ; } } ) ; if ( minIndent == Infinity ) { minIndent = minEmptyLength ; ignoreBlankLines = false ; shouldRemove = false ; }
if ( insertAtTabStop && minIndent % tabSize != 0 )
minIndent = Math . floor ( minIndent / tabSize ) * tabSize ; iter ( shouldRemove ? uncomment : comment ) ; } ; this . toggleBlockComment = function ( state , session , range , cursor ) { var comment = this . blockComment ; if ( ! comment )
return ; if ( ! comment . start && comment [ 0 ] )
comment = comment [ 0 ] ; var iterator = new TokenIterator ( session , cursor . row , cursor . column ) ; var token = iterator . getCurrentToken ( ) ; var sel = session . selection ; var initialRange = session . selection . toOrientedRange ( ) ; var startRow , colDiff ; if ( token && /comment/ . test ( token . type ) ) { var startRange , endRange ; while ( token && /comment/ . test ( token . type ) ) { var i = token . value . indexOf ( comment . start ) ; if ( i != - 1 ) { var row = iterator . getCurrentTokenRow ( ) ; var column = iterator . getCurrentTokenColumn ( ) + i ; startRange = new Range ( row , column , row , column + comment . start . length ) ; break }
token = iterator . stepBackward ( ) ; } ; var iterator = new TokenIterator ( session , cursor . row , cursor . column ) ; var token = iterator . getCurrentToken ( ) ; while ( token && /comment/ . test ( token . type ) ) { var i = token . value . indexOf ( comment . end ) ; if ( i != - 1 ) { var row = iterator . getCurrentTokenRow ( ) ; var column = iterator . getCurrentTokenColumn ( ) + i ; endRange = new Range ( row , column , row , column + comment . end . length ) ; break ; }
token = iterator . stepForward ( ) ; }
if ( endRange )
session . remove ( endRange ) ; if ( startRange ) { session . remove ( startRange ) ; startRow = startRange . start . row ; colDiff = - comment . start . length } } else { colDiff = comment . start . length
startRow = range . start . row ; session . insert ( range . end , comment . end ) ; session . insert ( range . start , comment . start ) ; }
if ( initialRange . start . row == startRow )
initialRange . start . column += colDiff ; if ( initialRange . end . row == startRow )
initialRange . end . column += colDiff ; session . selection . fromOrientedRange ( initialRange ) ; } ; this . getNextLineIndent = function ( state , line , tab ) { return this . $getIndent ( line ) ; } ; this . checkOutdent = function ( state , line , input ) { return false ; } ; this . autoOutdent = function ( state , doc , row ) { } ; this . $getIndent = function ( line ) { return line . match ( /^\s*/ ) [ 0 ] ; } ; this . createWorker = function ( session ) { return null ; } ; this . createModeDelegates = function ( mapping ) { this . $embeds = [ ] ; this . $modes = { } ; for ( var i in mapping ) { if ( mapping [ i ] ) { this . $embeds . push ( i ) ; this . $modes [ i ] = new mapping [ i ] ( ) ; } }
var delegations = [ 'toggleCommentLines' , 'getNextLineIndent' , 'checkOutdent' , 'autoOutdent' , 'transformAction' , 'getCompletions' ] ; for ( var i = 0 ; i < delegations . length ; i ++ ) { ( function ( scope ) { var functionName = delegations [ i ] ; var defaultHandler = scope [ functionName ] ; scope [ delegations [ i ] ] = function ( ) { return this . $delegator ( functionName , arguments , defaultHandler ) ; } } ( this ) ) ; } } ; this . $delegator = function ( method , args , defaultHandler ) { var state = args [ 0 ] ; if ( typeof state != "string" )
state = state [ 0 ] ; for ( var i = 0 ; i < this . $embeds . length ; i ++ ) { if ( ! this . $modes [ this . $embeds [ i ] ] ) continue ; var split = state . split ( this . $embeds [ i ] ) ; if ( ! split [ 0 ] && split [ 1 ] ) { args [ 0 ] = split [ 1 ] ; var mode = this . $modes [ this . $embeds [ i ] ] ; return mode [ method ] . apply ( mode , args ) ; } }
var ret = defaultHandler . apply ( this , args ) ; return defaultHandler ? ret : undefined ; } ; this . transformAction = function ( state , action , editor , session , param ) { if ( this . $behaviour ) { var behaviours = this . $behaviour . getBehaviours ( ) ; for ( var key in behaviours ) { if ( behaviours [ key ] [ action ] ) { var ret = behaviours [ key ] [ action ] . apply ( this , arguments ) ; if ( ret ) { return ret ; } } } } } ; this . getKeywords = function ( append ) { if ( ! this . completionKeywords ) { var rules = this . $tokenizer . rules ; var completionKeywords = [ ] ; for ( var rule in rules ) { var ruleItr = rules [ rule ] ; for ( var r = 0 , l = ruleItr . length ; r < l ; r ++ ) { if ( typeof ruleItr [ r ] . token === "string" ) { if ( /keyword|support|storage/ . test ( ruleItr [ r ] . token ) )
completionKeywords . push ( ruleItr [ r ] . regex ) ; }
else if ( typeof ruleItr [ r ] . token === "object" ) { for ( var a = 0 , aLength = ruleItr [ r ] . token . length ; a < aLength ; a ++ ) { if ( /keyword|support|storage/ . test ( ruleItr [ r ] . token [ a ] ) ) { var rule = ruleItr [ r ] . regex . match ( /\(.+?\)/g ) [ a ] ; completionKeywords . push ( rule . substr ( 1 , rule . length - 2 ) ) ; } } } } }
this . completionKeywords = completionKeywords ; }
if ( ! append )
return this . $keywordList ; return completionKeywords . concat ( this . $keywordList || [ ] ) ; } ; this . $createKeywordList = function ( ) { if ( ! this . $highlightRules )
this . getTokenizer ( ) ; return this . $keywordList = this . $highlightRules . $keywordList || [ ] ; }
this . getCompletions = function ( state , session , pos , prefix ) { var keywords = this . $keywordList || this . $createKeywordList ( ) ; return keywords . map ( function ( word ) { return { name : word , value : word , score : 0 , meta : "keyword" } ; } ) ; } ; } ) . call ( Mode . prototype ) ; exports . Mode = Mode ; } ) ; define ( 'ace/tokenizer' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { var MAX _TOKEN _COUNT = 1000 ; var Tokenizer = function ( rules ) { this . states = rules ; this . regExps = { } ; this . matchMappings = { } ; for ( var key in this . states ) { var state = this . states [ key ] ; var ruleRegExps = [ ] ; var matchTotal = 0 ; var mapping = this . matchMappings [ key ] = { defaultToken : "text" } ; var flag = "g" ; var splitterRurles = [ ] ; for ( var i = 0 ; i < state . length ; i ++ ) { var rule = state [ i ] ; if ( rule . defaultToken )
mapping . defaultToken = rule . defaultToken ; if ( rule . caseInsensitive )
flag = "gi" ; if ( rule . regex == null )
continue ; if ( rule . regex instanceof RegExp )
rule . regex = rule . regex . toString ( ) . slice ( 1 , - 1 ) ; var adjustedregex = rule . regex ; var matchcount = new RegExp ( "(?:(" + adjustedregex + ")|(.))" ) . exec ( "a" ) . length - 2 ; if ( Array . isArray ( rule . token ) ) { if ( rule . token . length == 1 || matchcount == 1 ) { rule . token = rule . token [ 0 ] ; } else if ( matchcount - 1 != rule . token . length ) { throw new Error ( "number of classes and regexp groups in '" + rule . token + "'\n'" + rule . regex + "' doesn't match\n" + ( matchcount - 1 ) + "!=" + rule . token . length ) ; } else { rule . tokenArray = rule . token ; rule . token = null ; rule . onMatch = this . $arrayTokens ; } } else if ( typeof rule . token == "function" && ! rule . onMatch ) { if ( matchcount > 1 )
rule . onMatch = this . $applyToken ; else
rule . onMatch = rule . token ; }
if ( matchcount > 1 ) { if ( /\\\d/ . test ( rule . regex ) ) { adjustedregex = rule . regex . replace ( /\\([0-9]+)/g , function ( match , digit ) { return "\\" + ( parseInt ( digit , 10 ) + matchTotal + 1 ) ; } ) ; } else { matchcount = 1 ; adjustedregex = this . removeCapturingGroups ( rule . regex ) ; }
if ( ! rule . splitRegex && typeof rule . token != "string" )
splitterRurles . push ( rule ) ; }
mapping [ matchTotal ] = i ; matchTotal += matchcount ; ruleRegExps . push ( adjustedregex ) ; if ( ! rule . onMatch )
rule . onMatch = null ; rule . _ _proto _ _ = null ; }
splitterRurles . forEach ( function ( rule ) { rule . splitRegex = this . createSplitterRegexp ( rule . regex , flag ) ; } , this ) ; this . regExps [ key ] = new RegExp ( "(" + ruleRegExps . join ( ")|(" ) + ")|($)" , flag ) ; } } ; ( function ( ) { this . $setMaxTokenCount = function ( m ) { MAX _TOKEN _COUNT = m | 0 ; } ; this . $applyToken = function ( str ) { var values = this . splitRegex . exec ( str ) . slice ( 1 ) ; var types = this . token . apply ( this , values ) ; if ( typeof types === "string" )
return [ { type : types , value : str } ] ; var tokens = [ ] ; for ( var i = 0 , l = types . length ; i < l ; i ++ ) { if ( values [ i ] )
tokens [ tokens . length ] = { type : types [ i ] , value : values [ i ] } ; }
return tokens ; } , this . $arrayTokens = function ( str ) { if ( ! str )
return [ ] ; var values = this . splitRegex . exec ( str ) ; if ( ! values )
return "text" ; var tokens = [ ] ; var types = this . tokenArray ; for ( var i = 0 , l = types . length ; i < l ; i ++ ) { if ( values [ i + 1 ] )
tokens [ tokens . length ] = { type : types [ i ] , value : values [ i + 1 ] } ; }
return tokens ; } ; this . removeCapturingGroups = function ( src ) { var r = src . replace ( /\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g , function ( x , y ) { return y ? "(?:" : x ; } ) ; return r ; } ; this . createSplitterRegexp = function ( src , flag ) { if ( src . indexOf ( "(?=" ) != - 1 ) { var stack = 0 ; var inChClass = false ; var lastCapture = { } ; src . replace ( /(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g , function ( m , esc , parenOpen , parenClose , square , index ) { if ( inChClass ) { inChClass = square != "]" ; } else if ( square ) { inChClass = true ; } else if ( parenClose ) { if ( stack == lastCapture . stack ) { lastCapture . end = index + 1 ; lastCapture . stack = - 1 ; }
stack -- ; } else if ( parenOpen ) { stack ++ ; if ( parenOpen . length != 1 ) { lastCapture . stack = stack
lastCapture . start = index ; } }
return m ; } ) ; if ( lastCapture . end != null && /^\)*$/ . test ( src . substr ( lastCapture . end ) ) )
src = src . substring ( 0 , lastCapture . start ) + src . substr ( lastCapture . end ) ; }
return new RegExp ( src , ( flag || "" ) . replace ( "g" , "" ) ) ; } ; this . getLineTokens = function ( line , startState ) { if ( startState && typeof startState != "string" ) { var stack = startState . slice ( 0 ) ; startState = stack [ 0 ] ; } else
var stack = [ ] ; var currentState = startState || "start" ; var state = this . states [ currentState ] ; var mapping = this . matchMappings [ currentState ] ; var re = this . regExps [ currentState ] ; re . lastIndex = 0 ; var match , tokens = [ ] ; var lastIndex = 0 ; var token = { type : null , value : "" } ; while ( match = re . exec ( line ) ) { var type = mapping . defaultToken ; var rule = null ; var value = match [ 0 ] ; var index = re . lastIndex ; if ( index - value . length > lastIndex ) { var skipped = line . substring ( lastIndex , index - value . length ) ; if ( token . type == type ) { token . value += skipped ; } else { if ( token . type )
tokens . push ( token ) ; token = { type : type , value : skipped } ; } }
for ( var i = 0 ; i < match . length - 2 ; i ++ ) { if ( match [ i + 1 ] === undefined )
continue ; rule = state [ mapping [ i ] ] ; if ( rule . onMatch )
type = rule . onMatch ( value , currentState , stack ) ; else
type = rule . token ; if ( rule . next ) { if ( typeof rule . next == "string" )
currentState = rule . next ; else
currentState = rule . next ( currentState , stack ) ; state = this . states [ currentState ] ; if ( ! state ) { window . console && console . error && console . error ( currentState , "doesn't exist" ) ; currentState = "start" ; state = this . states [ currentState ] ; }
mapping = this . matchMappings [ currentState ] ; lastIndex = index ; re = this . regExps [ currentState ] ; re . lastIndex = index ; }
break ; }
if ( value ) { if ( typeof type == "string" ) { if ( ( ! rule || rule . merge !== false ) && token . type === type ) { token . value += value ; } else { if ( token . type )
tokens . push ( token ) ; token = { type : type , value : value } ; } } else if ( type ) { if ( token . type )
tokens . push ( token ) ; token = { type : null , value : "" } ; for ( var i = 0 ; i < type . length ; i ++ )
tokens . push ( type [ i ] ) ; } }
if ( lastIndex == line . length )
break ; lastIndex = index ; if ( tokens . length > MAX _TOKEN _COUNT ) { while ( lastIndex < line . length ) { if ( token . type )
tokens . push ( token ) ; token = { value : line . substring ( lastIndex , lastIndex += 2000 ) , type : "overflow" } }
currentState = "start" ; stack = [ ] ; break ; } }
if ( token . type )
tokens . push ( token ) ; return { tokens : tokens , state : stack . length ? stack : currentState } ; } ; } ) . call ( Tokenizer . prototype ) ; exports . Tokenizer = Tokenizer ; } ) ; define ( 'ace/mode/text_highlight_rules' , [ 'require' , 'exports' , 'module' , 'ace/lib/lang' ] , function ( require , exports , module ) { var lang = require ( "../lib/lang" ) ; var TextHighlightRules = function ( ) { this . $rules = { "start" : [ { token : "empty_line" , regex : '^$' } , { defaultToken : "text" } ] } ; } ; ( function ( ) { this . addRules = function ( rules , prefix ) { if ( ! prefix ) { for ( var key in rules )
this . $rules [ key ] = rules [ key ] ; return ; }
for ( var key in rules ) { var state = rules [ key ] ; for ( var i = 0 ; i < state . length ; i ++ ) { var rule = state [ i ] ; if ( rule . next ) { if ( typeof rule . next != "string" ) { if ( rule . nextState && rule . nextState . indexOf ( prefix ) !== 0 )
rule . nextState = prefix + rule . nextState ; } else { if ( rule . next . indexOf ( prefix ) !== 0 )
rule . next = prefix + rule . next ; } } }
this . $rules [ prefix + key ] = state ; } } ; this . getRules = function ( ) { return this . $rules ; } ; this . embedRules = function ( HighlightRules , prefix , escapeRules , states , append ) { var embedRules = new HighlightRules ( ) . getRules ( ) ; if ( states ) { for ( var i = 0 ; i < states . length ; i ++ )
states [ i ] = prefix + states [ i ] ; } else { states = [ ] ; for ( var key in embedRules )
states . push ( prefix + key ) ; }
this . addRules ( embedRules , prefix ) ; if ( escapeRules ) { var addRules = Array . prototype [ append ? "push" : "unshift" ] ; for ( var i = 0 ; i < states . length ; i ++ )
addRules . apply ( this . $rules [ states [ i ] ] , lang . deepCopy ( escapeRules ) ) ; }
if ( ! this . $embeds )
this . $embeds = [ ] ; this . $embeds . push ( prefix ) ; } ; this . getEmbeds = function ( ) { return this . $embeds ; } ; var pushState = function ( currentState , stack ) { if ( currentState != "start" )
stack . unshift ( this . nextState , currentState ) ; return this . nextState ; } ; var popState = function ( currentState , stack ) { if ( stack [ 0 ] !== currentState )
return "start" ; stack . shift ( ) ; return stack . shift ( ) ; } ; this . normalizeRules = function ( ) { var id = 0 ; var rules = this . $rules ; function processState ( key ) { var state = rules [ key ] ; state . processed = true ; for ( var i = 0 ; i < state . length ; i ++ ) { var rule = state [ i ] ; if ( ! rule . regex && rule . start ) { rule . regex = rule . start ; if ( ! rule . next )
rule . next = [ ] ; rule . next . push ( { defaultToken : rule . token } , { token : rule . token + ".end" , regex : rule . end || rule . start , next : "pop" } ) ; rule . token = rule . token + ".start" ; rule . push = true ; }
var next = rule . next || rule . push ; if ( next && Array . isArray ( next ) ) { var stateName = rule . stateName ; if ( ! stateName ) { stateName = rule . token ; if ( typeof stateName != "string" )
stateName = stateName [ 0 ] || "" ; if ( rules [ stateName ] )
stateName += id ++ ; }
rules [ stateName ] = next ; rule . next = stateName ; processState ( stateName ) ; } else if ( next == "pop" ) { rule . next = popState ; }
if ( rule . push ) { rule . nextState = rule . next || rule . push ; rule . next = pushState ; delete rule . push ; }
if ( rule . rules ) { for ( var r in rule . rules ) { if ( rules [ r ] ) { if ( rules [ r ] . push )
rules [ r ] . push . apply ( rules [ r ] , rule . rules [ r ] ) ; } else { rules [ r ] = rule . rules [ r ] ; } } }
if ( rule . include || typeof rule == "string" ) { var includeName = rule . include || rule ; var toInsert = rules [ includeName ] ; } else if ( Array . isArray ( rule ) )
toInsert = rule ; if ( toInsert ) { var args = [ i , 1 ] . concat ( toInsert ) ; if ( rule . noEscape )
args = args . filter ( function ( x ) { return ! x . next ; } ) ; state . splice . apply ( state , args ) ; i -- ; toInsert = null }
if ( rule . keywordMap ) { rule . token = this . createKeywordMapper ( rule . keywordMap , rule . defaultToken || "text" , rule . caseInsensitive ) ; delete rule . defaultToken ; } } } ; Object . keys ( rules ) . forEach ( processState , this ) ; } ; this . createKeywordMapper = function ( map , defaultToken , ignoreCase , splitChar ) { var keywords = Object . create ( null ) ; Object . keys ( map ) . forEach ( function ( className ) { var a = map [ className ] ; if ( ignoreCase )
a = a . toLowerCase ( ) ; var list = a . split ( splitChar || "|" ) ; for ( var i = list . length ; i -- ; )
keywords [ list [ i ] ] = className ; } ) ; if ( Object . getPrototypeOf ( keywords ) ) { keywords . _ _proto _ _ = null ; }
this . $keywordList = Object . keys ( keywords ) ; map = null ; return ignoreCase ? function ( value ) { return keywords [ value . toLowerCase ( ) ] || defaultToken } : function ( value ) { return keywords [ value ] || defaultToken } ; }
this . getKeywords = function ( ) { return this . $keywords ; } ; } ) . call ( TextHighlightRules . prototype ) ; exports . TextHighlightRules = TextHighlightRules ; } ) ; define ( 'ace/mode/behaviour' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { var Behaviour = function ( ) { this . $behaviours = { } ; } ; ( function ( ) { this . add = function ( name , action , callback ) { switch ( undefined ) { case this . $behaviours : this . $behaviours = { } ; case this . $behaviours [ name ] : this . $behaviours [ name ] = { } ; }
this . $behaviours [ name ] [ action ] = callback ; }
this . addBehaviours = function ( behaviours ) { for ( var key in behaviours ) { for ( var action in behaviours [ key ] ) { this . add ( key , action , behaviours [ key ] [ action ] ) ; } } }
this . remove = function ( name ) { if ( this . $behaviours && this . $behaviours [ name ] ) { delete this . $behaviours [ name ] ; } }
this . inherit = function ( mode , filter ) { if ( typeof mode === "function" ) { var behaviours = new mode ( ) . getBehaviours ( filter ) ; } else { var behaviours = mode . getBehaviours ( filter ) ; }
this . addBehaviours ( behaviours ) ; }
this . getBehaviours = function ( filter ) { if ( ! filter ) { return this . $behaviours ; } else { var ret = { }
for ( var i = 0 ; i < filter . length ; i ++ ) { if ( this . $behaviours [ filter [ i ] ] ) { ret [ filter [ i ] ] = this . $behaviours [ filter [ i ] ] ; } }
return ret ; } } } ) . call ( Behaviour . prototype ) ; exports . Behaviour = Behaviour ; } ) ; define ( 'ace/unicode' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { exports . packages = { } ; addUnicodePackage ( { L : "0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC" , Ll : " 0061 - 007 A00AA00B500BA00DF - 00 F600F8 - 00 FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E - 0180018301850188018 C018D019201950199 - 019 B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD - 01 BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233 - 0239023 C023F0240024202470249024B024D024F - 02930295 - 02 AF037103730377037B - 037 D039003AC - 03 CE03D003D103D5 - 03 D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF - 03 F303F503F803FB03FC0430 - 045 F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B05
exports . packages [ name ] = pack [ name ] . replace ( codePoint , "\\u$&" ) ; } ; } ) ; define ( 'ace/token_iterator' , [ 'require' , 'exports' , 'module' ] , function ( require , exports , module ) { var TokenIterator = function ( session , initialRow , initialColumn ) { this . $session = session ; this . $row = initialRow ; this . $rowTokens = session . getTokens ( initialRow ) ; var token = session . getTokenAt ( initialRow , initialColumn ) ; this . $tokenIndex = token ? token . index : - 1 ; } ; ( function ( ) { this . stepBackward = function ( ) { this . $tokenIndex -= 1 ; while ( this . $tokenIndex < 0 ) { this . $row -= 1 ; if ( this . $row < 0 ) { this . $row = 0 ; return null ; }
this . $rowTokens = this . $session . getTokens ( this . $row ) ; this . $tokenIndex = this . $rowTokens . length - 1 ; }
return this . $rowTokens [ this . $tokenIndex ] ; } ; this . stepForward = function ( ) { this . $tokenIndex += 1 ; var rowCount ; while ( this . $tokenIndex >= this . $rowTokens . length ) { this . $row += 1 ; if ( ! rowCount )
rowCount = this . $session . getLength ( ) ; if ( this . $row >= rowCount ) { this . $row = rowCount - 1 ; return null ; }
this . $rowTokens = this . $session . getTokens ( this . $row ) ; this . $tokenIndex = 0 ; }
return this . $rowTokens [ this . $tokenIndex ] ; } ; this . getCurrentToken = function ( ) { return this . $rowTokens [ this . $tokenIndex ] ; } ; this . getCurrentTokenRow = function ( ) { return this . $row ; } ; this . getCurrentTokenColumn = function ( ) { var rowTokens = this . $rowTokens ; var tokenIndex = this . $tokenIndex ; var column = rowTokens [ tokenIndex ] . start ; if ( column !== undefined )
return column ; column = 0 ; while ( tokenIndex > 0 ) { tokenIndex -= 1 ; column += rowTokens [ tokenIndex ] . value . length ; }
return column ; } ; } ) . call ( TokenIterator . prototype ) ; exports . TokenIterator = TokenIterator ; } ) ; define ( 'ace/document' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/event_emitter' , 'ace/range' , 'ace/anchor' ] , function ( require , exports , module ) { var oop = require ( "./lib/oop" ) ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var Range = require ( "./range" ) . Range ; var Anchor = require ( "./anchor" ) . Anchor ; var Document = function ( text ) { this . $lines = [ ] ; if ( text . length == 0 ) { this . $lines = [ "" ] ; } else if ( Array . isArray ( text ) ) { this . _insertLines ( 0 , text ) ; } else { this . insert ( { row : 0 , column : 0 } , text ) ; } } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . setValue = function ( text ) { var len = this . getLength ( ) ; this . remove ( new Range ( 0 , 0 , len , this . getLine ( len - 1 ) . length ) ) ; this . insert ( { row : 0 , column : 0 } , text ) ; } ; this . getValue = function ( ) { return this . getAllLines ( ) . join ( this . getNewLineCharacter ( ) ) ; } ; this . createAnchor = function ( row , column ) { return new Anchor ( this , row , column ) ; } ; if ( "aaa" . split ( /a/ ) . length == 0 )
this . $split = function ( text ) { return text . replace ( /\r\n|\r/g , "\n" ) . split ( "\n" ) ; }
else
this . $split = function ( text ) { return text . split ( /\r\n|\r|\n/ ) ; } ; this . $detectNewLine = function ( text ) { var match = text . match ( /^.*?(\r\n|\r|\n)/m ) ; this . $autoNewLine = match ? match [ 1 ] : "\n" ; } ; this . getNewLineCharacter = function ( ) { switch ( this . $newLineMode ) { case "windows" : return "\r\n" ; case "unix" : return "\n" ; default : return this . $autoNewLine ; } } ; this . $autoNewLine = "\n" ; this . $newLineMode = "auto" ; this . setNewLineMode = function ( newLineMode ) { if ( this . $newLineMode === newLineMode )
return ; this . $newLineMode = newLineMode ; } ; this . getNewLineMode = function ( ) { return this . $newLineMode ; } ; this . isNewLine = function ( text ) { return ( text == "\r\n" || text == "\r" || text == "\n" ) ; } ; this . getLine = function ( row ) { return this . $lines [ row ] || "" ; } ; this . getLines = function ( firstRow , lastRow ) { return this . $lines . slice ( firstRow , lastRow + 1 ) ; } ; this . getAllLines = function ( ) { return this . getLines ( 0 , this . getLength ( ) ) ; } ; this . getLength = function ( ) { return this . $lines . length ; } ; this . getTextRange = function ( range ) { if ( range . start . row == range . end . row ) { return this . getLine ( range . start . row ) . substring ( range . start . column , range . end . column ) ; }
var lines = this . getLines ( range . start . row , range . end . row ) ; lines [ 0 ] = ( lines [ 0 ] || "" ) . substring ( range . start . column ) ; var l = lines . length - 1 ; if ( range . end . row - range . start . row == l )
lines [ l ] = lines [ l ] . substring ( 0 , range . end . column ) ; return lines . join ( this . getNewLineCharacter ( ) ) ; } ; this . $clipPosition = function ( position ) { var length = this . getLength ( ) ; if ( position . row >= length ) { position . row = Math . max ( 0 , length - 1 ) ; position . column = this . getLine ( length - 1 ) . length ; } else if ( position . row < 0 )
position . row = 0 ; return position ; } ; this . insert = function ( position , text ) { if ( ! text || text . length === 0 )
return position ; position = this . $clipPosition ( position ) ; if ( this . getLength ( ) <= 1 )
this . $detectNewLine ( text ) ; var lines = this . $split ( text ) ; var firstLine = lines . splice ( 0 , 1 ) [ 0 ] ; var lastLine = lines . length == 0 ? null : lines . splice ( lines . length - 1 , 1 ) [ 0 ] ; position = this . insertInLine ( position , firstLine ) ; if ( lastLine !== null ) { position = this . insertNewLine ( position ) ; position = this . _insertLines ( position . row , lines ) ; position = this . insertInLine ( position , lastLine || "" ) ; }
return position ; } ; this . insertLines = function ( row , lines ) { if ( row >= this . getLength ( ) )
return this . insert ( { row : row , column : 0 } , "\n" + lines . join ( "\n" ) ) ; return this . _insertLines ( Math . max ( row , 0 ) , lines ) ; } ; this . _insertLines = function ( row , lines ) { if ( lines . length == 0 )
return { row : row , column : 0 } ; if ( lines . length > 0xFFFF ) { var end = this . _insertLines ( row , lines . slice ( 0xFFFF ) ) ; lines = lines . slice ( 0 , 0xFFFF ) ; }
var args = [ row , 0 ] ; args . push . apply ( args , lines ) ; this . $lines . splice . apply ( this . $lines , args ) ; var range = new Range ( row , 0 , row + lines . length , 0 ) ; var delta = { action : "insertLines" , range : range , lines : lines } ; this . _emit ( "change" , { data : delta } ) ; return end || range . end ; } ; this . insertNewLine = function ( position ) { position = this . $clipPosition ( position ) ; var line = this . $lines [ position . row ] || "" ; this . $lines [ position . row ] = line . substring ( 0 , position . column ) ; this . $lines . splice ( position . row + 1 , 0 , line . substring ( position . column , line . length ) ) ; var end = { row : position . row + 1 , column : 0 } ; var delta = { action : "insertText" , range : Range . fromPoints ( position , end ) , text : this . getNewLineCharacter ( ) } ; this . _emit ( "change" , { data : delta } ) ; return end ; } ; this . insertInLine = function ( position , text ) { if ( text . length == 0 )
return position ; var line = this . $lines [ position . row ] || "" ; this . $lines [ position . row ] = line . substring ( 0 , position . column ) + text + line . substring ( position . column ) ; var end = { row : position . row , column : position . column + text . length } ; var delta = { action : "insertText" , range : Range . fromPoints ( position , end ) , text : text } ; this . _emit ( "change" , { data : delta } ) ; return end ; } ; this . remove = function ( range ) { if ( ! range instanceof Range )
range = Range . fromPoints ( range . start , range . end ) ; range . start = this . $clipPosition ( range . start ) ; range . end = this . $clipPosition ( range . end ) ; if ( range . isEmpty ( ) )
return range . start ; var firstRow = range . start . row ; var lastRow = range . end . row ; if ( range . isMultiLine ( ) ) { var firstFullRow = range . start . column == 0 ? firstRow : firstRow + 1 ; var lastFullRow = lastRow - 1 ; if ( range . end . column > 0 )
this . removeInLine ( lastRow , 0 , range . end . column ) ; if ( lastFullRow >= firstFullRow )
this . _removeLines ( firstFullRow , lastFullRow ) ; if ( firstFullRow != firstRow ) { this . removeInLine ( firstRow , range . start . column , this . getLine ( firstRow ) . length ) ; this . removeNewLine ( range . start . row ) ; } }
else { this . removeInLine ( firstRow , range . start . column , range . end . column ) ; }
return range . start ; } ; this . removeInLine = function ( row , startColumn , endColumn ) { if ( startColumn == endColumn )
return ; var range = new Range ( row , startColumn , row , endColumn ) ; var line = this . getLine ( row ) ; var removed = line . substring ( startColumn , endColumn ) ; var newLine = line . substring ( 0 , startColumn ) + line . substring ( endColumn , line . length ) ; this . $lines . splice ( row , 1 , newLine ) ; var delta = { action : "removeText" , range : range , text : removed } ; this . _emit ( "change" , { data : delta } ) ; return range . start ; } ; this . removeLines = function ( firstRow , lastRow ) { if ( firstRow < 0 || lastRow >= this . getLength ( ) )
return this . remove ( new Range ( firstRow , 0 , lastRow + 1 , 0 ) ) ; return this . _removeLines ( firstRow , lastRow ) ; } ; this . _removeLines = function ( firstRow , lastRow ) { var range = new Range ( firstRow , 0 , lastRow + 1 , 0 ) ; var removed = this . $lines . splice ( firstRow , lastRow - firstRow + 1 ) ; var delta = { action : "removeLines" , range : range , nl : this . getNewLineCharacter ( ) , lines : removed } ; this . _emit ( "change" , { data : delta } ) ; return removed ; } ; this . removeNewLine = function ( row ) { var firstLine = this . getLine ( row ) ; var secondLine = this . getLine ( row + 1 ) ; var range = new Range ( row , firstLine . length , row + 1 , 0 ) ; var line = firstLine + secondLine ; this . $lines . splice ( row , 2 , line ) ; var delta = { action : "removeText" , range : range , text : this . getNewLineCharacter ( ) } ; this . _emit ( "change" , { data : delta } ) ; } ; this . replace = function ( range , text ) { if ( ! range instanceof Range )
range = Range . fromPoints ( range . start , range . end ) ; if ( text . length == 0 && range . isEmpty ( ) )
return range . start ; if ( text == this . getTextRange ( range ) )
return range . end ; this . remove ( range ) ; if ( text ) { var end = this . insert ( range . start , text ) ; }
else { end = range . start ; }
return end ; } ; this . applyDeltas = function ( deltas ) { for ( var i = 0 ; i < deltas . length ; i ++ ) { var delta = deltas [ i ] ; var range = Range . fromPoints ( delta . range . start , delta . range . end ) ; if ( delta . action == "insertLines" )
this . insertLines ( range . start . row , delta . lines ) ; else if ( delta . action == "insertText" )
this . insert ( range . start , delta . text ) ; else if ( delta . action == "removeLines" )
this . _removeLines ( range . start . row , range . end . row - 1 ) ; else if ( delta . action == "removeText" )
this . remove ( range ) ; } } ; this . revertDeltas = function ( deltas ) { for ( var i = deltas . length - 1 ; i >= 0 ; i -- ) { var delta = deltas [ i ] ; var range = Range . fromPoints ( delta . range . start , delta . range . end ) ; if ( delta . action == "insertLines" )
this . _removeLines ( range . start . row , range . end . row - 1 ) ; else if ( delta . action == "insertText" )
this . remove ( range ) ; else if ( delta . action == "removeLines" )
this . _insertLines ( range . start . row , delta . lines ) ; else if ( delta . action == "removeText" )
this . insert ( range . start , delta . text ) ; } } ; this . indexToPosition = function ( index , startRow ) { var lines = this . $lines || this . getAllLines ( ) ; var newlineLength = this . getNewLineCharacter ( ) . length ; for ( var i = startRow || 0 , l = lines . length ; i < l ; i ++ ) { index -= lines [ i ] . length + newlineLength ; if ( index < 0 )
return { row : i , column : index + lines [ i ] . length + newlineLength } ; }
return { row : l - 1 , column : lines [ l - 1 ] . length } ; } ; this . positionToIndex = function ( pos , startRow ) { var lines = this . $lines || this . getAllLines ( ) ; var newlineLength = this . getNewLineCharacter ( ) . length ; var index = 0 ; var row = Math . min ( pos . row , lines . length ) ; for ( var i = startRow || 0 ; i < row ; ++ i )
index += lines [ i ] . length + newlineLength ; return index + pos . column ; } ; } ) . call ( Document . prototype ) ; exports . Document = Document ; } ) ; define ( 'ace/anchor' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/event_emitter' ] , function ( require , exports , module ) { var oop = require ( "./lib/oop" ) ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var Anchor = exports . Anchor = function ( doc , row , column ) { this . $onChange = this . onChange . bind ( this ) ; this . attach ( doc ) ; if ( typeof column == "undefined" )
this . setPosition ( row . row , row . column ) ; else
this . setPosition ( row , column ) ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . getPosition = function ( ) { return this . $clipPositionToDocument ( this . row , this . column ) ; } ; this . getDocument = function ( ) { return this . document ; } ; this . $insertRight = false ; this . onChange = function ( e ) { var delta = e . data ; var range = delta . range ; if ( range . start . row == range . end . row && range . start . row != this . row )
return ; if ( range . start . row > this . row )
return ; if ( range . start . row == this . row && range . start . column > this . column )
return ; var row = this . row ; var column = this . column ; var start = range . start ; var end = range . end ; if ( delta . action === "insertText" ) { if ( start . row === row && start . column <= column ) { if ( start . column === column && this . $insertRight ) { } else if ( start . row === end . row ) { column += end . column - start . column ; } else { column -= start . column ; row += end . row - start . row ; } } else if ( start . row !== end . row && start . row < row ) { row += end . row - start . row ; } } else if ( delta . action === "insertLines" ) { if ( start . row <= row ) { row += end . row - start . row ; } } else if ( delta . action === "removeText" ) { if ( start . row === row && start . column < column ) { if ( end . column >= column )
column = start . column ; else
column = Math . max ( 0 , column - ( end . column - start . column ) ) ; } else if ( start . row !== end . row && start . row < row ) { if ( end . row === row )
column = Math . max ( 0 , column - end . column ) + start . column ; row -= ( end . row - start . row ) ; } else if ( end . row === row ) { row -= end . row - start . row ; column = Math . max ( 0 , column - end . column ) + start . column ; } } else if ( delta . action == "removeLines" ) { if ( start . row <= row ) { if ( end . row <= row )
row -= end . row - start . row ; else { row = start . row ; column = 0 ; } } }
this . setPosition ( row , column , true ) ; } ; this . setPosition = function ( row , column , noClip ) { var pos ; if ( noClip ) { pos = { row : row , column : column } ; } else { pos = this . $clipPositionToDocument ( row , column ) ; }
if ( this . row == pos . row && this . column == pos . column )
return ; var old = { row : this . row , column : this . column } ; this . row = pos . row ; this . column = pos . column ; this . _emit ( "change" , { old : old , value : pos } ) ; } ; this . detach = function ( ) { this . document . removeEventListener ( "change" , this . $onChange ) ; } ; this . attach = function ( doc ) { this . document = doc || this . document ; this . document . on ( "change" , this . $onChange ) ; } ; this . $clipPositionToDocument = function ( row , column ) { var pos = { } ; if ( row >= this . document . getLength ( ) ) { pos . row = Math . max ( 0 , this . document . getLength ( ) - 1 ) ; pos . column = this . document . getLine ( pos . row ) . length ; }
else if ( row < 0 ) { pos . row = 0 ; pos . column = 0 ; }
else { pos . row = row ; pos . column = Math . min ( this . document . getLine ( pos . row ) . length , Math . max ( 0 , column ) ) ; }
if ( column < 0 )
pos . column = 0 ; return pos ; } ; } ) . call ( Anchor . prototype ) ; } ) ; define ( 'ace/background_tokenizer' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/event_emitter' ] , function ( require , exports , module ) { var oop = require ( "./lib/oop" ) ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var BackgroundTokenizer = function ( tokenizer , editor ) { this . running = false ; this . lines = [ ] ; this . states = [ ] ; this . currentLine = 0 ; this . tokenizer = tokenizer ; var self = this ; this . $worker = function ( ) { if ( ! self . running ) { return ; }
var workerStart = new Date ( ) ; var currentLine = self . currentLine ; var endLine = - 1 ; var doc = self . doc ; while ( self . lines [ currentLine ] )
currentLine ++ ; var startLine = currentLine ; var len = doc . getLength ( ) ; var processedLines = 0 ; self . running = false ; while ( currentLine < len ) { self . $tokenizeRow ( currentLine ) ; endLine = currentLine ; do { currentLine ++ ; } while ( self . lines [ currentLine ] ) ; processedLines ++ ; if ( ( processedLines % 5 == 0 ) && ( new Date ( ) - workerStart ) > 20 ) { self . running = setTimeout ( self . $worker , 20 ) ; self . currentLine = currentLine ; return ; } }
self . currentLine = currentLine ; if ( startLine <= endLine )
self . fireUpdateEvent ( startLine , endLine ) ; } ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . setTokenizer = function ( tokenizer ) { this . tokenizer = tokenizer ; this . lines = [ ] ; this . states = [ ] ; this . start ( 0 ) ; } ; this . setDocument = function ( doc ) { this . doc = doc ; this . lines = [ ] ; this . states = [ ] ; this . stop ( ) ; } ; this . fireUpdateEvent = function ( firstRow , lastRow ) { var data = { first : firstRow , last : lastRow } ; this . _emit ( "update" , { data : data } ) ; } ; this . start = function ( startRow ) { this . currentLine = Math . min ( startRow || 0 , this . currentLine , this . doc . getLength ( ) ) ; this . lines . splice ( this . currentLine , this . lines . length ) ; this . states . splice ( this . currentLine , this . states . length ) ; this . stop ( ) ; this . running = setTimeout ( this . $worker , 700 ) ; } ; this . scheduleStart = function ( ) { if ( ! this . running )
this . running = setTimeout ( this . $worker , 700 ) ; }
this . $updateOnChange = function ( delta ) { var range = delta . range ; var startRow = range . start . row ; var len = range . end . row - startRow ; if ( len === 0 ) { this . lines [ startRow ] = null ; } else if ( delta . action == "removeText" || delta . action == "removeLines" ) { this . lines . splice ( startRow , len + 1 , null ) ; this . states . splice ( startRow , len + 1 , null ) ; } else { var args = Array ( len + 1 ) ; args . unshift ( startRow , 1 ) ; this . lines . splice . apply ( this . lines , args ) ; this . states . splice . apply ( this . states , args ) ; }
this . currentLine = Math . min ( startRow , this . currentLine , this . doc . getLength ( ) ) ; this . stop ( ) ; } ; this . stop = function ( ) { if ( this . running )
clearTimeout ( this . running ) ; this . running = false ; } ; this . getTokens = function ( row ) { return this . lines [ row ] || this . $tokenizeRow ( row ) ; } ; this . getState = function ( row ) { if ( this . currentLine == row )
this . $tokenizeRow ( row ) ; return this . states [ row ] || "start" ; } ; this . $tokenizeRow = function ( row ) { var line = this . doc . getLine ( row ) ; var state = this . states [ row - 1 ] ; var data = this . tokenizer . getLineTokens ( line , state , row ) ; if ( this . states [ row ] + "" !== data . state + "" ) { this . states [ row ] = data . state ; this . lines [ row + 1 ] = null ; if ( this . currentLine > row + 1 )
this . currentLine = row + 1 ; } else if ( this . currentLine == row ) { this . currentLine = row + 1 ; }
return this . lines [ row ] = data . tokens ; } ; } ) . call ( BackgroundTokenizer . prototype ) ; exports . BackgroundTokenizer = BackgroundTokenizer ; } ) ; define ( 'ace/search_highlight' , [ 'require' , 'exports' , 'module' , 'ace/lib/lang' , 'ace/lib/oop' , 'ace/range' ] , function ( require , exports , module ) { var lang = require ( "./lib/lang" ) ; var oop = require ( "./lib/oop" ) ; var Range = require ( "./range" ) . Range ; var SearchHighlight = function ( regExp , clazz , type ) { this . setRegexp ( regExp ) ; this . clazz = clazz ; this . type = type || "text" ; } ; ( function ( ) { this . MAX _RANGES = 500 ; this . setRegexp = function ( regExp ) { if ( this . regExp + "" == regExp + "" )
return ; this . regExp = regExp ; this . cache = [ ] ; } ; this . update = function ( html , markerLayer , session , config ) { if ( ! this . regExp )
return ; var start = config . firstRow , end = config . lastRow ; for ( var i = start ; i <= end ; i ++ ) { var ranges = this . cache [ i ] ; if ( ranges == null ) { ranges = lang . getMatchOffsets ( session . getLine ( i ) , this . regExp ) ; if ( ranges . length > this . MAX _RANGES )
ranges = ranges . slice ( 0 , this . MAX _RANGES ) ; ranges = ranges . map ( function ( match ) { return new Range ( i , match . offset , i , match . offset + match . length ) ; } ) ; this . cache [ i ] = ranges . length ? ranges : "" ; }
for ( var j = ranges . length ; j -- ; ) { markerLayer . drawSingleLineMarker ( html , ranges [ j ] . toScreenRange ( session ) , this . clazz , config ) ; } } } ; } ) . call ( SearchHighlight . prototype ) ; exports . SearchHighlight = SearchHighlight ; } ) ; define ( 'ace/edit_session/folding' , [ 'require' , 'exports' , 'module' , 'ace/range' , 'ace/edit_session/fold_line' , 'ace/edit_session/fold' , 'ace/token_iterator' ] , function ( require , exports , module ) { var Range = require ( "../range" ) . Range ; var FoldLine = require ( "./fold_line" ) . FoldLine ; var Fold = require ( "./fold" ) . Fold ; var TokenIterator = require ( "../token_iterator" ) . TokenIterator ; function Folding ( ) { this . getFoldAt = function ( row , column , side ) { var foldLine = this . getFoldLine ( row ) ; if ( ! foldLine )
return null ; var folds = foldLine . folds ; for ( var i = 0 ; i < folds . length ; i ++ ) { var fold = folds [ i ] ; if ( fold . range . contains ( row , column ) ) { if ( side == 1 && fold . range . isEnd ( row , column ) ) { continue ; } else if ( side == - 1 && fold . range . isStart ( row , column ) ) { continue ; }
return fold ; } } } ; this . getFoldsInRange = function ( range ) { var start = range . start ; var end = range . end ; var foldLines = this . $foldData ; var foundFolds = [ ] ; start . column += 1 ; end . column -= 1 ; for ( var i = 0 ; i < foldLines . length ; i ++ ) { var cmp = foldLines [ i ] . range . compareRange ( range ) ; if ( cmp == 2 ) { continue ; }
else if ( cmp == - 2 ) { break ; }
var folds = foldLines [ i ] . folds ; for ( var j = 0 ; j < folds . length ; j ++ ) { var fold = folds [ j ] ; cmp = fold . range . compareRange ( range ) ; if ( cmp == - 2 ) { break ; } else if ( cmp == 2 ) { continue ; } else
if ( cmp == 42 ) { break ; }
foundFolds . push ( fold ) ; } }
start . column -= 1 ; end . column += 1 ; return foundFolds ; } ; this . getAllFolds = function ( ) { var folds = [ ] ; var foldLines = this . $foldData ; function addFold ( fold ) { folds . push ( fold ) ; }
for ( var i = 0 ; i < foldLines . length ; i ++ )
for ( var j = 0 ; j < foldLines [ i ] . folds . length ; j ++ )
addFold ( foldLines [ i ] . folds [ j ] ) ; return folds ; } ; this . getFoldStringAt = function ( row , column , trim , foldLine ) { foldLine = foldLine || this . getFoldLine ( row ) ; if ( ! foldLine )
return null ; var lastFold = { end : { column : 0 } } ; var str , fold ; for ( var i = 0 ; i < foldLine . folds . length ; i ++ ) { fold = foldLine . folds [ i ] ; var cmp = fold . range . compareEnd ( row , column ) ; if ( cmp == - 1 ) { str = this . getLine ( fold . start . row ) . substring ( lastFold . end . column , fold . start . column ) ; break ; }
else if ( cmp === 0 ) { return null ; }
lastFold = fold ; }
if ( ! str )
str = this . getLine ( fold . start . row ) . substring ( lastFold . end . column ) ; if ( trim == - 1 )
return str . substring ( 0 , column - lastFold . end . column ) ; else if ( trim == 1 )
return str . substring ( column - lastFold . end . column ) ; else
return str ; } ; this . getFoldLine = function ( docRow , startFoldLine ) { var foldData = this . $foldData ; var i = 0 ; if ( startFoldLine )
i = foldData . indexOf ( startFoldLine ) ; if ( i == - 1 )
i = 0 ; for ( i ; i < foldData . length ; i ++ ) { var foldLine = foldData [ i ] ; if ( foldLine . start . row <= docRow && foldLine . end . row >= docRow ) { return foldLine ; } else if ( foldLine . end . row > docRow ) { return null ; } }
return null ; } ; this . getNextFoldLine = function ( docRow , startFoldLine ) { var foldData = this . $foldData ; var i = 0 ; if ( startFoldLine )
i = foldData . indexOf ( startFoldLine ) ; if ( i == - 1 )
i = 0 ; for ( i ; i < foldData . length ; i ++ ) { var foldLine = foldData [ i ] ; if ( foldLine . end . row >= docRow ) { return foldLine ; } }
return null ; } ; this . getFoldedRowCount = function ( first , last ) { var foldData = this . $foldData , rowCount = last - first + 1 ; for ( var i = 0 ; i < foldData . length ; i ++ ) { var foldLine = foldData [ i ] , end = foldLine . end . row , start = foldLine . start . row ; if ( end >= last ) { if ( start < last ) { if ( start >= first )
rowCount -= last - start ; else
rowCount = 0 ; }
break ; } else if ( end >= first ) { if ( start >= first )
rowCount -= end - start ; else
rowCount -= end - first + 1 ; } }
return rowCount ; } ; this . $addFoldLine = function ( foldLine ) { this . $foldData . push ( foldLine ) ; this . $foldData . sort ( function ( a , b ) { return a . start . row - b . start . row ; } ) ; return foldLine ; } ; this . addFold = function ( placeholder , range ) { var foldData = this . $foldData ; var added = false ; var fold ; if ( placeholder instanceof Fold )
fold = placeholder ; else { fold = new Fold ( range , placeholder ) ; fold . collapseChildren = range . collapseChildren ; }
this . $clipRangeToDocument ( fold . range ) ; var startRow = fold . start . row ; var startColumn = fold . start . column ; var endRow = fold . end . row ; var endColumn = fold . end . column ; if ( ! ( startRow < endRow || startRow == endRow && startColumn <= endColumn - 2 ) )
throw new Error ( "The range has to be at least 2 characters width" ) ; var startFold = this . getFoldAt ( startRow , startColumn , 1 ) ; var endFold = this . getFoldAt ( endRow , endColumn , - 1 ) ; if ( startFold && endFold == startFold )
return startFold . addSubFold ( fold ) ; if ( ( startFold && ! startFold . range . isStart ( startRow , startColumn ) ) || ( endFold && ! endFold . range . isEnd ( endRow , endColumn ) ) ) { throw new Error ( "A fold can't intersect already existing fold" + fold . range + startFold . range ) ; }
var folds = this . getFoldsInRange ( fold . range ) ; if ( folds . length > 0 ) { this . removeFolds ( folds ) ; folds . forEach ( function ( subFold ) { fold . addSubFold ( subFold ) ; } ) ; }
for ( var i = 0 ; i < foldData . length ; i ++ ) { var foldLine = foldData [ i ] ; if ( endRow == foldLine . start . row ) { foldLine . addFold ( fold ) ; added = true ; break ; } else if ( startRow == foldLine . end . row ) { foldLine . addFold ( fold ) ; added = true ; if ( ! fold . sameRow ) { var foldLineNext = foldData [ i + 1 ] ; if ( foldLineNext && foldLineNext . start . row == endRow ) { foldLine . merge ( foldLineNext ) ; break ; } }
break ; } else if ( endRow <= foldLine . start . row ) { break ; } }
if ( ! added )
foldLine = this . $addFoldLine ( new FoldLine ( this . $foldData , fold ) ) ; if ( this . $useWrapMode )
this . $updateWrapData ( foldLine . start . row , foldLine . start . row ) ; else
this . $updateRowLengthCache ( foldLine . start . row , foldLine . start . row ) ; this . $modified = true ; this . _emit ( "changeFold" , { data : fold , action : "add" } ) ; return fold ; } ; this . addFolds = function ( folds ) { folds . forEach ( function ( fold ) { this . addFold ( fold ) ; } , this ) ; } ; this . removeFold = function ( fold ) { var foldLine = fold . foldLine ; var startRow = foldLine . start . row ; var endRow = foldLine . end . row ; var foldLines = this . $foldData ; var folds = foldLine . folds ; if ( folds . length == 1 ) { foldLines . splice ( foldLines . indexOf ( foldLine ) , 1 ) ; } else
if ( foldLine . range . isEnd ( fold . end . row , fold . end . column ) ) { folds . pop ( ) ; foldLine . end . row = folds [ folds . length - 1 ] . end . row ; foldLine . end . column = folds [ folds . length - 1 ] . end . column ; } else
if ( foldLine . range . isStart ( fold . start . row , fold . start . column ) ) { folds . shift ( ) ; foldLine . start . row = folds [ 0 ] . start . row ; foldLine . start . column = folds [ 0 ] . start . column ; } else
if ( fold . sameRow ) { folds . splice ( folds . indexOf ( fold ) , 1 ) ; } else
{ var newFoldLine = foldLine . split ( fold . start . row , fold . start . column ) ; folds = newFoldLine . folds ; folds . shift ( ) ; newFoldLine . start . row = folds [ 0 ] . start . row ; newFoldLine . start . column = folds [ 0 ] . start . column ; }
if ( ! this . $updating ) { if ( this . $useWrapMode )
this . $updateWrapData ( startRow , endRow ) ; else
this . $updateRowLengthCache ( startRow , endRow ) ; }
this . $modified = true ; this . _emit ( "changeFold" , { data : fold , action : "remove" } ) ; } ; this . removeFolds = function ( folds ) { var cloneFolds = [ ] ; for ( var i = 0 ; i < folds . length ; i ++ ) { cloneFolds . push ( folds [ i ] ) ; }
cloneFolds . forEach ( function ( fold ) { this . removeFold ( fold ) ; } , this ) ; this . $modified = true ; } ; this . expandFold = function ( fold ) { this . removeFold ( fold ) ; fold . subFolds . forEach ( function ( subFold ) { fold . restoreRange ( subFold ) ; this . addFold ( subFold ) ; } , this ) ; if ( fold . collapseChildren > 0 ) { this . foldAll ( fold . start . row + 1 , fold . end . row , fold . collapseChildren - 1 ) ; }
fold . subFolds = [ ] ; } ; this . expandFolds = function ( folds ) { folds . forEach ( function ( fold ) { this . expandFold ( fold ) ; } , this ) ; } ; this . unfold = function ( location , expandInner ) { var range , folds ; if ( location == null ) { range = new Range ( 0 , 0 , this . getLength ( ) , 0 ) ; expandInner = true ; } else if ( typeof location == "number" )
range = new Range ( location , 0 , location , this . getLine ( location ) . length ) ; else if ( "row" in location )
range = Range . fromPoints ( location , location ) ; else
range = location ; folds = this . getFoldsInRange ( range ) ; if ( expandInner ) { this . removeFolds ( folds ) ; } else { while ( folds . length ) { this . expandFolds ( folds ) ; folds = this . getFoldsInRange ( range ) ; } } } ; this . isRowFolded = function ( docRow , startFoldRow ) { return ! ! this . getFoldLine ( docRow , startFoldRow ) ; } ; this . getRowFoldEnd = function ( docRow , startFoldRow ) { var foldLine = this . getFoldLine ( docRow , startFoldRow ) ; return foldLine ? foldLine . end . row : docRow ; } ; this . getRowFoldStart = function ( docRow , startFoldRow ) { var foldLine = this . getFoldLine ( docRow , startFoldRow ) ; return foldLine ? foldLine . start . row : docRow ; } ; this . getFoldDisplayLine = function ( foldLine , endRow , endColumn , startRow , startColumn ) { if ( startRow == null ) { startRow = foldLine . start . row ; startColumn = 0 ; }
if ( endRow == null ) { endRow = foldLine . end . row ; endColumn = this . getLine ( endRow ) . length ; }
var doc = this . doc ; var textLine = "" ; foldLine . walk ( function ( placeholder , row , column , lastColumn ) { if ( row < startRow )
return ; if ( row == startRow ) { if ( column < startColumn )
return ; lastColumn = Math . max ( startColumn , lastColumn ) ; }
if ( placeholder != null ) { textLine += placeholder ; } else { textLine += doc . getLine ( row ) . substring ( lastColumn , column ) ; } } , endRow , endColumn ) ; return textLine ; } ; this . getDisplayLine = function ( row , endColumn , startRow , startColumn ) { var foldLine = this . getFoldLine ( row ) ; if ( ! foldLine ) { var line ; line = this . doc . getLine ( row ) ; return line . substring ( startColumn || 0 , endColumn || line . length ) ; } else { return this . getFoldDisplayLine ( foldLine , row , endColumn , startRow , startColumn ) ; } } ; this . $cloneFoldData = function ( ) { var fd = [ ] ; fd = this . $foldData . map ( function ( foldLine ) { var folds = foldLine . folds . map ( function ( fold ) { return fold . clone ( ) ; } ) ; return new FoldLine ( fd , folds ) ; } ) ; return fd ; } ; this . toggleFold = function ( tryToUnfold ) { var selection = this . selection ; var range = selection . getRange ( ) ; var fold ; var bracketPos ; if ( range . isEmpty ( ) ) { var cursor = range . start ; fold = this . getFoldAt ( cursor . row , cursor . column ) ; if ( fold ) { this . expandFold ( fold ) ; return ; } else if ( bracketPos = this . findMatchingBracket ( cursor ) ) { if ( range . comparePoint ( bracketPos ) == 1 ) { range . end = bracketPos ; } else { range . start = bracketPos ; range . start . column ++ ; range . end . column -- ; } } else if ( bracketPos = this . findMatchingBracket ( { row : cursor . row , column : cursor . column + 1 } ) ) { if ( range . comparePoint ( bracketPos ) == 1 )
range . end = bracketPos ; else
range . start = bracketPos ; range . start . column ++ ; } else { range = this . getCommentFoldRange ( cursor . row , cursor . column ) || range ; } } else { var folds = this . getFoldsInRange ( range ) ; if ( tryToUnfold && folds . length ) { this . expandFolds ( folds ) ; return ; } else if ( folds . length == 1 ) { fold = folds [ 0 ] ; } }
if ( ! fold )
fold = this . getFoldAt ( range . start . row , range . start . column ) ; if ( fold && fold . range . toString ( ) == range . toString ( ) ) { this . expandFold ( fold ) ; return ; }
var placeholder = "..." ; if ( ! range . isMultiLine ( ) ) { placeholder = this . getTextRange ( range ) ; if ( placeholder . length < 4 )
return ; placeholder = placeholder . trim ( ) . substring ( 0 , 2 ) + ".." ; }
this . addFold ( placeholder , range ) ; } ; this . getCommentFoldRange = function ( row , column , dir ) { var iterator = new TokenIterator ( this , row , column ) ; var token = iterator . getCurrentToken ( ) ; if ( token && /^comment|string/ . test ( token . type ) ) { var range = new Range ( ) ; var re = new RegExp ( token . type . replace ( /\..*/ , "\\." ) ) ; if ( dir != 1 ) { do { token = iterator . stepBackward ( ) ; } while ( token && re . test ( token . type ) ) ; iterator . stepForward ( ) ; }
range . start . row = iterator . getCurrentTokenRow ( ) ; range . start . column = iterator . getCurrentTokenColumn ( ) + 2 ; iterator = new TokenIterator ( this , row , column ) ; if ( dir != - 1 ) { do { token = iterator . stepForward ( ) ; } while ( token && re . test ( token . type ) ) ; token = iterator . stepBackward ( ) ; } else
token = iterator . getCurrentToken ( ) ; range . end . row = iterator . getCurrentTokenRow ( ) ; range . end . column = iterator . getCurrentTokenColumn ( ) + token . value . length - 2 ; return range ; } } ; this . foldAll = function ( startRow , endRow , depth ) { if ( depth == undefined )
depth = 100000 ; var foldWidgets = this . foldWidgets ; endRow = endRow || this . getLength ( ) ; startRow = startRow || 0 ; for ( var row = startRow ; row < endRow ; row ++ ) { if ( foldWidgets [ row ] == null )
foldWidgets [ row ] = this . getFoldWidget ( row ) ; if ( foldWidgets [ row ] != "start" )
continue ; var range = this . getFoldWidgetRange ( row ) ; var rangeEndRow = range . end . row ; if ( range && range . isMultiLine ( ) && rangeEndRow <= endRow && range . start . row >= startRow ) try { var fold = this . addFold ( "..." , range ) ; fold . collapseChildren = depth ; row = rangeEndRow ; } catch ( e ) { } } } ; this . $foldStyles = { "manual" : 1 , "markbegin" : 1 , "markbeginend" : 1 } ; this . $foldStyle = "markbegin" ; this . setFoldStyle = function ( style ) { if ( ! this . $foldStyles [ style ] )
throw new Error ( "invalid fold style: " + style + "[" + Object . keys ( this . $foldStyles ) . join ( ", " ) + "]" ) ; if ( this . $foldStyle == style )
return ; this . $foldStyle = style ; if ( style == "manual" )
this . unfold ( ) ; var mode = this . $foldMode ; this . $setFolding ( null ) ; this . $setFolding ( mode ) ; } ; this . $setFolding = function ( foldMode ) { if ( this . $foldMode == foldMode )
return ; this . $foldMode = foldMode ; this . removeListener ( 'change' , this . $updateFoldWidgets ) ; this . _emit ( "changeAnnotation" ) ; if ( ! foldMode || this . $foldStyle == "manual" ) { this . foldWidgets = null ; return ; }
this . foldWidgets = [ ] ; this . getFoldWidget = foldMode . getFoldWidget . bind ( foldMode , this , this . $foldStyle ) ; this . getFoldWidgetRange = foldMode . getFoldWidgetRange . bind ( foldMode , this , this . $foldStyle ) ; this . $updateFoldWidgets = this . updateFoldWidgets . bind ( this ) ; this . on ( 'change' , this . $updateFoldWidgets ) ; } ; this . getParentFoldRangeData = function ( row , ignoreCurrent ) { var fw = this . foldWidgets ; if ( ! fw || ( ignoreCurrent && fw [ row ] ) )
return { } ; var i = row - 1 , firstRange ; while ( i >= 0 ) { var c = fw [ i ] ; if ( c == null )
c = fw [ i ] = this . getFoldWidget ( i ) ; if ( c == "start" ) { var range = this . getFoldWidgetRange ( i ) ; if ( ! firstRange )
firstRange = range ; if ( range && range . end . row >= row )
break ; }
i -- ; }
return { range : i !== - 1 && range , firstRange : firstRange } ; }
this . onFoldWidgetClick = function ( row , e ) { var type = this . getFoldWidget ( row ) ; var line = this . getLine ( row ) ; e = e . domEvent ; var children = e . shiftKey ; var all = e . ctrlKey || e . metaKey ; var siblings = e . altKey ; var dir = type === "end" ? - 1 : 1 ; var fold = this . getFoldAt ( row , dir === - 1 ? 0 : line . length , dir ) ; if ( fold ) { if ( children || all )
this . removeFold ( fold ) ; else
this . expandFold ( fold ) ; return ; }
var range = this . getFoldWidgetRange ( row ) ; if ( range && ! range . isMultiLine ( ) ) { fold = this . getFoldAt ( range . start . row , range . start . column , 1 ) ; if ( fold && range . isEqual ( fold . range ) ) { this . removeFold ( fold ) ; return ; } }
if ( siblings ) { var data = this . getParentFoldRangeData ( row ) ; if ( data . range ) { var startRow = data . range . start . row + 1 ; var endRow = data . range . end . row ; }
this . foldAll ( startRow , endRow , all ? 10000 : 0 ) ; } else if ( children ) { var endRow = range ? range . end . row : this . getLength ( ) ; this . foldAll ( row + 1 , range . end . row , all ? 10000 : 0 ) ; } else if ( range ) { if ( all )
range . collapseChildren = 10000 ; this . addFold ( "..." , range ) ; }
if ( ! range ) ( e . target || e . srcElement ) . className += " ace_invalid" } ; this . updateFoldWidgets = function ( e ) { var delta = e . data ; var range = delta . range ; var firstRow = range . start . row ; var len = range . end . row - firstRow ; if ( len === 0 ) { this . foldWidgets [ firstRow ] = null ; } else if ( delta . action == "removeText" || delta . action == "removeLines" ) { this . foldWidgets . splice ( firstRow , len + 1 , null ) ; } else { var args = Array ( len + 1 ) ; args . unshift ( firstRow , 1 ) ; this . foldWidgets . splice . apply ( this . foldWidgets , args ) ; } } ; }
exports . Folding = Folding ; } ) ; define ( 'ace/edit_session/fold_line' , [ 'require' , 'exports' , 'module' , 'ace/range' ] , function ( require , exports , module ) { var Range = require ( "../range" ) . Range ; function FoldLine ( foldData , folds ) { this . foldData = foldData ; if ( Array . isArray ( folds ) ) { this . folds = folds ; } else { folds = this . folds = [ folds ] ; }
var last = folds [ folds . length - 1 ]
this . range = new Range ( folds [ 0 ] . start . row , folds [ 0 ] . start . column , last . end . row , last . end . column ) ; this . start = this . range . start ; this . end = this . range . end ; this . folds . forEach ( function ( fold ) { fold . setFoldLine ( this ) ; } , this ) ; }
( function ( ) { this . shiftRow = function ( shift ) { this . start . row += shift ; this . end . row += shift ; this . folds . forEach ( function ( fold ) { fold . start . row += shift ; fold . end . row += shift ; } ) ; }
this . addFold = function ( fold ) { if ( fold . sameRow ) { if ( fold . start . row < this . startRow || fold . endRow > this . endRow ) { throw new Error ( "Can't add a fold to this FoldLine as it has no connection" ) ; }
this . folds . push ( fold ) ; this . folds . sort ( function ( a , b ) { return - a . range . compareEnd ( b . start . row , b . start . column ) ; } ) ; if ( this . range . compareEnd ( fold . start . row , fold . start . column ) > 0 ) { this . end . row = fold . end . row ; this . end . column = fold . end . column ; } else if ( this . range . compareStart ( fold . end . row , fold . end . column ) < 0 ) { this . start . row = fold . start . row ; this . start . column = fold . start . column ; } } else if ( fold . start . row == this . end . row ) { this . folds . push ( fold ) ; this . end . row = fold . end . row ; this . end . column = fold . end . column ; } else if ( fold . end . row == this . start . row ) { this . folds . unshift ( fold ) ; this . start . row = fold . start . row ; this . start . column = fold . start . column ; } else { throw new Error ( "Trying to add fold to FoldRow that doesn't have a matching row" ) ; }
fold . foldLine = this ; }
this . containsRow = function ( row ) { return row >= this . start . row && row <= this . end . row ; }
this . walk = function ( callback , endRow , endColumn ) { var lastEnd = 0 , folds = this . folds , fold , comp , stop , isNewRow = true ; if ( endRow == null ) { endRow = this . end . row ; endColumn = this . end . column ; }
for ( var i = 0 ; i < folds . length ; i ++ ) { fold = folds [ i ] ; comp = fold . range . compareStart ( endRow , endColumn ) ; if ( comp == - 1 ) { callback ( null , endRow , endColumn , lastEnd , isNewRow ) ; return ; }
stop = callback ( null , fold . start . row , fold . start . column , lastEnd , isNewRow ) ; stop = ! stop && callback ( fold . placeholder , fold . start . row , fold . start . column , lastEnd ) ; if ( stop || comp == 0 ) { return ; }
isNewRow = ! fold . sameRow ; lastEnd = fold . end . column ; }
callback ( null , endRow , endColumn , lastEnd , isNewRow ) ; }
this . getNextFoldTo = function ( row , column ) { var fold , cmp ; for ( var i = 0 ; i < this . folds . length ; i ++ ) { fold = this . folds [ i ] ; cmp = fold . range . compareEnd ( row , column ) ; if ( cmp == - 1 ) { return { fold : fold , kind : "after" } ; } else if ( cmp == 0 ) { return { fold : fold , kind : "inside" } } }
return null ; }
this . addRemoveChars = function ( row , column , len ) { var ret = this . getNextFoldTo ( row , column ) , fold , folds ; if ( ret ) { fold = ret . fold ; if ( ret . kind == "inside" && fold . start . column != column && fold . start . row != row )
{ window . console && window . console . log ( row , column , fold ) ; } else if ( fold . start . row == row ) { folds = this . folds ; var i = folds . indexOf ( fold ) ; if ( i == 0 ) { this . start . column += len ; }
for ( i ; i < folds . length ; i ++ ) { fold = folds [ i ] ; fold . start . column += len ; if ( ! fold . sameRow ) { return ; }
fold . end . column += len ; }
this . end . column += len ; } } }
this . split = function ( row , column ) { var fold = this . getNextFoldTo ( row , column ) . fold ; var folds = this . folds ; var foldData = this . foldData ; if ( ! fold )
return null ; var i = folds . indexOf ( fold ) ; var foldBefore = folds [ i - 1 ] ; this . end . row = foldBefore . end . row ; this . end . column = foldBefore . end . column ; folds = folds . splice ( i , folds . length - i ) ; var newFoldLine = new FoldLine ( foldData , folds ) ; foldData . splice ( foldData . indexOf ( this ) + 1 , 0 , newFoldLine ) ; return newFoldLine ; }
this . merge = function ( foldLineNext ) { var folds = foldLineNext . folds ; for ( var i = 0 ; i < folds . length ; i ++ ) { this . addFold ( folds [ i ] ) ; }
var foldData = this . foldData ; foldData . splice ( foldData . indexOf ( foldLineNext ) , 1 ) ; }
this . toString = function ( ) { var ret = [ this . range . toString ( ) + ": [" ] ; this . folds . forEach ( function ( fold ) { ret . push ( " " + fold . toString ( ) ) ; } ) ; ret . push ( "]" )
return ret . join ( "\n" ) ; }
this . idxToPosition = function ( idx ) { var lastFoldEndColumn = 0 ; var fold ; for ( var i = 0 ; i < this . folds . length ; i ++ ) { var fold = this . folds [ i ] ; idx -= fold . start . column - lastFoldEndColumn ; if ( idx < 0 ) { return { row : fold . start . row , column : fold . start . column + idx } ; }
idx -= fold . placeholder . length ; if ( idx < 0 ) { return fold . start ; }
lastFoldEndColumn = fold . end . column ; }
return { row : this . end . row , column : this . end . column + idx } ; } } ) . call ( FoldLine . prototype ) ; exports . FoldLine = FoldLine ; } ) ; define ( 'ace/edit_session/fold' , [ 'require' , 'exports' , 'module' , 'ace/range' , 'ace/range_list' , 'ace/lib/oop' ] , function ( require , exports , module ) { var Range = require ( "../range" ) . Range ; var RangeList = require ( "../range_list" ) . RangeList ; var oop = require ( "../lib/oop" )
var Fold = exports . Fold = function ( range , placeholder ) { this . foldLine = null ; this . placeholder = placeholder ; this . range = range ; this . start = range . start ; this . end = range . end ; this . sameRow = range . start . row == range . end . row ; this . subFolds = this . ranges = [ ] ; } ; oop . inherits ( Fold , RangeList ) ; ( function ( ) { this . toString = function ( ) { return '"' + this . placeholder + '" ' + this . range . toString ( ) ; } ; this . setFoldLine = function ( foldLine ) { this . foldLine = foldLine ; this . subFolds . forEach ( function ( fold ) { fold . setFoldLine ( foldLine ) ; } ) ; } ; this . clone = function ( ) { var range = this . range . clone ( ) ; var fold = new Fold ( range , this . placeholder ) ; this . subFolds . forEach ( function ( subFold ) { fold . subFolds . push ( subFold . clone ( ) ) ; } ) ; fold . collapseChildren = this . collapseChildren ; return fold ; } ; this . addSubFold = function ( fold ) { if ( this . range . isEqual ( fold ) )
return ; if ( ! this . range . containsRange ( fold ) )
throw new Error ( "A fold can't intersect already existing fold" + fold . range + this . range ) ; consumeRange ( fold , this . start ) ; var row = fold . start . row , column = fold . start . column ; for ( var i = 0 , cmp = - 1 ; i < this . subFolds . length ; i ++ ) { cmp = this . subFolds [ i ] . range . compare ( row , column ) ; if ( cmp != 1 )
break ; }
var afterStart = this . subFolds [ i ] ; if ( cmp == 0 )
return afterStart . addSubFold ( fold ) ; var row = fold . range . end . row , column = fold . range . end . column ; for ( var j = i , cmp = - 1 ; j < this . subFolds . length ; j ++ ) { cmp = this . subFolds [ j ] . range . compare ( row , column ) ; if ( cmp != 1 )
break ; }
var afterEnd = this . subFolds [ j ] ; if ( cmp == 0 )
throw new Error ( "A fold can't intersect already existing fold" + fold . range + this . range ) ; var consumedFolds = this . subFolds . splice ( i , j - i , fold ) ; fold . setFoldLine ( this . foldLine ) ; return fold ; } ; this . restoreRange = function ( range ) { return restoreRange ( range , this . start ) ; } ; } ) . call ( Fold . prototype ) ; function consumePoint ( point , anchor ) { point . row -= anchor . row ; if ( point . row == 0 )
point . column -= anchor . column ; }
function consumeRange ( range , anchor ) { consumePoint ( range . start , anchor ) ; consumePoint ( range . end , anchor ) ; }
function restorePoint ( point , anchor ) { if ( point . row == 0 )
point . column += anchor . column ; point . row += anchor . row ; }
function restoreRange ( range , anchor ) { restorePoint ( range . start , anchor ) ; restorePoint ( range . end , anchor ) ; } } ) ; define ( 'ace/range_list' , [ 'require' , 'exports' , 'module' , 'ace/range' ] , function ( require , exports , module ) { var Range = require ( "./range" ) . Range ; var comparePoints = Range . comparePoints ; var RangeList = function ( ) { this . ranges = [ ] ; } ; ( function ( ) { this . comparePoints = comparePoints ; this . pointIndex = function ( pos , excludeEdges , startIndex ) { var list = this . ranges ; for ( var i = startIndex || 0 ; i < list . length ; i ++ ) { var range = list [ i ] ; var cmpEnd = comparePoints ( pos , range . end ) ; if ( cmpEnd > 0 )
continue ; var cmpStart = comparePoints ( pos , range . start ) ; if ( cmpEnd === 0 )
return excludeEdges && cmpStart !== 0 ? - i - 2 : i ; if ( cmpStart > 0 || ( cmpStart === 0 && ! excludeEdges ) )
return i ; return - i - 1 ; }
return - i - 1 ; } ; this . add = function ( range ) { var excludeEdges = ! range . isEmpty ( ) ; var startIndex = this . pointIndex ( range . start , excludeEdges ) ; if ( startIndex < 0 )
startIndex = - startIndex - 1 ; var endIndex = this . pointIndex ( range . end , excludeEdges , startIndex ) ; if ( endIndex < 0 )
endIndex = - endIndex - 1 ; else
endIndex ++ ; return this . ranges . splice ( startIndex , endIndex - startIndex , range ) ; } ; this . addList = function ( list ) { var removed = [ ] ; for ( var i = list . length ; i -- ; ) { removed . push . call ( removed , this . add ( list [ i ] ) ) ; }
return removed ; } ; this . substractPoint = function ( pos ) { var i = this . pointIndex ( pos ) ; if ( i >= 0 )
return this . ranges . splice ( i , 1 ) ; } ; this . merge = function ( ) { var removed = [ ] ; var list = this . ranges ; list = list . sort ( function ( a , b ) { return comparePoints ( a . start , b . start ) ; } ) ; var next = list [ 0 ] , range ; for ( var i = 1 ; i < list . length ; i ++ ) { range = next ; next = list [ i ] ; var cmp = comparePoints ( range . end , next . start ) ; if ( cmp < 0 )
continue ; if ( cmp == 0 && ! range . isEmpty ( ) && ! next . isEmpty ( ) )
continue ; if ( comparePoints ( range . end , next . end ) < 0 ) { range . end . row = next . end . row ; range . end . column = next . end . column ; }
list . splice ( i , 1 ) ; removed . push ( next ) ; next = range ; i -- ; }
this . ranges = list ; return removed ; } ; this . contains = function ( row , column ) { return this . pointIndex ( { row : row , column : column } ) >= 0 ; } ; this . containsPoint = function ( pos ) { return this . pointIndex ( pos ) >= 0 ; } ; this . rangeAtPoint = function ( pos ) { var i = this . pointIndex ( pos ) ; if ( i >= 0 )
return this . ranges [ i ] ; } ; this . clipRows = function ( startRow , endRow ) { var list = this . ranges ; if ( list [ 0 ] . start . row > endRow || list [ list . length - 1 ] . start . row < startRow )
return [ ] ; var startIndex = this . pointIndex ( { row : startRow , column : 0 } ) ; if ( startIndex < 0 )
startIndex = - startIndex - 1 ; var endIndex = this . pointIndex ( { row : endRow , column : 0 } , startIndex ) ; if ( endIndex < 0 )
endIndex = - endIndex - 1 ; var clipped = [ ] ; for ( var i = startIndex ; i < endIndex ; i ++ ) { clipped . push ( list [ i ] ) ; }
return clipped ; } ; this . removeAll = function ( ) { return this . ranges . splice ( 0 , this . ranges . length ) ; } ; this . attach = function ( session ) { if ( this . session )
this . detach ( ) ; this . session = session ; this . onChange = this . $onChange . bind ( this ) ; this . session . on ( 'change' , this . onChange ) ; } ; this . detach = function ( ) { if ( ! this . session )
return ; this . session . removeListener ( 'change' , this . onChange ) ; this . session = null ; } ; this . $onChange = function ( e ) { var changeRange = e . data . range ; if ( e . data . action [ 0 ] == "i" ) { var start = changeRange . start ; var end = changeRange . end ; } else { var end = changeRange . start ; var start = changeRange . end ; }
var startRow = start . row ; var endRow = end . row ; var lineDif = endRow - startRow ; var colDiff = - start . column + end . column ; var ranges = this . ranges ; for ( var i = 0 , n = ranges . length ; i < n ; i ++ ) { var r = ranges [ i ] ; if ( r . end . row < startRow )
continue ; if ( r . start . row > startRow )
break ; if ( r . start . row == startRow && r . start . column >= start . column ) { if ( r . start . column == start . column && this . $insertRight ) { } else { r . start . column += colDiff ; r . start . row += lineDif ; } }
if ( r . end . row == startRow && r . end . column >= start . column ) { if ( r . end . column == start . column && this . $insertRight ) { continue ; }
if ( r . end . column == start . column && colDiff > 0 && i < n - 1 ) { if ( r . end . column > r . start . column && r . end . column == ranges [ i + 1 ] . start . column )
r . end . column -= colDiff ; }
r . end . column += colDiff ; r . end . row += lineDif ; } }
if ( lineDif != 0 && i < n ) { for ( ; i < n ; i ++ ) { var r = ranges [ i ] ; r . start . row += lineDif ; r . end . row += lineDif ; } } } ; } ) . call ( RangeList . prototype ) ; exports . RangeList = RangeList ; } ) ; define ( 'ace/edit_session/bracket_match' , [ 'require' , 'exports' , 'module' , 'ace/token_iterator' , 'ace/range' ] , function ( require , exports , module ) { var TokenIterator = require ( "../token_iterator" ) . TokenIterator ; var Range = require ( "../range" ) . Range ; function BracketMatch ( ) { this . findMatchingBracket = function ( position , chr ) { if ( position . column == 0 ) return null ; var charBeforeCursor = chr || this . getLine ( position . row ) . charAt ( position . column - 1 ) ; if ( charBeforeCursor == "" ) return null ; var match = charBeforeCursor . match ( /([\(\[\{])|([\)\]\}])/ ) ; if ( ! match )
return null ; if ( match [ 1 ] )
return this . $findClosingBracket ( match [ 1 ] , position ) ; else
return this . $findOpeningBracket ( match [ 2 ] , position ) ; } ; this . getBracketRange = function ( pos ) { var line = this . getLine ( pos . row ) ; var before = true , range ; var chr = line . charAt ( pos . column - 1 ) ; var match = chr && chr . match ( /([\(\[\{])|([\)\]\}])/ ) ; if ( ! match ) { chr = line . charAt ( pos . column ) ; pos = { row : pos . row , column : pos . column + 1 } ; match = chr && chr . match ( /([\(\[\{])|([\)\]\}])/ ) ; before = false ; }
if ( ! match )
return null ; if ( match [ 1 ] ) { var bracketPos = this . $findClosingBracket ( match [ 1 ] , pos ) ; if ( ! bracketPos )
return null ; range = Range . fromPoints ( pos , bracketPos ) ; if ( ! before ) { range . end . column ++ ; range . start . column -- ; }
range . cursor = range . end ; } else { var bracketPos = this . $findOpeningBracket ( match [ 2 ] , pos ) ; if ( ! bracketPos )
return null ; range = Range . fromPoints ( bracketPos , pos ) ; if ( ! before ) { range . start . column ++ ; range . end . column -- ; }
range . cursor = range . start ; }
return range ; } ; this . $brackets = { ")" : "(" , "(" : ")" , "]" : "[" , "[" : "]" , "{" : "}" , "}" : "{" } ; this . $findOpeningBracket = function ( bracket , position , typeRe ) { var openBracket = this . $brackets [ bracket ] ; var depth = 1 ; var iterator = new TokenIterator ( this , position . row , position . column ) ; var token = iterator . getCurrentToken ( ) ; if ( ! token )
token = iterator . stepForward ( ) ; if ( ! token )
return ; if ( ! typeRe ) { typeRe = new RegExp ( "(\\.?" + token . type . replace ( "." , "\\." ) . replace ( "rparen" , ".paren" ) + ")+" ) ; }
var valueIndex = position . column - iterator . getCurrentTokenColumn ( ) - 2 ; var value = token . value ; while ( true ) { while ( valueIndex >= 0 ) { var chr = value . charAt ( valueIndex ) ; if ( chr == openBracket ) { depth -= 1 ; if ( depth == 0 ) { return { row : iterator . getCurrentTokenRow ( ) , column : valueIndex + iterator . getCurrentTokenColumn ( ) } ; } }
else if ( chr == bracket ) { depth += 1 ; }
valueIndex -= 1 ; }
do { token = iterator . stepBackward ( ) ; } while ( token && ! typeRe . test ( token . type ) ) ; if ( token == null )
break ; value = token . value ; valueIndex = value . length - 1 ; }
return null ; } ; this . $findClosingBracket = function ( bracket , position , typeRe ) { var closingBracket = this . $brackets [ bracket ] ; var depth = 1 ; var iterator = new TokenIterator ( this , position . row , position . column ) ; var token = iterator . getCurrentToken ( ) ; if ( ! token )
token = iterator . stepForward ( ) ; if ( ! token )
return ; if ( ! typeRe ) { typeRe = new RegExp ( "(\\.?" + token . type . replace ( "." , "\\." ) . replace ( "lparen" , ".paren" ) + ")+" ) ; }
var valueIndex = position . column - iterator . getCurrentTokenColumn ( ) ; while ( true ) { var value = token . value ; var valueLength = value . length ; while ( valueIndex < valueLength ) { var chr = value . charAt ( valueIndex ) ; if ( chr == closingBracket ) { depth -= 1 ; if ( depth == 0 ) { return { row : iterator . getCurrentTokenRow ( ) , column : valueIndex + iterator . getCurrentTokenColumn ( ) } ; } }
else if ( chr == bracket ) { depth += 1 ; }
valueIndex += 1 ; }
do { token = iterator . stepForward ( ) ; } while ( token && ! typeRe . test ( token . type ) ) ; if ( token == null )
break ; valueIndex = 0 ; }
return null ; } ; }
exports . BracketMatch = BracketMatch ; } ) ; define ( 'ace/search' , [ 'require' , 'exports' , 'module' , 'ace/lib/lang' , 'ace/lib/oop' , 'ace/range' ] , function ( require , exports , module ) { var lang = require ( "./lib/lang" ) ; var oop = require ( "./lib/oop" ) ; var Range = require ( "./range" ) . Range ; var Search = function ( ) { this . $options = { } ; } ; ( function ( ) { this . set = function ( options ) { oop . mixin ( this . $options , options ) ; return this ; } ; this . getOptions = function ( ) { return lang . copyObject ( this . $options ) ; } ; this . setOptions = function ( options ) { this . $options = options ; } ; this . find = function ( session ) { var iterator = this . $matchIterator ( session , this . $options ) ; if ( ! iterator )
return false ; var firstRange = null ; iterator . forEach ( function ( range , row , offset ) { if ( ! range . start ) { var column = range . offset + ( offset || 0 ) ; firstRange = new Range ( row , column , row , column + range . length ) ; } else
firstRange = range ; return true ; } ) ; return firstRange ; } ; this . findAll = function ( session ) { var options = this . $options ; if ( ! options . needle )
return [ ] ; this . $assembleRegExp ( options ) ; var range = options . range ; var lines = range ? session . getLines ( range . start . row , range . end . row ) : session . doc . getAllLines ( ) ; var ranges = [ ] ; var re = options . re ; if ( options . $isMultiLine ) { var len = re . length ; var maxRow = lines . length - len ; for ( var row = re . offset || 0 ; row <= maxRow ; row ++ ) { for ( var j = 0 ; j < len ; j ++ )
if ( lines [ row + j ] . search ( re [ j ] ) == - 1 )
break ; var startLine = lines [ row ] ; var line = lines [ row + len - 1 ] ; var startIndex = startLine . match ( re [ 0 ] ) [ 0 ] . length ; var endIndex = line . match ( re [ len - 1 ] ) [ 0 ] . length ; ranges . push ( new Range ( row , startLine . length - startIndex , row + len - 1 , endIndex ) ) ; } } else { for ( var i = 0 ; i < lines . length ; i ++ ) { var matches = lang . getMatchOffsets ( lines [ i ] , re ) ; for ( var j = 0 ; j < matches . length ; j ++ ) { var match = matches [ j ] ; ranges . push ( new Range ( i , match . offset , i , match . offset + match . length ) ) ; } } }
if ( range ) { var startColumn = range . start . column ; var endColumn = range . start . column ; var i = 0 , j = ranges . length - 1 ; while ( i < j && ranges [ i ] . start . column < startColumn && ranges [ i ] . start . row == range . start . row )
i ++ ; while ( i < j && ranges [ j ] . end . column > endColumn && ranges [ j ] . end . row == range . end . row )
j -- ; ranges = ranges . slice ( i , j + 1 ) ; for ( i = 0 , j = ranges . length ; i < j ; i ++ ) { ranges [ i ] . start . row += range . start . row ; ranges [ i ] . end . row += range . start . row ; } }
return ranges ; } ; this . replace = function ( input , replacement ) { var options = this . $options ; var re = this . $assembleRegExp ( options ) ; if ( options . $isMultiLine )
return replacement ; if ( ! re )
return ; var match = re . exec ( input ) ; if ( ! match || match [ 0 ] . length != input . length )
return null ; replacement = input . replace ( re , replacement ) ; if ( options . preserveCase ) { replacement = replacement . split ( "" ) ; for ( var i = Math . min ( input . length , input . length ) ; i -- ; ) { var ch = input [ i ] ; if ( ch && ch . toLowerCase ( ) != ch )
replacement [ i ] = replacement [ i ] . toUpperCase ( ) ; else
replacement [ i ] = replacement [ i ] . toLowerCase ( ) ; }
replacement = replacement . join ( "" ) ; }
return replacement ; } ; this . $matchIterator = function ( session , options ) { var re = this . $assembleRegExp ( options ) ; if ( ! re )
return false ; var self = this , callback , backwards = options . backwards ; if ( options . $isMultiLine ) { var len = re . length ; var matchIterator = function ( line , row , offset ) { var startIndex = line . search ( re [ 0 ] ) ; if ( startIndex == - 1 )
return ; for ( var i = 1 ; i < len ; i ++ ) { line = session . getLine ( row + i ) ; if ( line . search ( re [ i ] ) == - 1 )
return ; }
var endIndex = line . match ( re [ len - 1 ] ) [ 0 ] . length ; var range = new Range ( row , startIndex , row + len - 1 , endIndex ) ; if ( re . offset == 1 ) { range . start . row -- ; range . start . column = Number . MAX _VALUE ; } else if ( offset )
range . start . column += offset ; if ( callback ( range ) )
return true ; } ; } else if ( backwards ) { var matchIterator = function ( line , row , startIndex ) { var matches = lang . getMatchOffsets ( line , re ) ; for ( var i = matches . length - 1 ; i >= 0 ; i -- )
if ( callback ( matches [ i ] , row , startIndex ) )
return true ; } ; } else { var matchIterator = function ( line , row , startIndex ) { var matches = lang . getMatchOffsets ( line , re ) ; for ( var i = 0 ; i < matches . length ; i ++ )
if ( callback ( matches [ i ] , row , startIndex ) )
return true ; } ; }
return { forEach : function ( _callback ) { callback = _callback ; self . $lineIterator ( session , options ) . forEach ( matchIterator ) ; } } ; } ; this . $assembleRegExp = function ( options , $disableFakeMultiline ) { if ( options . needle instanceof RegExp )
return options . re = options . needle ; var needle = options . needle ; if ( ! options . needle )
return options . re = false ; if ( ! options . regExp )
needle = lang . escapeRegExp ( needle ) ; if ( options . wholeWord )
needle = "\\b" + needle + "\\b" ; var modifier = options . caseSensitive ? "g" : "gi" ; options . $isMultiLine = ! $disableFakeMultiline && /[\n\r]/ . test ( needle ) ; if ( options . $isMultiLine )
return options . re = this . $assembleMultilineRegExp ( needle , modifier ) ; try { var re = new RegExp ( needle , modifier ) ; } catch ( e ) { re = false ; }
return options . re = re ; } ; this . $assembleMultilineRegExp = function ( needle , modifier ) { var parts = needle . replace ( /\r\n|\r|\n/g , "$\n^" ) . split ( "\n" ) ; var re = [ ] ; for ( var i = 0 ; i < parts . length ; i ++ ) try { re . push ( new RegExp ( parts [ i ] , modifier ) ) ; } catch ( e ) { return false ; }
if ( parts [ 0 ] == "" ) { re . shift ( ) ; re . offset = 1 ; } else { re . offset = 0 ; }
return re ; } ; this . $lineIterator = function ( session , options ) { var backwards = options . backwards == true ; var skipCurrent = options . skipCurrent != false ; var range = options . range ; var start = options . start ; if ( ! start )
start = range ? range [ backwards ? "end" : "start" ] : session . selection . getRange ( ) ; if ( start . start )
start = start [ skipCurrent != backwards ? "end" : "start" ] ; var firstRow = range ? range . start . row : 0 ; var lastRow = range ? range . end . row : session . getLength ( ) - 1 ; var forEach = backwards ? function ( callback ) { var row = start . row ; var line = session . getLine ( row ) . substring ( 0 , start . column ) ; if ( callback ( line , row ) )
return ; for ( row -- ; row >= firstRow ; row -- )
if ( callback ( session . getLine ( row ) , row ) )
return ; if ( options . wrap == false )
return ; for ( row = lastRow , firstRow = start . row ; row >= firstRow ; row -- )
if ( callback ( session . getLine ( row ) , row ) )
return ; } : function ( callback ) { var row = start . row ; var line = session . getLine ( row ) . substr ( start . column ) ; if ( callback ( line , row , start . column ) )
return ; for ( row = row + 1 ; row <= lastRow ; row ++ )
if ( callback ( session . getLine ( row ) , row ) )
return ; if ( options . wrap == false )
return ; for ( row = firstRow , lastRow = start . row ; row <= lastRow ; row ++ )
if ( callback ( session . getLine ( row ) , row ) )
return ; } ; return { forEach : forEach } ; } ; } ) . call ( Search . prototype ) ; exports . Search = Search ; } ) ; define ( 'ace/commands/command_manager' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/keyboard/hash_handler' , 'ace/lib/event_emitter' ] , function ( require , exports , module ) { var oop = require ( "../lib/oop" ) ; var HashHandler = require ( "../keyboard/hash_handler" ) . HashHandler ; var EventEmitter = require ( "../lib/event_emitter" ) . EventEmitter ; var CommandManager = function ( platform , commands ) { HashHandler . call ( this , commands , platform ) ; this . byName = this . commands ; this . setDefaultHandler ( "exec" , function ( e ) { return e . command . exec ( e . editor , e . args || { } ) ; } ) ; } ; oop . inherits ( CommandManager , HashHandler ) ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . exec = function ( command , editor , args ) { if ( typeof command === 'string' )
command = this . commands [ command ] ; if ( ! command )
return false ; if ( editor && editor . $readOnly && ! command . readOnly )
return false ; var e = { editor : editor , command : command , args : args } ; var retvalue = this . _emit ( "exec" , e ) ; this . _signal ( "afterExec" , e ) ; return retvalue === false ? false : true ; } ; this . toggleRecording = function ( editor ) { if ( this . $inReplay )
return ; editor && editor . _emit ( "changeStatus" ) ; if ( this . recording ) { this . macro . pop ( ) ; this . removeEventListener ( "exec" , this . $addCommandToMacro ) ; if ( ! this . macro . length )
this . macro = this . oldMacro ; return this . recording = false ; }
if ( ! this . $addCommandToMacro ) { this . $addCommandToMacro = function ( e ) { this . macro . push ( [ e . command , e . args ] ) ; } . bind ( this ) ; }
this . oldMacro = this . macro ; this . macro = [ ] ; this . on ( "exec" , this . $addCommandToMacro ) ; return this . recording = true ; } ; this . replay = function ( editor ) { if ( this . $inReplay || ! this . macro )
return ; if ( this . recording )
return this . toggleRecording ( editor ) ; try { this . $inReplay = true ; this . macro . forEach ( function ( x ) { if ( typeof x == "string" )
this . exec ( x , editor ) ; else
this . exec ( x [ 0 ] , editor , x [ 1 ] ) ; } , this ) ; } finally { this . $inReplay = false ; } } ; this . trimMacro = function ( m ) { return m . map ( function ( x ) { if ( typeof x [ 0 ] != "string" )
x [ 0 ] = x [ 0 ] . name ; if ( ! x [ 1 ] )
x = x [ 0 ] ; return x ; } ) ; } ; } ) . call ( CommandManager . prototype ) ; exports . CommandManager = CommandManager ; } ) ; define ( 'ace/keyboard/hash_handler' , [ 'require' , 'exports' , 'module' , 'ace/lib/keys' , 'ace/lib/useragent' ] , function ( require , exports , module ) { var keyUtil = require ( "../lib/keys" ) ; var useragent = require ( "../lib/useragent" ) ; function HashHandler ( config , platform ) { this . platform = platform || ( useragent . isMac ? "mac" : "win" ) ; this . commands = { } ; this . commandKeyBinding = { } ; if ( this . _ _defineGetter _ _ && this . _ _defineSetter _ _ && typeof console != "undefined" && console . error ) { var warned = false ; var warn = function ( ) { if ( ! warned ) { warned = true ; console . error ( "commmandKeyBinding has too many m's. use commandKeyBinding" ) ; } } ; this . _ _defineGetter _ _ ( "commmandKeyBinding" , function ( ) { warn ( ) ; return this . commandKeyBinding ; } ) ; this . _ _defineSetter _ _ ( "commmandKeyBinding" , function ( val ) { warn ( ) ; return this . commandKeyBinding = val ; } ) ; } else { this . commmandKeyBinding = this . commandKeyBinding ; }
this . addCommands ( config ) ; } ; ( function ( ) { this . addCommand = function ( command ) { if ( this . commands [ command . name ] )
this . removeCommand ( command ) ; this . commands [ command . name ] = command ; if ( command . bindKey )
this . _buildKeyHash ( command ) ; } ; this . removeCommand = function ( command ) { var name = ( typeof command === 'string' ? command : command . name ) ; command = this . commands [ name ] ; delete this . commands [ name ] ; var ckb = this . commandKeyBinding ; for ( var hashId in ckb ) { for ( var key in ckb [ hashId ] ) { if ( ckb [ hashId ] [ key ] == command )
delete ckb [ hashId ] [ key ] ; } } } ; this . bindKey = function ( key , command ) { if ( ! key )
return ; if ( typeof command == "function" ) { this . addCommand ( { exec : command , bindKey : key , name : command . name || key } ) ; return ; }
var ckb = this . commandKeyBinding ; key . split ( "|" ) . forEach ( function ( keyPart ) { var binding = this . parseKeys ( keyPart , command ) ; var hashId = binding . hashId ; ( ckb [ hashId ] || ( ckb [ hashId ] = { } ) ) [ binding . key ] = command ; } , this ) ; } ; this . addCommands = function ( commands ) { commands && Object . keys ( commands ) . forEach ( function ( name ) { var command = commands [ name ] ; if ( ! command )
return ; if ( typeof command === "string" )
return this . bindKey ( command , name ) ; if ( typeof command === "function" )
command = { exec : command } ; if ( ! command . name )
command . name = name ; this . addCommand ( command ) ; } , this ) ; } ; this . removeCommands = function ( commands ) { Object . keys ( commands ) . forEach ( function ( name ) { this . removeCommand ( commands [ name ] ) ; } , this ) ; } ; this . bindKeys = function ( keyList ) { Object . keys ( keyList ) . forEach ( function ( key ) { this . bindKey ( key , keyList [ key ] ) ; } , this ) ; } ; this . _buildKeyHash = function ( command ) { var binding = command . bindKey ; if ( ! binding )
return ; var key = typeof binding == "string" ? binding : binding [ this . platform ] ; this . bindKey ( key , command ) ; } ; this . parseKeys = function ( keys ) { if ( keys . indexOf ( " " ) != - 1 )
keys = keys . split ( /\s+/ ) . pop ( ) ; var parts = keys . toLowerCase ( ) . split ( /[\-\+]([\-\+])?/ ) . filter ( function ( x ) { return x } ) ; var key = parts . pop ( ) ; var keyCode = keyUtil [ key ] ; if ( keyUtil . FUNCTION _KEYS [ keyCode ] )
key = keyUtil . FUNCTION _KEYS [ keyCode ] . toLowerCase ( ) ; else if ( ! parts . length )
return { key : key , hashId : - 1 } ; else if ( parts . length == 1 && parts [ 0 ] == "shift" )
return { key : key . toUpperCase ( ) , hashId : - 1 } ; var hashId = 0 ; for ( var i = parts . length ; i -- ; ) { var modifier = keyUtil . KEY _MODS [ parts [ i ] ] ; if ( modifier == null ) { if ( typeof console != "undefined" )
console . error ( "invalid modifier " + parts [ i ] + " in " + keys ) ; return false ; }
hashId |= modifier ; }
return { key : key , hashId : hashId } ; } ; this . findKeyCommand = function findKeyCommand ( hashId , keyString ) { var ckbr = this . commandKeyBinding ; return ckbr [ hashId ] && ckbr [ hashId ] [ keyString ] ; } ; this . handleKeyboard = function ( data , hashId , keyString , keyCode ) { return { command : this . findKeyCommand ( hashId , keyString ) } ; } ; } ) . call ( HashHandler . prototype )
exports . HashHandler = HashHandler ; } ) ; define ( 'ace/commands/default_commands' , [ 'require' , 'exports' , 'module' , 'ace/lib/lang' , 'ace/config' ] , function ( require , exports , module ) { var lang = require ( "../lib/lang" ) ; var config = require ( "../config" ) ; function bindKey ( win , mac ) { return { win : win , mac : mac } ; }
exports . commands = [ { name : "showSettingsMenu" , bindKey : bindKey ( "Ctrl-," , "Command-," ) , exec : function ( editor ) { config . loadModule ( "ace/ext/settings_menu" , function ( module ) { module . init ( editor ) ; editor . showSettingsMenu ( ) ; } ) ; } , readOnly : true } , { name : "selectall" , bindKey : bindKey ( "Ctrl-A" , "Command-A" ) , exec : function ( editor ) { editor . selectAll ( ) ; } , readOnly : true } , { name : "centerselection" , bindKey : bindKey ( null , "Ctrl-L" ) , exec : function ( editor ) { editor . centerSelection ( ) ; } , readOnly : true } , { name : "gotoline" , bindKey : bindKey ( "Ctrl-L" , "Command-L" ) , exec : function ( editor ) { var line = parseInt ( prompt ( "Enter line number:" ) , 10 ) ; if ( ! isNaN ( line ) ) { editor . gotoLine ( line ) ; } } , readOnly : true } , { name : "fold" , bindKey : bindKey ( "Alt-L|Ctrl-F1" , "Command-Alt-L|Command-F1" ) , exec : function ( editor ) { editor . session . toggleFold ( false ) ; } , readOnly : true } , { name : "unfold" , bindKey : bindKey ( "Alt-Shift-L|Ctrl-Shift-F1" , "Command-Alt-Shift-L|Command-Shift-F1" ) , exec : function ( editor ) { editor . session . toggleFold ( true ) ; } , readOnly : true } , { name : "foldall" , bindKey : bindKey ( "Alt-0" , "Command-Option-0" ) , exec : function ( editor ) { editor . session . foldAll ( ) ; } , readOnly : true } , { name : "unfoldall" , bindKey : bindKey ( "Alt-Shift-0" , "Command-Option-Shift-0" ) , exec : function ( editor ) { editor . session . unfold ( ) ; } , readOnly : true } , { name : "findnext" , bindKey : bindKey ( "Ctrl-K" , "Command-G" ) , exec : function ( editor ) { editor . findNext ( ) ; } , readOnly : true } , { name : "findprevious" , bindKey : bindKey ( "Ctrl-Shift-K" , "Command-Shift-G" ) , exec : function ( editor ) { editor . findPrevious ( ) ; } , readOnly : true } , { name : "find" , bindKey : bindKey ( "Ctrl-F" , "Command-F" ) , exec : function ( editor ) { config . loadModule ( "ace/ext/searchbox" , function ( e ) { e . Search ( editor ) } ) ; } , readOnly : true } , { name : "overwrite" , bindKey : "Insert" , exec : function ( editor ) { editor . toggleOverwrite ( ) ; } , readOnly : true } , { name : "selecttostart" , bindKey : bindKey ( "Ctrl-Shift-Home" , "Command-Shift-Up" ) , exec : function ( editor ) { editor . getSelection ( ) . selectFileStart ( ) ; } , multiSelectAction : "forEach" , readOnly : true , group : "fileJump" } , { name : "gotostart" , bindKey : bindKey ( "Ctrl-Home" , "Command-Home|Command-Up" ) , exec : function ( editor ) { editor . navigateFileStart ( ) ; } , multiSelectAction : "forEach" , readOnly : true , group : "fileJump" } , { name : "selectup" , bindKey : bindKey ( "Shift-Up" , "Shift-Up" ) , exec : function ( editor ) { editor . getSelection ( ) . selectUp ( ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "golineup" , bindKey : bindKey ( "Up" , "Up|Ctrl-P" ) , exec : function ( editor , args ) { editor . navigateUp ( args . times ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "selecttoend" , bindKey : bindKey ( "Ctrl-Shift-End" , "Command-Shift-Down" ) , exec : function ( editor ) { editor . getSelection ( ) . selectFileEnd ( ) ; } , multiSelectAction : "forEach" , readOnly : true , group : "fileJump" } , { name : "gotoend" , bindKey : bindKey ( "Ctrl-End" , "Command-End|Command-Down" ) , exec : function ( editor ) { editor . navigateFileEnd ( ) ; } , multiSelectAction : "forEach" , readOnly : true , group : "fileJump" } , { name : "selectdown" , bindKey : bindKey ( "Shift-Down" , "Shift-Down" ) , exec : function ( editor ) { editor . getSelection ( ) . selectDown ( ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "golinedown" , bindKey : bindKey ( "Down" , "Down|Ctrl-N" ) , exec : function ( editor , args ) { editor . navigateDown ( args . times ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "selectwordleft" , bindKey : bindKey ( "Ctrl-Shift-Left" , "Option-Shift-Left" ) , exec : function ( editor ) { editor . getSelection ( ) . selectWordLeft ( ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "gotowordleft" , bindKey : bindKey ( "Ctrl-Left" , "Option-Left" ) , exec : function ( editor ) { editor . navigateWordLeft ( ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "selecttolinestart" , bindKey : bindKey ( "Alt-Shift-Left" , "Command-Shift-Left" ) , exec : function ( editor ) { editor . getSelection ( ) . selectLineStart ( ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "gotolinestart" , bindKey : bindKey ( "Alt-Left|Home" , "Command-Left|Home|Ctrl-A" ) , exec : function ( editor ) { editor . navigateLineStart ( ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "selectleft" , bindKey : bindKey ( "Shift-Left" , "Shift-Left" ) , exec : function ( editor ) { editor . getSelection ( ) . selectLeft ( ) ; } , multiSelectAction : "forEach" , readOnly : true } , { name : "gotoleft" , bindKey : bindKey ( "Left" , "Left|Ctrl-B" ) , exec : function ( editor , args ) { editor . navigateLeft ( args .
this . $undoStack . push ( deltas ) ; this . $redoStack = [ ] ; if ( this . dirtyCounter < 0 ) { this . dirtyCounter = NaN ; }
this . dirtyCounter ++ ; } ; this . undo = function ( dontSelect ) { var deltas = this . $undoStack . pop ( ) ; var undoSelectionRange = null ; if ( deltas ) { undoSelectionRange = this . $doc . undoChanges ( deltas , dontSelect ) ; this . $redoStack . push ( deltas ) ; this . dirtyCounter -- ; }
return undoSelectionRange ; } ; this . redo = function ( dontSelect ) { var deltas = this . $redoStack . pop ( ) ; var redoSelectionRange = null ; if ( deltas ) { redoSelectionRange = this . $doc . redoChanges ( deltas , dontSelect ) ; this . $undoStack . push ( deltas ) ; this . dirtyCounter ++ ; }
return redoSelectionRange ; } ; this . reset = function ( ) { this . $undoStack = [ ] ; this . $redoStack = [ ] ; this . dirtyCounter = 0 ; } ; this . hasUndo = function ( ) { return this . $undoStack . length > 0 ; } ; this . hasRedo = function ( ) { return this . $redoStack . length > 0 ; } ; this . markClean = function ( ) { this . dirtyCounter = 0 ; } ; this . isClean = function ( ) { return this . dirtyCounter === 0 ; } ; } ) . call ( UndoManager . prototype ) ; exports . UndoManager = UndoManager ; } ) ; define ( 'ace/virtual_renderer' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/dom' , 'ace/lib/useragent' , 'ace/config' , 'ace/layer/gutter' , 'ace/layer/marker' , 'ace/layer/text' , 'ace/layer/cursor' , 'ace/scrollbar' , 'ace/renderloop' , 'ace/lib/event_emitter' ] , function ( require , exports , module ) { var oop = require ( "./lib/oop" ) ; var dom = require ( "./lib/dom" ) ; var useragent = require ( "./lib/useragent" ) ; var config = require ( "./config" ) ; var GutterLayer = require ( "./layer/gutter" ) . Gutter ; var MarkerLayer = require ( "./layer/marker" ) . Marker ; var TextLayer = require ( "./layer/text" ) . Text ; var CursorLayer = require ( "./layer/cursor" ) . Cursor ; var ScrollBarH = require ( "./scrollbar" ) . ScrollBarH ; var ScrollBarV = require ( "./scrollbar" ) . ScrollBarV ; var RenderLoop = require ( "./renderloop" ) . RenderLoop ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var editorCss = " . ace _editor { \
position : relative ; \
overflow : hidden ; \
font - family : 'Monaco' , 'Menlo' , 'Ubuntu Mono' , 'Consolas' , 'source-code-pro' , monospace ; \
font - size : 12 px ; \
line - height : normal ; \
color : black ; \
- ms - user - select : none ; \
- moz - user - select : none ; \
- webkit - user - select : none ; \
user - select : none ; \
} \
. ace _scroller { \
position : absolute ; \
overflow : hidden ; \
top : 0 ; \
bottom : 0 ; \
background - color : inherit ; \
} \
. ace _content { \
position : absolute ; \
- moz - box - sizing : border - box ; \
- webkit - box - sizing : border - box ; \
box - sizing : border - box ; \
cursor : text ; \
} \
. ace _dragging , . ace _dragging * { \
cursor : move ! important ; \
} \
. ace _dragging . ace _scroller : before { \
position : absolute ; \
top : 0 ; \
left : 0 ; \
right : 0 ; \
bottom : 0 ; \
content : '' ; \
background : rgba ( 250 , 250 , 250 , 0.01 ) ; \
z - index : 1000 ; \
} \
. ace _dragging . ace _dark . ace _scroller : before { \
background : rgba ( 0 , 0 , 0 , 0.01 ) ; \
} \
. ace _selecting , . ace _selecting * { \
cursor : text ! important ; \
} \
. ace _gutter { \
position : absolute ; \
overflow : hidden ; \
width : auto ; \
top : 0 ; \
bottom : 0 ; \
left : 0 ; \
cursor : default ; \
z - index : 4 ; \
} \
. ace _gutter - active - line { \
position : absolute ; \
left : 0 ; \
right : 0 ; \
} \
. ace _scroller . ace _scroll - left { \
box - shadow : 17 px 0 16 px - 16 px rgba ( 0 , 0 , 0 , 0.4 ) inset ; \
} \
. ace _gutter - cell { \
padding - left : 19 px ; \
padding - right : 6 px ; \
background - repeat : no - repeat ; \
} \
. ace _gutter - cell . ace _error { \
background - image : url ( \ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=\" ) ; \
background - repeat : no - repeat ; \
background - position : 2 px center ; \
} \
. ace _gutter - cell . ace _warning { \
background - image : url ( \ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==\" ) ; \
background - position : 2 px center ; \
} \
. ace _gutter - cell . ace _info { \
background - image : url ( \ "data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\" ) ; \
background - position : 2 px center ; \
} \
. ace _dark . ace _gutter - cell . ace _info { \
background - image : url ( \ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=\" ) ; \
} \
. ace _scrollbar { \
position : absolute ; \
overflow - x : hidden ; \
overflow - y : auto ; \
right : 0 ; \
top : 0 ; \
bottom : 0 ; \
z - index : 6 ; \
} \
. ace _scrollbar - inner { \
position : absolute ; \
cursor : text ; \
left : 0 ; \
top : 0 ; \
} \
. ace _scrollbar - h { \
position : absolute ; \
overflow - x : auto ; \
overflow - y : hidden ; \
right : 0 ; \
left : 0 ; \
bottom : 0 ; \
z - index : 6 ; \
} \
. ace _print - margin { \
position : absolute ; \
height : 100 % ; \
} \
. ace _text - input { \
position : absolute ; \
z - index : 0 ; \
width : 0.5 em ; \
height : 1 em ; \
opacity : 0 ; \
background : transparent ; \
- moz - appearance : none ; \
appearance : none ; \
border : none ; \
resize : none ; \
outline : none ; \
overflow : hidden ; \
font : inherit ; \
padding : 0 1 px ; \
margin : 0 - 1 px ; \
text - indent : - 1 em ; \
} \
. ace _text - input . ace _composition { \
background : # f8f8f8 ; \
color : # 111 ; \
z - index : 1000 ; \
opacity : 1 ; \
text - indent : 0 ; \
} \
. ace _layer { \
z - index : 1 ; \
position : absolute ; \
overflow : hidden ; \
white - space : nowrap ; \
height : 100 % ; \
width : 100 % ; \
- moz - box - sizing : border - box ; \
- webkit - box - sizing : border - box ; \
box - sizing : border - box ; \
/ * s e t t i n g p o i n t e r - e v e n t s : a u t o ; o n n o d e u n d e r t h e m o u s e , w h i c h c h a n g e s \
during scroll , will break mouse wheel scrolling in Safari * / \
pointer - events : none ; \
} \
. ace _gutter - layer { \
position : relative ; \
width : auto ; \
text - align : right ; \
pointer - events : auto ; \
} \
. ace _text - layer { \
font : inherit ! important ; \
} \
. ace _cjk { \
display : inline - block ; \
text - align : center ; \
} \
. ace _cursor - layer { \
z - index : 4 ; \
} \
. ace _cursor { \
z - index : 4 ; \
position : absolute ; \
- moz - box - sizing : border - box ; \
- webkit - box - sizing : border - box ; \
box - sizing : border - box ; \
border - left : 2 px solid \
} \
. ace _slim - cursors . ace _cursor { \
border - left - width : 1 px ; \
} \
. ace _overwrite - cursors . ace _cursor { \
border - left - width : 0 px ; \
border - bottom : 1 px solid ; \
} \
. ace _hidden - cursors . ace _cursor { \
opacity : 0.2 ; \
} \
. ace _smooth - blinking . ace _cursor { \
- moz - transition : opacity 0.18 s ; \
- webkit - transition : opacity 0.18 s ; \
- o - transition : opacity 0.18 s ; \
- ms - transition : opacity 0.18 s ; \
transition : opacity 0.18 s ; \
} \
. ace _cursor [ style *= \ "opacity: 0\" ] { \
- ms - filter : \ "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\" ; \
} \
. ace _editor . ace _multiselect . ace _cursor { \
border - left - width : 1 px ; \
} \
. ace _line { \
white - space : nowrap ; \
} \
. ace _marker - layer . ace _step , . ace _marker - layer . ace _stack { \
position : absolute ; \
z - index : 3 ; \
} \
. ace _marker - layer . ace _selection { \
position : absolute ; \
z - index : 5 ; \
} \
. ace _marker - layer . ace _bracket { \
position : absolute ; \
z - index : 6 ; \
} \
. ace _marker - layer . ace _active - line { \
position : absolute ; \
z - index : 2 ; \
} \
. ace _marker - layer . ace _selected - word { \
position : absolute ; \
z - index : 4 ; \
- moz - box - sizing : border - box ; \
- webkit - box - sizing : border - box ; \
box - sizing : border - box ; \
} \
. ace _line . ace _fold { \
- moz - box - sizing : border - box ; \
- webkit - box - sizing : border - box ; \
box - sizing : border - box ; \
display : inline - block ; \
height : 11 px ; \
margin - top : - 2 px ; \
vertical - align : middle ; \
background - image : \
url ( \ "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\" ) , \
url ( \ "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\" ) ; \
background - repeat : no - repeat , repeat - x ; \
background - position : center center , top left ; \
color : transparent ; \
border : 1 px solid black ; \
- moz - border - radius : 2 px ; \
- webkit - border - radius : 2 px ; \
border - radius : 2 px ; \
cursor : pointer ; \
pointer - events : auto ; \
} \
. ace _dark . ace _fold { \
} \
. ace _fold : hover { \
background - image : \
url ( \ "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\" ) , \
url ( \ "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\" ) ; \
background - repeat : no - repeat , repeat - x ; \
background - position : center center , top left ; \
} \
. ace _gutter - tooltip { \
background - color : # FFF ; \
background - image : - webkit - linear - gradient ( top , transparent , rgba ( 0 , 0 , 0 , 0.1 ) ) ; \
background - image : linear - gradient ( to bottom , transparent , rgba ( 0 , 0 , 0 , 0.1 ) ) ; \
border : 1 px solid gray ; \
border - radius : 1 px ; \
box - shadow : 0 1 px 2 px rgba ( 0 , 0 , 0 , 0.3 ) ; \
color : black ; \
display : inline - block ; \
max - width : 500 px ; \
padding : 4 px ; \
position : fixed ; \
z - index : 999999 ; \
- moz - box - sizing : border - box ; \
- webkit - box - sizing : border - box ; \
box - sizing : border - box ; \
cursor : default ; \
white - space : pre - line ; \
word - wrap : break - word ; \
line - height : normal ; \
font - style : normal ; \
font - weight : normal ; \
letter - spacing : normal ; \
} \
. ace _folding - enabled > . ace _gutter - cell { \
padding - right : 13 px ; \
} \
. ace _fold - widget { \
- moz - box - sizing : border - box ; \
- webkit - box - sizing : border - box ; \
box - sizing : border - box ; \
margin : 0 - 12 px 0 1 px ; \
display : none ; \
width : 11 px ; \
vertical - align : top ; \
background - image : url ( \ "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\" ) ; \
background - repeat : no - repeat ; \
background - position : center ; \
border - radius : 3 px ; \
border : 1 px solid transparent ; \
cursor : pointer ; \
} \
. ace _folding - enabled . ace _fold - widget { \
display : inline - block ; \
} \
. ace _fold - widget . ace _end { \
background - image : url ( \ "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\" ) ; \
} \
. ace _fold - widget . ace _closed { \
background - image : url ( \ "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\" ) ; \
} \
. ace _fold - widget : hover { \
border : 1 px solid rgba ( 0 , 0 , 0 , 0.3 ) ; \
background - color : rgba ( 255 , 255 , 255 , 0.2 ) ; \
- moz - box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.7 ) ; \
- webkit - box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.7 ) ; \
box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.7 ) ; \
} \
. ace _fold - widget : active { \
border : 1 px solid rgba ( 0 , 0 , 0 , 0.4 ) ; \
background - color : rgba ( 0 , 0 , 0 , 0.05 ) ; \
- moz - box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.8 ) ; \
- webkit - box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.8 ) ; \
box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.8 ) ; \
} \
/ * * \
* Dark version for fold widgets \
* / \
. ace _dark . ace _fold - widget { \
background - image : url ( \ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\" ) ; \
} \
. ace _dark . ace _fold - widget . ace _end { \
background - image : url ( \ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\" ) ; \
} \
. ace _dark . ace _fold - widget . ace _closed { \
background - image : url ( \ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\" ) ; \
} \
. ace _dark . ace _fold - widget : hover { \
box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.2 ) ; \
background - color : rgba ( 255 , 255 , 255 , 0.1 ) ; \
} \
. ace _dark . ace _fold - widget : active { \
- moz - box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.2 ) ; \
- webkit - box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.2 ) ; \
box - shadow : 0 1 px 1 px rgba ( 255 , 255 , 255 , 0.2 ) ; \
} \
. ace _fold - widget . ace _invalid { \
background - color : # FFB4B4 ; \
border - color : # DE5555 ; \
} \
. ace _fade - fold - widgets . ace _fold - widget { \
- moz - transition : opacity 0.4 s ease 0.05 s ; \
- webkit - transition : opacity 0.4 s ease 0.05 s ; \
- o - transition : opacity 0.4 s ease 0.05 s ; \
- ms - transition : opacity 0.4 s ease 0.05 s ; \
transition : opacity 0.4 s ease 0.05 s ; \
opacity : 0 ; \
} \
. ace _fade - fold - widgets : hover . ace _fold - widget { \
- moz - transition : opacity 0.05 s ease 0.05 s ; \
- webkit - transition : opacity 0.05 s ease 0.05 s ; \
- o - transition : opacity 0.05 s ease 0.05 s ; \
- ms - transition : opacity 0.05 s ease 0.05 s ; \
transition : opacity 0.05 s ease 0.05 s ; \
opacity : 1 ; \
} \
. ace _underline { \
text - decoration : underline ; \
} \
. ace _bold { \
font - weight : bold ; \
} \
. ace _nobold . ace _bold { \
font - weight : normal ; \
} \
. ace _italic { \
font - style : italic ; \
} \
. ace _error - marker { \
background - color : rgba ( 255 , 0 , 0 , 0.2 ) ; \
position : absolute ; \
z - index : 9 ; \
} \
. ace _highlight - marker { \
background - color : rgba ( 255 , 255 , 0 , 0.2 ) ; \
position : absolute ; \
z - index : 8 ; \
} \
";dom.importCssString(editorCss," ace _editor ");var VirtualRenderer=function(container,theme){var _self=this;this.container=container||dom.createElement(" div ");this.$keepTextAreaAtCursor=true;dom.addCssClass(this.container," ace _editor ");this.setTheme(theme);this.$gutter=dom.createElement(" div ");this.$gutter.className=" ace _gutter ";this.container.appendChild(this.$gutter);this.scroller=dom.createElement(" div ");this.scroller.className=" ace _scroller ";this.container.appendChild(this.scroller);this.content=dom.createElement(" div ");this.content.className=" ace _content ";this.scroller.appendChild(this.content);this.$gutterLayer=new GutterLayer(this.$gutter);this.$gutterLayer.on(" changeGutterWidth ",this.onGutterResize.bind(this));this.$markerBack=new MarkerLayer(this.content);var textLayer=this.$textLayer=new TextLayer(this.content);this.canvas=textLayer.element;this.$markerFront=new MarkerLayer(this.content);this.$cursorLayer=new CursorLayer(this.content);this.$horizScroll=false;this.$vScroll=false;this.scrollBar=this.scrollBarV=new ScrollBarV(this.container,this);this.scrollBarH=new ScrollBarH(this.container,this);this.scrollBarV.addEventListener(" scroll " , function ( e ) { if ( ! _self . $scrollAnimation )
_self . session . setScrollTop ( e . data - _self . scrollMargin . top ) ; } ) ; this . scrollBarH . addEventListener ( "scroll" , function ( e ) { if ( ! _self . $scrollAnimation )
_self . session . setScrollLeft ( e . data - _self . scrollMargin . left ) ; } ) ; this . scrollTop = 0 ; this . scrollLeft = 0 ; this . cursorPos = { row : 0 , column : 0 } ; this . $textLayer . addEventListener ( "changeCharacterSize" , function ( ) { _self . updateCharacterSize ( ) ; _self . onResize ( true ) ; _self . _signal ( "changeCharacterSize" ) ; } ) ; this . $size = { width : 0 , height : 0 , scrollerHeight : 0 , scrollerWidth : 0 } ; this . layerConfig = { width : 1 , padding : 0 , firstRow : 0 , firstRowScreen : 0 , lastRow : 0 , lineHeight : 0 , characterWidth : 0 , minHeight : 1 , maxHeight : 1 , offset : 0 , height : 1 } ; this . scrollMargin = { left : 0 , right : 0 , top : 0 , bottom : 0 , v : 0 , h : 0 } ; this . $loop = new RenderLoop ( this . $renderChanges . bind ( this ) , this . container . ownerDocument . defaultView ) ; this . $loop . schedule ( this . CHANGE _FULL ) ; this . updateCharacterSize ( ) ; this . setPadding ( 4 ) ; config . resetOptions ( this ) ; config . _emit ( "renderer" , this ) ; } ; ( function ( ) { this . CHANGE _CURSOR = 1 ; this . CHANGE _MARKER = 2 ; this . CHANGE _GUTTER = 4 ; this . CHANGE _SCROLL = 8 ; this . CHANGE _LINES = 16 ; this . CHANGE _TEXT = 32 ; this . CHANGE _SIZE = 64 ; this . CHANGE _MARKER _BACK = 128 ; this . CHANGE _MARKER _FRONT = 256 ; this . CHANGE _FULL = 512 ; this . CHANGE _H _SCROLL = 1024 ; oop . implement ( this , EventEmitter ) ; this . updateCharacterSize = function ( ) { if ( this . $textLayer . allowBoldFonts != this . $allowBoldFonts ) { this . $allowBoldFonts = this . $textLayer . allowBoldFonts ; this . setStyle ( "ace_nobold" , ! this . $allowBoldFonts ) ; }
this . layerConfig . characterWidth = this . characterWidth = this . $textLayer . getCharacterWidth ( ) ; this . layerConfig . lineHeight = this . lineHeight = this . $textLayer . getLineHeight ( ) ; this . $updatePrintMargin ( ) ; } ; this . setSession = function ( session ) { this . session = session ; this . scroller . className = "ace_scroller" ; this . $cursorLayer . setSession ( session ) ; this . $markerBack . setSession ( session ) ; this . $markerFront . setSession ( session ) ; this . $gutterLayer . setSession ( session ) ; this . $textLayer . setSession ( session ) ; this . $loop . schedule ( this . CHANGE _FULL ) ; } ; this . updateLines = function ( firstRow , lastRow ) { if ( lastRow === undefined )
lastRow = Infinity ; if ( ! this . $changedLines ) { this . $changedLines = { firstRow : firstRow , lastRow : lastRow } ; }
else { if ( this . $changedLines . firstRow > firstRow )
this . $changedLines . firstRow = firstRow ; if ( this . $changedLines . lastRow < lastRow )
this . $changedLines . lastRow = lastRow ; }
if ( this . $changedLines . firstRow > this . layerConfig . lastRow || this . $changedLines . lastRow < this . layerConfig . firstRow )
return ; this . $loop . schedule ( this . CHANGE _LINES ) ; } ; this . onChangeTabSize = function ( ) { this . $loop . schedule ( this . CHANGE _TEXT | this . CHANGE _MARKER ) ; this . $textLayer . onChangeTabSize ( ) ; } ; this . updateText = function ( ) { this . $loop . schedule ( this . CHANGE _TEXT ) ; } ; this . updateFull = function ( force ) { if ( force )
this . $renderChanges ( this . CHANGE _FULL , true ) ; else
this . $loop . schedule ( this . CHANGE _FULL ) ; } ; this . updateFontSize = function ( ) { this . $textLayer . checkForSizeChanges ( ) ; } ; this . $changes = 0 ; this . onResize = function ( force , gutterWidth , width , height ) { if ( this . resizing > 2 )
return ; else if ( this . resizing > 0 )
this . resizing ++ ; else
this . resizing = force ? 1 : 0 ; var el = this . container ; if ( ! height )
height = el . clientHeight || el . scrollHeight ; if ( ! width )
width = el . clientWidth || el . scrollWidth ; var changes = this . $updateCachedSize ( force , gutterWidth , width , height ) ; if ( ! this . $size . scrollerHeight || ( ! width && ! height ) )
return this . resizing = 0 ; if ( force )
this . $gutterLayer . $padding = null ; if ( force )
this . $renderChanges ( changes , true ) ; else
this . $loop . schedule ( changes | this . $changes ) ; if ( this . resizing )
this . resizing = 0 ; } ; this . $updateCachedSize = function ( force , gutterWidth , width , height ) { var changes = 0 ; var size = this . $size ; var oldSize = { width : size . width , height : size . height , scrollerHeight : size . scrollerHeight , scrollerWidth : size . scrollerWidth } ; if ( height && ( force || size . height != height ) ) { size . height = height ; changes = this . CHANGE _SIZE ; size . scrollerHeight = size . height ; if ( this . $horizScroll )
size . scrollerHeight -= this . scrollBarH . getHeight ( ) ; this . scrollBarV . element . style . bottom = this . scrollBarH . getHeight ( ) + "px" ; if ( this . session ) { this . session . setScrollTop ( this . getScrollTop ( ) ) ; changes = changes | this . CHANGE _SCROLL ; } }
if ( width && ( force || size . width != width ) ) { changes = this . CHANGE _SIZE ; size . width = width ; if ( gutterWidth == null )
gutterWidth = this . $showGutter ? this . $gutter . offsetWidth : 0 ; this . gutterWidth = gutterWidth ; this . scrollBarH . element . style . left = this . scroller . style . left = gutterWidth + "px" ; size . scrollerWidth = Math . max ( 0 , width - gutterWidth - this . scrollBarV . getWidth ( ) ) ; this . scrollBarH . element . style . right = this . scroller . style . right = this . scrollBarV . getWidth ( ) + "px" ; this . scroller . style . bottom = this . scrollBarH . getHeight ( ) + "px" ; if ( this . session && this . session . getUseWrapMode ( ) && this . adjustWrapLimit ( ) || force )
changes = changes | this . CHANGE _FULL ; }
if ( changes )
this . _signal ( "resize" , oldSize ) ; return changes ; } ; this . onGutterResize = function ( ) { var gutterWidth = this . $showGutter ? this . $gutter . offsetWidth : 0 ; if ( gutterWidth != this . gutterWidth )
this . $changes |= this . $updateCachedSize ( true , gutterWidth , this . $size . width , this . $size . height ) ; if ( this . session . getUseWrapMode ( ) && this . adjustWrapLimit ( ) )
this . $loop . schedule ( this . CHANGE _FULL ) ; else { this . $computeLayerConfig ( ) ; this . $loop . schedule ( this . CHANGE _MARKER ) ; } } ; this . adjustWrapLimit = function ( ) { var availableWidth = this . $size . scrollerWidth - this . $padding * 2 ; var limit = Math . floor ( availableWidth / this . characterWidth ) ; return this . session . adjustWrapLimit ( limit , this . $showPrintMargin && this . $printMarginColumn ) ; } ; this . setAnimatedScroll = function ( shouldAnimate ) { this . setOption ( "animatedScroll" , shouldAnimate ) ; } ; this . getAnimatedScroll = function ( ) { return this . $animatedScroll ; } ; this . setShowInvisibles = function ( showInvisibles ) { this . setOption ( "showInvisibles" , showInvisibles ) ; } ; this . getShowInvisibles = function ( ) { return this . getOption ( "showInvisibles" ) ; } ; this . getDisplayIndentGuides = function ( ) { return this . getOption ( "displayIndentGuides" ) ; } ; this . setDisplayIndentGuides = function ( display ) { this . setOption ( "displayIndentGuides" , display ) ; } ; this . setShowPrintMargin = function ( showPrintMargin ) { this . setOption ( "showPrintMargin" , showPrintMargin ) ; } ; this . getShowPrintMargin = function ( ) { return this . getOption ( "showPrintMargin" ) ; } ; this . setPrintMarginColumn = function ( showPrintMargin ) { this . setOption ( "printMarginColumn" , showPrintMargin ) ; } ; this . getPrintMarginColumn = function ( ) { return this . getOption ( "printMarginColumn" ) ; } ; this . getShowGutter = function ( ) { return this . getOption ( "showGutter" ) ; } ; this . setShowGutter = function ( show ) { return this . setOption ( "showGutter" , show ) ; } ; this . getFadeFoldWidgets = function ( ) { return this . getOption ( "fadeFoldWidgets" ) } ; this . setFadeFoldWidgets = function ( show ) { this . setOption ( "fadeFoldWidgets" , show ) ; } ; this . setHighlightGutterLine = function ( shouldHighlight ) { this . setOption ( "highlightGutterLine" , shouldHighlight ) ; } ; this . getHighlightGutterLine = function ( ) { return this . getOption ( "highlightGutterLine" ) ; } ; this . $updateGutterLineHighlight = function ( ) { var pos = this . $cursorLayer . $pixelPos ; var height = this . layerConfig . lineHeight ; if ( this . session . getUseWrapMode ( ) ) { var cursor = this . session . selection . getCursor ( ) ; cursor . column = 0 ; pos = this . $cursorLayer . getPixelPosition ( cursor , true ) ; height *= this . session . getRowLength ( cursor . row ) ; }
this . $gutterLineHighlight . style . top = pos . top - this . layerConfig . offset + "px" ; this . $gutterLineHighlight . style . height = height + "px" ; } ; this . $updatePrintMargin = function ( ) { if ( ! this . $showPrintMargin && ! this . $printMarginEl )
return ; if ( ! this . $printMarginEl ) { var containerEl = dom . createElement ( "div" ) ; containerEl . className = "ace_layer ace_print-margin-layer" ; this . $printMarginEl = dom . createElement ( "div" ) ; this . $printMarginEl . className = "ace_print-margin" ; containerEl . appendChild ( this . $printMarginEl ) ; this . content . insertBefore ( containerEl , this . content . firstChild ) ; }
var style = this . $printMarginEl . style ; style . left = ( ( this . characterWidth * this . $printMarginColumn ) + this . $padding ) + "px" ; style . visibility = this . $showPrintMargin ? "visible" : "hidden" ; if ( this . session && this . session . $wrap == - 1 )
this . adjustWrapLimit ( ) ; } ; this . getContainerElement = function ( ) { return this . container ; } ; this . getMouseEventTarget = function ( ) { return this . content ; } ; this . getTextAreaContainer = function ( ) { return this . container ; } ; this . $moveTextAreaToCursor = function ( ) { if ( ! this . $keepTextAreaAtCursor )
return ; var config = this . layerConfig ; var posTop = this . $cursorLayer . $pixelPos . top ; var posLeft = this . $cursorLayer . $pixelPos . left ; posTop -= config . offset ; var h = this . lineHeight ; if ( posTop < 0 || posTop > config . height - h )
return ; var w = this . characterWidth ; if ( this . $composition ) { var val = this . textarea . value . replace ( /^\x01+/ , "" ) ; w *= ( this . session . $getStringScreenWidth ( val ) [ 0 ] + 2 ) ; h += 2 ; posTop -= 1 ; }
posLeft -= this . scrollLeft ; if ( posLeft > this . $size . scrollerWidth - w )
posLeft = this . $size . scrollerWidth - w ; posLeft -= this . scrollBar . width ; this . textarea . style . height = h + "px" ; this . textarea . style . width = w + "px" ; this . textarea . style . right = Math . max ( 0 , this . $size . scrollerWidth - posLeft - w ) + "px" ; this . textarea . style . bottom = Math . max ( 0 , this . $size . height - posTop - h ) + "px" ; } ; this . getFirstVisibleRow = function ( ) { return this . layerConfig . firstRow ; } ; this . getFirstFullyVisibleRow = function ( ) { return this . layerConfig . firstRow + ( this . layerConfig . offset === 0 ? 0 : 1 ) ; } ; this . getLastFullyVisibleRow = function ( ) { var flint = Math . floor ( ( this . layerConfig . height + this . layerConfig . offset ) / this . layerConfig . lineHeight ) ; return this . layerConfig . firstRow - 1 + flint ; } ; this . getLastVisibleRow = function ( ) { return this . layerConfig . lastRow ; } ; this . $padding = null ; this . setPadding = function ( padding ) { this . $padding = padding ; this . $textLayer . setPadding ( padding ) ; this . $cursorLayer . setPadding ( padding ) ; this . $markerFront . setPadding ( padding ) ; this . $markerBack . setPadding ( padding ) ; this . $loop . schedule ( this . CHANGE _FULL ) ; this . $updatePrintMargin ( ) ; } ; this . setScrollMargin = function ( top , bottom , left , right ) { var sm = this . scrollMargin ; sm . top = top | 0 ; sm . bottom = bottom | 0 ; sm . right = right | 0 ; sm . left = left | 0 ; sm . v = sm . top + sm . bottom ; sm . h = sm . left + sm . right ; this . updateFull ( ) ; } ; this . getHScrollBarAlwaysVisible = function ( ) { return this . $hScrollBarAlwaysVisible ; } ; this . setHScrollBarAlwaysVisible = function ( alwaysVisible ) { this . setOption ( "hScrollBarAlwaysVisible" , alwaysVisible ) ; } ; this . getVScrollBarAlwaysVisible = function ( ) { return this . $hScrollBarAlwaysVisible ; } ; this . setVScrollBarAlwaysVisible = function ( alwaysVisible ) { this . setOption ( "vScrollBarAlwaysVisible" , alwaysVisible ) ; } ; this . $updateScrollBarV = function ( ) { this . scrollBarV . setInnerHeight ( this . layerConfig . maxHeight + this . scrollMargin . v ) ; this . scrollBarV . setScrollTop ( this . scrollTop + this . scrollMargin . top ) ; } ; this . $updateScrollBarH = function ( ) { this . scrollBarH . setInnerWidth ( this . layerConfig . width + 2 * this . $padding + this . scrollMargin . h ) ; this . scrollBarH . setScrollLeft ( this . scrollLeft + this . scrollMargin . left ) ; } ; this . $renderChanges = function ( changes , force ) { if ( this . $changes ) { changes |= this . $changes ; this . $changes = 0 ; }
if ( ( ! this . session || ! this . container . offsetWidth ) || ( ! changes && ! force ) ) { this . $changes |= changes ; return ; }
if ( ! this . $size . width ) { this . $changes |= changes ; return this . onResize ( true ) ; }
if ( ! this . lineHeight ) { this . $textLayer . checkForSizeChanges ( ) ; }
this . _signal ( "beforeRender" ) ; if ( changes & this . CHANGE _FULL || changes & this . CHANGE _SIZE || changes & this . CHANGE _TEXT || changes & this . CHANGE _LINES || changes & this . CHANGE _SCROLL || changes & this . CHANGE _H _SCROLL )
changes |= this . $computeLayerConfig ( ) ; if ( changes & this . CHANGE _H _SCROLL ) { this . $updateScrollBarH ( ) ; this . content . style . marginLeft = - this . scrollLeft + "px" ; this . scroller . className = this . scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left" ; }
if ( changes & this . CHANGE _FULL ) { this . $updateScrollBarV ( ) ; this . $updateScrollBarH ( ) ; this . $textLayer . update ( this . layerConfig ) ; if ( this . $showGutter )
this . $gutterLayer . update ( this . layerConfig ) ; this . $markerBack . update ( this . layerConfig ) ; this . $markerFront . update ( this . layerConfig ) ; this . $cursorLayer . update ( this . layerConfig ) ; this . $moveTextAreaToCursor ( ) ; this . $highlightGutterLine && this . $updateGutterLineHighlight ( ) ; this . _signal ( "afterRender" ) ; return ; }
if ( changes & this . CHANGE _SCROLL ) { this . $updateScrollBarV ( ) ; if ( changes & this . CHANGE _TEXT || changes & this . CHANGE _LINES )
this . $textLayer . update ( this . layerConfig ) ; else
this . $textLayer . scrollLines ( this . layerConfig ) ; if ( this . $showGutter )
this . $gutterLayer . update ( this . layerConfig ) ; this . $markerBack . update ( this . layerConfig ) ; this . $markerFront . update ( this . layerConfig ) ; this . $cursorLayer . update ( this . layerConfig ) ; this . $highlightGutterLine && this . $updateGutterLineHighlight ( ) ; this . $moveTextAreaToCursor ( ) ; this . _signal ( "afterRender" ) ; return ; }
if ( changes & this . CHANGE _TEXT ) { this . $textLayer . update ( this . layerConfig ) ; if ( this . $showGutter )
this . $gutterLayer . update ( this . layerConfig ) ; }
else if ( changes & this . CHANGE _LINES ) { if ( this . $updateLines ( ) || ( changes & this . CHANGE _GUTTER ) && this . $showGutter )
this . $gutterLayer . update ( this . layerConfig ) ; }
else if ( changes & this . CHANGE _TEXT || changes & this . CHANGE _GUTTER ) { if ( this . $showGutter )
this . $gutterLayer . update ( this . layerConfig ) ; }
if ( changes & this . CHANGE _CURSOR ) { this . $cursorLayer . update ( this . layerConfig ) ; this . $moveTextAreaToCursor ( ) ; this . $highlightGutterLine && this . $updateGutterLineHighlight ( ) ; }
if ( changes & ( this . CHANGE _MARKER | this . CHANGE _MARKER _FRONT ) ) { this . $markerFront . update ( this . layerConfig ) ; }
if ( changes & ( this . CHANGE _MARKER | this . CHANGE _MARKER _BACK ) ) { this . $markerBack . update ( this . layerConfig ) ; }
if ( changes & this . CHANGE _SIZE || changes & this . CHANGE _LINES ) { this . $updateScrollBarV ( ) ; this . $updateScrollBarH ( ) ; }
this . _signal ( "afterRender" ) ; } ; this . $autosize = function ( height , width ) { var height = this . session . getScreenLength ( ) * this . lineHeight ; var maxHeight = this . $maxLines * this . lineHeight ; var desiredHeight = Math . max ( ( this . $minLines || 1 ) * this . lineHeight , Math . min ( maxHeight , height ) ) ; var vScroll = height > maxHeight ; if ( desiredHeight != this . desiredHeight || this . $size . height != this . desiredHeight || vScroll != this . $vScroll ) { if ( vScroll != this . $vScroll ) { this . $vScroll = vScroll ; this . scrollBarV . setVisible ( vScroll ) ; }
var w = this . container . clientWidth ; this . container . style . height = desiredHeight + "px" ; this . $updateCachedSize ( true , this . $gutterWidth , w , desiredHeight ) ; this . desiredHeight = desiredHeight ; } } ; this . $computeLayerConfig = function ( ) { if ( this . $maxLines && this . lineHeight > 1 )
this . $autosize ( ) ; var session = this . session ; var hideScrollbars = this . $size . height <= 2 * this . lineHeight ; var screenLines = this . session . getScreenLength ( )
var maxHeight = screenLines * this . lineHeight ; var offset = this . scrollTop % this . lineHeight ; var minHeight = this . $size . scrollerHeight + this . lineHeight ; var longestLine = this . $getLongestLine ( ) ; var horizScroll = ! hideScrollbars && ( this . $hScrollBarAlwaysVisible || this . $size . scrollerWidth - longestLine - 2 * this . $padding < 0 ) ; var hScrollChanged = this . $horizScroll !== horizScroll ; if ( hScrollChanged ) { this . $horizScroll = horizScroll ; this . scrollBarH . setVisible ( horizScroll ) ; }
if ( ! this . $maxLines && this . $scrollPastEnd ) { if ( this . scrollTop > maxHeight - this . $size . scrollerHeight )
maxHeight += Math . min ( ( this . $size . scrollerHeight - this . lineHeight ) * this . $scrollPastEnd , this . scrollTop - maxHeight + this . $size . scrollerHeight ) ; }
var vScroll = ! hideScrollbars && ( this . $vScrollBarAlwaysVisible || this . $size . scrollerHeight - maxHeight < 0 ) ; var vScrollChanged = this . $vScroll !== vScroll ; if ( vScrollChanged ) { this . $vScroll = vScroll ; this . scrollBarV . setVisible ( vScroll ) ; }
this . session . setScrollTop ( Math . max ( - this . scrollMargin . top , Math . min ( this . scrollTop , maxHeight - this . $size . scrollerHeight + this . scrollMargin . v ) ) ) ; this . session . setScrollLeft ( Math . max ( - this . scrollMargin . left , Math . min ( this . scrollLeft , longestLine + 2 * this . $padding - this . $size . scrollerWidth + this . scrollMargin . h ) ) ) ; var lineCount = Math . ceil ( minHeight / this . lineHeight ) - 1 ; var firstRow = Math . max ( 0 , Math . round ( ( this . scrollTop - offset ) / this . lineHeight ) ) ; var lastRow = firstRow + lineCount ; var firstRowScreen , firstRowHeight ; var lineHeight = this . lineHeight ; firstRow = session . screenToDocumentRow ( firstRow , 0 ) ; var foldLine = session . getFoldLine ( firstRow ) ; if ( foldLine ) { firstRow = foldLine . start . row ; }
firstRowScreen = session . documentToScreenRow ( firstRow , 0 ) ; firstRowHeight = session . getRowLength ( firstRow ) * lineHeight ; lastRow = Math . min ( session . screenToDocumentRow ( lastRow , 0 ) , session . getLength ( ) - 1 ) ; minHeight = this . $size . scrollerHeight + session . getRowLength ( lastRow ) * lineHeight + firstRowHeight ; offset = this . scrollTop - firstRowScreen * lineHeight ; var changes = 0 ; if ( hScrollChanged || vScrollChanged ) { changes = this . $updateCachedSize ( true , this . gutterWidth , this . $size . width , this . $size . height ) ; this . _signal ( "scrollbarVisibilityChanged" ) ; if ( vScrollChanged )
longestLine = this . $getLongestLine ( ) ; }
this . layerConfig = { width : longestLine , padding : this . $padding , firstRow : firstRow , firstRowScreen : firstRowScreen , lastRow : lastRow , lineHeight : lineHeight , characterWidth : this . characterWidth , minHeight : minHeight , maxHeight : maxHeight , offset : offset , height : this . $size . scrollerHeight } ; this . $gutterLayer . element . style . marginTop = ( - offset ) + "px" ; this . content . style . marginTop = ( - offset ) + "px" ; this . content . style . width = longestLine + 2 * this . $padding + "px" ; this . content . style . height = minHeight + "px" ; return changes ; } ; this . $updateLines = function ( ) { var firstRow = this . $changedLines . firstRow ; var lastRow = this . $changedLines . lastRow ; this . $changedLines = null ; var layerConfig = this . layerConfig ; if ( firstRow > layerConfig . lastRow + 1 ) { return ; }
if ( lastRow < layerConfig . firstRow ) { return ; }
if ( lastRow === Infinity ) { if ( this . $showGutter )
this . $gutterLayer . update ( layerConfig ) ; this . $textLayer . update ( layerConfig ) ; return ; }
this . $textLayer . updateLines ( layerConfig , firstRow , lastRow ) ; return true ; } ; this . $getLongestLine = function ( ) { var charCount = this . session . getScreenWidth ( ) ; if ( this . showInvisibles && ! this . session . $useWrapMode )
charCount += 1 ; return Math . max ( this . $size . scrollerWidth - 2 * this . $padding , Math . round ( charCount * this . characterWidth ) ) ; } ; this . updateFrontMarkers = function ( ) { this . $markerFront . setMarkers ( this . session . getMarkers ( true ) ) ; this . $loop . schedule ( this . CHANGE _MARKER _FRONT ) ; } ; this . updateBackMarkers = function ( ) { this . $markerBack . setMarkers ( this . session . getMarkers ( ) ) ; this . $loop . schedule ( this . CHANGE _MARKER _BACK ) ; } ; this . addGutterDecoration = function ( row , className ) { this . $gutterLayer . addGutterDecoration ( row , className ) ; } ; this . removeGutterDecoration = function ( row , className ) { this . $gutterLayer . removeGutterDecoration ( row , className ) ; } ; this . updateBreakpoints = function ( rows ) { this . $loop . schedule ( this . CHANGE _GUTTER ) ; } ; this . setAnnotations = function ( annotations ) { this . $gutterLayer . setAnnotations ( annotations ) ; this . $loop . schedule ( this . CHANGE _GUTTER ) ; } ; this . updateCursor = function ( ) { this . $loop . schedule ( this . CHANGE _CURSOR ) ; } ; this . hideCursor = function ( ) { this . $cursorLayer . hideCursor ( ) ; } ; this . showCursor = function ( ) { this . $cursorLayer . showCursor ( ) ; } ; this . scrollSelectionIntoView = function ( anchor , lead , offset ) { this . scrollCursorIntoView ( anchor , offset ) ; this . scrollCursorIntoView ( lead , offset ) ; } ; this . scrollCursorIntoView = function ( cursor , offset ) { if ( this . $size . scrollerHeight === 0 )
return ; var pos = this . $cursorLayer . getPixelPosition ( cursor ) ; var left = pos . left ; var top = pos . top ; var scrollTop = this . $scrollAnimation ? this . session . getScrollTop ( ) : this . scrollTop ; if ( scrollTop > top ) { if ( offset )
top -= offset * this . $size . scrollerHeight ; if ( top == 0 )
top = - this . scrollMargin . top ; else if ( top == 0 )
top = + this . scrollMargin . bottom ; this . session . setScrollTop ( top ) ; } else if ( scrollTop + this . $size . scrollerHeight < top + this . lineHeight ) { if ( offset )
top += offset * this . $size . scrollerHeight ; this . session . setScrollTop ( top + this . lineHeight - this . $size . scrollerHeight ) ; }
var scrollLeft = this . scrollLeft ; if ( scrollLeft > left ) { if ( left < this . $padding + 2 * this . layerConfig . characterWidth )
left = - this . scrollMargin . left ; this . session . setScrollLeft ( left ) ; } else if ( scrollLeft + this . $size . scrollerWidth < left + this . characterWidth ) { this . session . setScrollLeft ( Math . round ( left + this . characterWidth - this . $size . scrollerWidth ) ) ; } else if ( scrollLeft <= this . $padding && left - scrollLeft < this . characterWidth ) { this . session . setScrollLeft ( 0 ) ; } } ; this . getScrollTop = function ( ) { return this . session . getScrollTop ( ) ; } ; this . getScrollLeft = function ( ) { return this . session . getScrollLeft ( ) ; } ; this . getScrollTopRow = function ( ) { return this . scrollTop / this . lineHeight ; } ; this . getScrollBottomRow = function ( ) { return Math . max ( 0 , Math . floor ( ( this . scrollTop + this . $size . scrollerHeight ) / this . lineHeight ) - 1 ) ; } ; this . scrollToRow = function ( row ) { this . session . setScrollTop ( row * this . lineHeight ) ; } ; this . alignCursor = function ( cursor , alignment ) { if ( typeof cursor == "number" )
cursor = { row : cursor , column : 0 } ; var pos = this . $cursorLayer . getPixelPosition ( cursor ) ; var h = this . $size . scrollerHeight - this . lineHeight ; var offset = pos . top - h * ( alignment || 0 ) ; this . session . setScrollTop ( offset ) ; return offset ; } ; this . STEPS = 8 ; this . $calcSteps = function ( fromValue , toValue ) { var i = 0 ; var l = this . STEPS ; var steps = [ ] ; var func = function ( t , x _min , dx ) { return dx * ( Math . pow ( t - 1 , 3 ) + 1 ) + x _min ; } ; for ( i = 0 ; i < l ; ++ i )
steps . push ( func ( i / this . STEPS , fromValue , toValue - fromValue ) ) ; return steps ; } ; this . scrollToLine = function ( line , center , animate , callback ) { var pos = this . $cursorLayer . getPixelPosition ( { row : line , column : 0 } ) ; var offset = pos . top ; if ( center )
offset -= this . $size . scrollerHeight / 2 ; var initialScroll = this . scrollTop ; this . session . setScrollTop ( offset ) ; if ( animate !== false )
this . animateScrolling ( initialScroll , callback ) ; } ; this . animateScrolling = function ( fromValue , callback ) { var toValue = this . scrollTop ; if ( ! this . $animatedScroll )
return ; var _self = this ; if ( fromValue == toValue )
return ; if ( this . $scrollAnimation ) { var oldSteps = this . $scrollAnimation . steps ; if ( oldSteps . length ) { fromValue = oldSteps [ 0 ] ; if ( fromValue == toValue )
return ; } }
var steps = _self . $calcSteps ( fromValue , toValue ) ; this . $scrollAnimation = { from : fromValue , to : toValue , steps : steps } ; clearInterval ( this . $timer ) ; _self . session . setScrollTop ( steps . shift ( ) ) ; this . $timer = setInterval ( function ( ) { if ( steps . length ) { _self . session . setScrollTop ( steps . shift ( ) ) ; _self . session . $scrollTop = toValue ; } else if ( toValue != null ) { _self . session . $scrollTop = - 1 ; _self . session . setScrollTop ( toValue ) ; toValue = null ; } else { _self . $timer = clearInterval ( _self . $timer ) ; _self . $scrollAnimation = null ; callback && callback ( ) ; } } , 10 ) ; } ; this . scrollToY = function ( scrollTop ) { if ( this . scrollTop !== scrollTop ) { this . $loop . schedule ( this . CHANGE _SCROLL ) ; this . scrollTop = scrollTop ; } } ; this . scrollToX = function ( scrollLeft ) { if ( this . scrollLeft !== scrollLeft )
this . scrollLeft = scrollLeft ; this . $loop . schedule ( this . CHANGE _H _SCROLL ) ; } ; this . scrollTo = function ( x , y ) { this . session . setScrollTop ( y ) ; this . session . setScrollLeft ( y ) ; } ; this . scrollBy = function ( deltaX , deltaY ) { deltaY && this . session . setScrollTop ( this . session . getScrollTop ( ) + deltaY ) ; deltaX && this . session . setScrollLeft ( this . session . getScrollLeft ( ) + deltaX ) ; } ; this . isScrollableBy = function ( deltaX , deltaY ) { if ( deltaY < 0 && this . session . getScrollTop ( ) >= 1 - this . scrollMargin . top )
return true ; if ( deltaY > 0 && this . session . getScrollTop ( ) + this . $size . scrollerHeight - this . layerConfig . maxHeight - ( this . $size . scrollerHeight - this . lineHeight ) * this . $scrollPastEnd < - 1 + this . scrollMargin . bottom )
return true ; if ( deltaX < 0 && this . session . getScrollLeft ( ) >= 1 - this . scrollMargin . left )
return true ; if ( deltaX > 0 && this . session . getScrollLeft ( ) + this . $size . scrollerWidth - this . layerConfig . width < - 1 + this . scrollMargin . right )
return true ; } ; this . pixelToScreenCoordinates = function ( x , y ) { var canvasPos = this . scroller . getBoundingClientRect ( ) ; var offset = ( x + this . scrollLeft - canvasPos . left - this . $padding ) / this . characterWidth ; var row = Math . floor ( ( y + this . scrollTop - canvasPos . top ) / this . lineHeight ) ; var col = Math . round ( offset ) ; return { row : row , column : col , side : offset - col > 0 ? 1 : - 1 } ; } ; this . screenToTextCoordinates = function ( x , y ) { var canvasPos = this . scroller . getBoundingClientRect ( ) ; var col = Math . round ( ( x + this . scrollLeft - canvasPos . left - this . $padding ) / this . characterWidth ) ; var row = Math . floor ( ( y + this . scrollTop - canvasPos . top ) / this . lineHeight ) ; return this . session . screenToDocumentPosition ( row , Math . max ( col , 0 ) ) ; } ; this . textToScreenCoordinates = function ( row , column ) { var canvasPos = this . scroller . getBoundingClientRect ( ) ; var pos = this . session . documentToScreenPosition ( row , column ) ; var x = this . $padding + Math . round ( pos . column * this . characterWidth ) ; var y = pos . row * this . lineHeight ; return { pageX : canvasPos . left + x - this . scrollLeft , pageY : canvasPos . top + y - this . scrollTop } ; } ; this . visualizeFocus = function ( ) { dom . addCssClass ( this . container , "ace_focus" ) ; } ; this . visualizeBlur = function ( ) { dom . removeCssClass ( this . container , "ace_focus" ) ; } ; this . showComposition = function ( position ) { if ( ! this . $composition )
this . $composition = { keepTextAreaAtCursor : this . $keepTextAreaAtCursor , cssText : this . textarea . style . cssText } ; this . $keepTextAreaAtCursor = true ; dom . addCssClass ( this . textarea , "ace_composition" ) ; this . textarea . style . cssText = "" ; this . $moveTextAreaToCursor ( ) ; } ; this . setCompositionText = function ( text ) { this . $moveTextAreaToCursor ( ) ; } ; this . hideComposition = function ( ) { if ( ! this . $composition )
return ; dom . removeCssClass ( this . textarea , "ace_composition" ) ; this . $keepTextAreaAtCursor = this . $composition . keepTextAreaAtCursor ; this . textarea . style . cssText = this . $composition . cssText ; this . $composition = null ; } ; this . setTheme = function ( theme , cb ) { var _self = this ; this . $themeValue = theme ; _self . _dispatchEvent ( 'themeChange' , { theme : theme } ) ; if ( ! theme || typeof theme == "string" ) { var moduleName = theme || "ace/theme/textmate" ; config . loadModule ( [ "theme" , moduleName ] , afterLoad ) ; } else { afterLoad ( theme ) ; }
function afterLoad ( module ) { if ( _self . $themeValue != theme )
return cb && cb ( ) ; if ( ! module . cssClass )
return ; dom . importCssString ( module . cssText , module . cssClass , _self . container . ownerDocument ) ; if ( _self . theme )
dom . removeCssClass ( _self . container , _self . theme . cssClass ) ; _self . $theme = module . cssClass ; _self . theme = module ; dom . addCssClass ( _self . container , module . cssClass ) ; dom . setCssClass ( _self . container , "ace_dark" , module . isDark ) ; var padding = "padding" in module ? module . padding : 4 ; if ( _self . $padding && padding != _self . $padding )
_self . setPadding ( padding ) ; if ( _self . $size ) { _self . $size . width = 0 ; _self . onResize ( ) ; }
_self . _dispatchEvent ( 'themeLoaded' , { theme : module } ) ; cb && cb ( ) ; } } ; this . getTheme = function ( ) { return this . $themeValue ; } ; this . setStyle = function ( style , include ) { dom . setCssClass ( this . container , style , include != false ) ; } ; this . unsetStyle = function ( style ) { dom . removeCssClass ( this . container , style ) ; } ; this . setMouseCursor = function ( cursorStyle ) { this . content . style . cursor = cursorStyle ; } ; this . destroy = function ( ) { this . $textLayer . destroy ( ) ; this . $cursorLayer . destroy ( ) ; } ; } ) . call ( VirtualRenderer . prototype ) ; config . defineOptions ( VirtualRenderer . prototype , "renderer" , { animatedScroll : { initialValue : false } , showInvisibles : { set : function ( value ) { if ( this . $textLayer . setShowInvisibles ( value ) )
this . $loop . schedule ( this . CHANGE _TEXT ) ; } , initialValue : false } , showPrintMargin : { set : function ( ) { this . $updatePrintMargin ( ) ; } , initialValue : true } , printMarginColumn : { set : function ( ) { this . $updatePrintMargin ( ) ; } , initialValue : 80 } , printMargin : { set : function ( val ) { if ( typeof val == "number" )
this . $printMarginColumn = val ; this . $showPrintMargin = ! ! val ; this . $updatePrintMargin ( ) ; } , get : function ( ) { return this . $showPrintMargin && this . $printMarginColumn ; } } , showGutter : { set : function ( show ) { this . $gutter . style . display = show ? "block" : "none" ; this . onGutterResize ( ) ; } , initialValue : true } , fadeFoldWidgets : { set : function ( show ) { dom . setCssClass ( this . $gutter , "ace_fade-fold-widgets" , show ) ; } , initialValue : false } , showFoldWidgets : { set : function ( show ) { this . $gutterLayer . setShowFoldWidgets ( show ) } , initialValue : true } , displayIndentGuides : { set : function ( show ) { if ( this . $textLayer . setDisplayIndentGuides ( show ) )
this . $loop . schedule ( this . CHANGE _TEXT ) ; } , initialValue : true } , highlightGutterLine : { set : function ( shouldHighlight ) { if ( ! this . $gutterLineHighlight ) { this . $gutterLineHighlight = dom . createElement ( "div" ) ; this . $gutterLineHighlight . className = "ace_gutter-active-line" ; this . $gutter . appendChild ( this . $gutterLineHighlight ) ; return ; }
this . $gutterLineHighlight . style . display = shouldHighlight ? "" : "none" ; if ( this . $cursorLayer . $pixelPos )
this . $updateGutterLineHighlight ( ) ; } , initialValue : false , value : true } , hScrollBarAlwaysVisible : { set : function ( val ) { if ( ! this . $hScrollBarAlwaysVisible || ! this . $horizScroll )
this . $loop . schedule ( this . CHANGE _SCROLL ) ; } , initialValue : false } , vScrollBarAlwaysVisible : { set : function ( val ) { if ( ! this . $vScrollBarAlwaysVisible || ! this . $vScroll )
this . $loop . schedule ( this . CHANGE _SCROLL ) ; } , initialValue : false } , fontSize : { set : function ( size ) { if ( typeof size == "number" )
size = size + "px" ; this . container . style . fontSize = size ; this . updateFontSize ( ) ; } , initialValue : 12 } , fontFamily : { set : function ( name ) { this . container . style . fontFamily = name ; this . updateFontSize ( ) ; } } , maxLines : { set : function ( val ) { this . updateFull ( ) ; } } , minLines : { set : function ( val ) { this . updateFull ( ) ; } } , scrollPastEnd : { set : function ( val ) { val = + val || 0 ; if ( this . $scrollPastEnd == val )
return ; this . $scrollPastEnd = val ; this . $loop . schedule ( this . CHANGE _SCROLL ) ; } , initialValue : 0 , handlesSet : true } , fixedWidthGutter : { set : function ( val ) { this . $gutterLayer . $fixedWidth = ! ! val ; this . $loop . schedule ( this . CHANGE _GUTTER ) ; } } } ) ; exports . VirtualRenderer = VirtualRenderer ; } ) ; define ( 'ace/layer/gutter' , [ 'require' , 'exports' , 'module' , 'ace/lib/dom' , 'ace/lib/oop' , 'ace/lib/lang' , 'ace/lib/event_emitter' ] , function ( require , exports , module ) { var dom = require ( "../lib/dom" ) ; var oop = require ( "../lib/oop" ) ; var lang = require ( "../lib/lang" ) ; var EventEmitter = require ( "../lib/event_emitter" ) . EventEmitter ; var Gutter = function ( parentEl ) { this . element = dom . createElement ( "div" ) ; this . element . className = "ace_layer ace_gutter-layer" ; parentEl . appendChild ( this . element ) ; this . setShowFoldWidgets ( this . $showFoldWidgets ) ; this . gutterWidth = 0 ; this . $annotations = [ ] ; this . $updateAnnotations = this . $updateAnnotations . bind ( this ) ; this . $cells = [ ] ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . setSession = function ( session ) { if ( this . session )
this . session . removeEventListener ( "change" , this . $updateAnnotations ) ; this . session = session ; session . on ( "change" , this . $updateAnnotations ) ; } ; this . addGutterDecoration = function ( row , className ) { if ( window . console )
console . warn && console . warn ( "deprecated use session.addGutterDecoration" ) ; this . session . addGutterDecoration ( row , className ) ; } ; this . removeGutterDecoration = function ( row , className ) { if ( window . console )
console . warn && console . warn ( "deprecated use session.removeGutterDecoration" ) ; this . session . removeGutterDecoration ( row , className ) ; } ; this . setAnnotations = function ( annotations ) { this . $annotations = [ ]
var rowInfo , row ; for ( var i = 0 ; i < annotations . length ; i ++ ) { var annotation = annotations [ i ] ; var row = annotation . row ; var rowInfo = this . $annotations [ row ] ; if ( ! rowInfo )
rowInfo = this . $annotations [ row ] = { text : [ ] } ; var annoText = annotation . text ; annoText = annoText ? lang . escapeHTML ( annoText ) : annotation . html || "" ; if ( rowInfo . text . indexOf ( annoText ) === - 1 )
rowInfo . text . push ( annoText ) ; var type = annotation . type ; if ( type == "error" )
rowInfo . className = " ace_error" ; else if ( type == "warning" && rowInfo . className != " ace_error" )
rowInfo . className = " ace_warning" ; else if ( type == "info" && ( ! rowInfo . className ) )
rowInfo . className = " ace_info" ; } } ; this . $updateAnnotations = function ( e ) { if ( ! this . $annotations . length )
return ; var delta = e . data ; var range = delta . range ; var firstRow = range . start . row ; var len = range . end . row - firstRow ; if ( len === 0 ) { } else if ( delta . action == "removeText" || delta . action == "removeLines" ) { this . $annotations . splice ( firstRow , len + 1 , null ) ; } else { var args = Array ( len + 1 ) ; args . unshift ( firstRow , 1 ) ; this . $annotations . splice . apply ( this . $annotations , args ) ; } } ; this . update = function ( config ) { var firstRow = config . firstRow ; var lastRow = config . lastRow ; var fold = this . session . getNextFoldLine ( firstRow ) ; var foldStart = fold ? fold . start . row : Infinity ; var foldWidgets = this . $showFoldWidgets && this . session . foldWidgets ; var breakpoints = this . session . $breakpoints ; var decorations = this . session . $decorations ; var firstLineNumber = this . session . $firstLineNumber ; var lastLineNumber = 0 ; var cell = null ; var index = - 1 ; var row = firstRow ; while ( true ) { if ( row > foldStart ) { row = fold . end . row + 1 ; fold = this . session . getNextFoldLine ( row , fold ) ; foldStart = fold ? fold . start . row : Infinity ; }
if ( row > lastRow ) { while ( this . $cells . length > index + 1 ) { cell = this . $cells . pop ( ) ; this . element . removeChild ( cell . element ) ; }
break ; }
cell = this . $cells [ ++ index ] ; if ( ! cell ) { cell = { element : null , textNode : null , foldWidget : null } ; cell . element = dom . createElement ( "div" ) ; cell . textNode = document . createTextNode ( '' ) ; cell . element . appendChild ( cell . textNode ) ; this . element . appendChild ( cell . element ) ; this . $cells [ index ] = cell ; }
var className = "ace_gutter-cell " ; if ( breakpoints [ row ] )
className += breakpoints [ row ] ; if ( decorations [ row ] )
className += decorations [ row ] ; if ( this . $annotations [ row ] )
className += this . $annotations [ row ] . className ; if ( cell . element . className != className )
cell . element . className = className ; var height = this . session . getRowLength ( row ) * config . lineHeight + "px" ; if ( height != cell . element . style . height )
cell . element . style . height = height ; var text = lastLineNumber = row + firstLineNumber ; if ( text != cell . textNode . data )
cell . textNode . data = text ; if ( foldWidgets ) { var c = foldWidgets [ row ] ; if ( c == null )
c = foldWidgets [ row ] = this . session . getFoldWidget ( row ) ; }
if ( c ) { if ( ! cell . foldWidget ) { cell . foldWidget = dom . createElement ( "span" ) ; cell . element . appendChild ( cell . foldWidget ) ; }
var className = "ace_fold-widget ace_" + c ; if ( c == "start" && row == foldStart && row < fold . end . row )
className += " ace_closed" ; else
className += " ace_open" ; if ( cell . foldWidget . className != className )
cell . foldWidget . className = className ; var height = config . lineHeight + "px" ; if ( cell . foldWidget . style . height != height )
cell . foldWidget . style . height = height ; } else { if ( cell . foldWidget != null ) { cell . element . removeChild ( cell . foldWidget ) ; cell . foldWidget = null ; } }
row ++ ; }
this . element . style . height = config . minHeight + "px" ; if ( this . $fixedWidth || this . session . $useWrapMode )
lastLineNumber = this . session . getLength ( ) ; var gutterWidth = lastLineNumber . toString ( ) . length * config . characterWidth ; var padding = this . $padding || this . $computePadding ( ) ; gutterWidth += padding . left + padding . right ; if ( gutterWidth !== this . gutterWidth && ! isNaN ( gutterWidth ) ) { this . gutterWidth = gutterWidth ; this . element . style . width = Math . ceil ( this . gutterWidth ) + "px" ; this . _emit ( "changeGutterWidth" , gutterWidth ) ; } } ; this . $fixedWidth = false ; this . $showFoldWidgets = true ; this . setShowFoldWidgets = function ( show ) { if ( show )
dom . addCssClass ( this . element , "ace_folding-enabled" ) ; else
dom . removeCssClass ( this . element , "ace_folding-enabled" ) ; this . $showFoldWidgets = show ; this . $padding = null ; } ; this . getShowFoldWidgets = function ( ) { return this . $showFoldWidgets ; } ; this . $computePadding = function ( ) { if ( ! this . element . firstChild )
return { left : 0 , right : 0 } ; var style = dom . computedStyle ( this . element . firstChild ) ; this . $padding = { } ; this . $padding . left = parseInt ( style . paddingLeft ) + 1 || 0 ; this . $padding . right = parseInt ( style . paddingRight ) || 0 ; return this . $padding ; } ; this . getRegion = function ( point ) { var padding = this . $padding || this . $computePadding ( ) ; var rect = this . element . getBoundingClientRect ( ) ; if ( point . x < padding . left + rect . left )
return "markers" ; if ( this . $showFoldWidgets && point . x > rect . right - padding . right )
return "foldWidgets" ; } ; } ) . call ( Gutter . prototype ) ; exports . Gutter = Gutter ; } ) ; define ( 'ace/layer/marker' , [ 'require' , 'exports' , 'module' , 'ace/range' , 'ace/lib/dom' ] , function ( require , exports , module ) { var Range = require ( "../range" ) . Range ; var dom = require ( "../lib/dom" ) ; var Marker = function ( parentEl ) { this . element = dom . createElement ( "div" ) ; this . element . className = "ace_layer ace_marker-layer" ; parentEl . appendChild ( this . element ) ; } ; ( function ( ) { this . $padding = 0 ; this . setPadding = function ( padding ) { this . $padding = padding ; } ; this . setSession = function ( session ) { this . session = session ; } ; this . setMarkers = function ( markers ) { this . markers = markers ; } ; this . update = function ( config ) { var config = config || this . config ; if ( ! config )
return ; this . config = config ; var html = [ ] ; for ( var key in this . markers ) { var marker = this . markers [ key ] ; if ( ! marker . range ) { marker . update ( html , this , this . session , config ) ; continue ; }
var range = marker . range . clipRows ( config . firstRow , config . lastRow ) ; if ( range . isEmpty ( ) ) continue ; range = range . toScreenRange ( this . session ) ; if ( marker . renderer ) { var top = this . $getTop ( range . start . row , config ) ; var left = this . $padding + range . start . column * config . characterWidth ; marker . renderer ( html , range , left , top , config ) ; } else if ( marker . type == "fullLine" ) { this . drawFullLineMarker ( html , range , marker . clazz , config ) ; } else if ( marker . type == "screenLine" ) { this . drawScreenLineMarker ( html , range , marker . clazz , config ) ; } else if ( range . isMultiLine ( ) ) { if ( marker . type == "text" )
this . drawTextMarker ( html , range , marker . clazz , config ) ; else
this . drawMultiLineMarker ( html , range , marker . clazz , config ) ; } else { this . drawSingleLineMarker ( html , range , marker . clazz + " ace_start" , config ) ; } }
this . element = dom . setInnerHtml ( this . element , html . join ( "" ) ) ; } ; this . $getTop = function ( row , layerConfig ) { return ( row - layerConfig . firstRowScreen ) * layerConfig . lineHeight ; } ; this . drawTextMarker = function ( stringBuilder , range , clazz , layerConfig , extraStyle ) { var row = range . start . row ; var lineRange = new Range ( row , range . start . column , row , this . session . getScreenLastRowColumn ( row ) ) ; this . drawSingleLineMarker ( stringBuilder , lineRange , clazz + " ace_start" , layerConfig , 1 , extraStyle ) ; row = range . end . row ; lineRange = new Range ( row , 0 , row , range . end . column ) ; this . drawSingleLineMarker ( stringBuilder , lineRange , clazz , layerConfig , 0 , extraStyle ) ; for ( row = range . start . row + 1 ; row < range . end . row ; row ++ ) { lineRange . start . row = row ; lineRange . end . row = row ; lineRange . end . column = this . session . getScreenLastRowColumn ( row ) ; this . drawSingleLineMarker ( stringBuilder , lineRange , clazz , layerConfig , 1 , extraStyle ) ; } } ; this . drawMultiLineMarker = function ( stringBuilder , range , clazz , config , extraStyle ) { var padding = this . $padding ; var height = config . lineHeight ; var top = this . $getTop ( range . start . row , config ) ; var left = padding + range . start . column * config . characterWidth ; extraStyle = extraStyle || "" ; stringBuilder . push ( "<div class='" , clazz , " ace_start' style='" , "height:" , height , "px;" , "right:0;" , "top:" , top , "px;" , "left:" , left , "px;" , extraStyle , "'></div>" ) ; top = this . $getTop ( range . end . row , config ) ; var width = range . end . column * config . characterWidth ; stringBuilder . push ( "<div class='" , clazz , "' style='" , "height:" , height , "px;" , "width:" , width , "px;" , "top:" , top , "px;" , "left:" , padding , "px;" , extraStyle , "'></div>" ) ; height = ( range . end . row - range . start . row - 1 ) * config . lineHeight ; if ( height < 0 )
return ; top = this . $getTop ( range . start . row + 1 , config ) ; stringBuilder . push ( "<div class='" , clazz , "' style='" , "height:" , height , "px;" , "right:0;" , "top:" , top , "px;" , "left:" , padding , "px;" , extraStyle , "'></div>" ) ; } ; this . drawSingleLineMarker = function ( stringBuilder , range , clazz , config , extraLength , extraStyle ) { var height = config . lineHeight ; var width = ( range . end . column + ( extraLength || 0 ) - range . start . column ) * config . characterWidth ; var top = this . $getTop ( range . start . row , config ) ; var left = this . $padding + range . start . column * config . characterWidth ; stringBuilder . push ( "<div class='" , clazz , "' style='" , "height:" , height , "px;" , "width:" , width , "px;" , "top:" , top , "px;" , "left:" , left , "px;" , extraStyle || "" , "'></div>" ) ; } ; this . drawFullLineMarker = function ( stringBuilder , range , clazz , config , extraStyle ) { var top = this . $getTop ( range . start . row , config ) ; var height = config . lineHeight ; if ( range . start . row != range . end . row )
height += this . $getTop ( range . end . row , config ) - top ; stringBuilder . push ( "<div class='" , clazz , "' style='" , "height:" , height , "px;" , "top:" , top , "px;" , "left:0;right:0;" , extraStyle || "" , "'></div>" ) ; } ; this . drawScreenLineMarker = function ( stringBuilder , range , clazz , config , extraStyle ) { var top = this . $getTop ( range . start . row , config ) ; var height = config . lineHeight ; stringBuilder . push ( "<div class='" , clazz , "' style='" , "height:" , height , "px;" , "top:" , top , "px;" , "left:0;right:0;" , extraStyle || "" , "'></div>" ) ; } ; } ) . call ( Marker . prototype ) ; exports . Marker = Marker ; } ) ; define ( 'ace/layer/text' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/dom' , 'ace/lib/lang' , 'ace/lib/useragent' , 'ace/lib/event_emitter' ] , function ( require , exports , module ) { var oop = require ( "../lib/oop" ) ; var dom = require ( "../lib/dom" ) ; var lang = require ( "../lib/lang" ) ; var useragent = require ( "../lib/useragent" ) ; var EventEmitter = require ( "../lib/event_emitter" ) . EventEmitter ; var Text = function ( parentEl ) { this . element = dom . createElement ( "div" ) ; this . element . className = "ace_layer ace_text-layer" ; parentEl . appendChild ( this . element ) ; this . $characterSize = { width : 0 , height : 0 } ; this . checkForSizeChanges ( ) ; this . $pollSizeChanges ( ) ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . EOF _CHAR = "\xB6" ; this . EOL _CHAR = "\xAC" ; this . TAB _CHAR = "\u2192" ; this . SPACE _CHAR = "\xB7" ; this . $padding = 0 ; this . setPadding = function ( padding ) { this . $padding = padding ; this . element . style . padding = "0 " + padding + "px" ; } ; this . getLineHeight = function ( ) { return this . $characterSize . height || 0 ; } ; this . getCharacterWidth = function ( ) { return this . $characterSize . width || 0 ; } ; this . checkForSizeChanges = function ( ) { var size = this . $measureSizes ( ) ; if ( size && ( this . $characterSize . width !== size . width || this . $characterSize . height !== size . height ) ) { this . $measureNode . style . fontWeight = "bold" ; var boldSize = this . $measureSizes ( ) ; this . $measureNode . style . fontWeight = "" ; this . $characterSize = size ; this . allowBoldFonts = boldSize && boldSize . width === size . width && boldSize . height === size . height ; this . _emit ( "changeCharacterSize" , { data : size } ) ; } } ; this . $pollSizeChanges = function ( ) { var self = this ; this . $pollSizeChangesTimer = setInterval ( function ( ) { self . checkForSizeChanges ( ) ; } , 500 ) ; } ; this . $fontStyles = { fontFamily : 1 , fontSize : 1 , fontWeight : 1 , fontStyle : 1 , lineHeight : 1 } ; this . $measureSizes = useragent . isIE || useragent . isOldGecko ? function ( ) { var n = 1000 ; if ( ! this . $measureNode ) { var measureNode = this . $measureNode = dom . createElement ( "div" ) ; var style = measureNode . style ; style . width = style . height = "auto" ; style . left = style . top = ( - n * 40 ) + "px" ; style . visibility = "hidden" ; style . position = "fixed" ; style . overflow = "visible" ; style . whiteSpace = "nowrap" ; measureNode . innerHTML = lang . stringRepeat ( "Xy" , n ) ; if ( this . element . ownerDocument . body ) { this . element . ownerDocument . body . appendChild ( measureNode ) ; } else { var container = this . element . parentNode ; while ( ! dom . hasCssClass ( container , "ace_editor" ) )
container = container . parentNode ; container . appendChild ( measureNode ) ; } }
if ( ! this . element . offsetWidth )
return null ; var style = this . $measureNode . style ; var computedStyle = dom . computedStyle ( this . element ) ; for ( var prop in this . $fontStyles )
style [ prop ] = computedStyle [ prop ] ; var size = { height : this . $measureNode . offsetHeight , width : this . $measureNode . offsetWidth / ( n * 2 ) } ; if ( size . width == 0 || size . height == 0 )
return null ; return size ; } : function ( ) { if ( ! this . $measureNode ) { var measureNode = this . $measureNode = dom . createElement ( "div" ) ; var style = measureNode . style ; style . width = style . height = "auto" ; style . left = style . top = - 100 + "px" ; style . visibility = "hidden" ; style . position = "fixed" ; style . overflow = "visible" ; style . whiteSpace = "nowrap" ; measureNode . innerHTML = lang . stringRepeat ( "X" , 100 ) ; var container = this . element . parentNode ; while ( container && ! dom . hasCssClass ( container , "ace_editor" ) )
container = container . parentNode ; if ( ! container )
return this . $measureNode = null ; container . appendChild ( measureNode ) ; }
var rect = this . $measureNode . getBoundingClientRect ( ) ; var size = { height : rect . height , width : rect . width / 100 } ; if ( size . width == 0 || size . height == 0 )
return null ; return size ; } ; this . setSession = function ( session ) { this . session = session ; this . $computeTabString ( ) ; } ; this . showInvisibles = false ; this . setShowInvisibles = function ( showInvisibles ) { if ( this . showInvisibles == showInvisibles )
return false ; this . showInvisibles = showInvisibles ; this . $computeTabString ( ) ; return true ; } ; this . displayIndentGuides = true ; this . setDisplayIndentGuides = function ( display ) { if ( this . displayIndentGuides == display )
return false ; this . displayIndentGuides = display ; this . $computeTabString ( ) ; return true ; } ; this . $tabStrings = [ ] ; this . onChangeTabSize = this . $computeTabString = function ( ) { var tabSize = this . session . getTabSize ( ) ; this . tabSize = tabSize ; var tabStr = this . $tabStrings = [ 0 ] ; for ( var i = 1 ; i < tabSize + 1 ; i ++ ) { if ( this . showInvisibles ) { tabStr . push ( "<span class='ace_invisible'>" + this . TAB _CHAR + lang . stringRepeat ( "\xa0" , i - 1 ) + "</span>" ) ; } else { tabStr . push ( lang . stringRepeat ( "\xa0" , i ) ) ; } }
if ( this . displayIndentGuides ) { this . $indentGuideRe = /\s\S| \t|\t |\s$/ ; var className = "ace_indent-guide" ; if ( this . showInvisibles ) { className += " ace_invisible" ; var spaceContent = lang . stringRepeat ( this . SPACE _CHAR , this . tabSize ) ; var tabContent = this . TAB _CHAR + lang . stringRepeat ( "\xa0" , this . tabSize - 1 ) ; } else { var spaceContent = lang . stringRepeat ( "\xa0" , this . tabSize ) ; var tabContent = spaceContent ; }
this . $tabStrings [ " " ] = "<span class='" + className + "'>" + spaceContent + "</span>" ; this . $tabStrings [ "\t" ] = "<span class='" + className + "'>" + tabContent + "</span>" ; } } ; this . updateLines = function ( config , firstRow , lastRow ) { if ( this . config . lastRow != config . lastRow || this . config . firstRow != config . firstRow ) { this . scrollLines ( config ) ; }
this . config = config ; var first = Math . max ( firstRow , config . firstRow ) ; var last = Math . min ( lastRow , config . lastRow ) ; var lineElements = this . element . childNodes ; var lineElementsIdx = 0 ; for ( var row = config . firstRow ; row < first ; row ++ ) { var foldLine = this . session . getFoldLine ( row ) ; if ( foldLine ) { if ( foldLine . containsRow ( first ) ) { first = foldLine . start . row ; break ; } else { row = foldLine . end . row ; } }
lineElementsIdx ++ ; }
var row = first ; var foldLine = this . session . getNextFoldLine ( row ) ; var foldStart = foldLine ? foldLine . start . row : Infinity ; while ( true ) { if ( row > foldStart ) { row = foldLine . end . row + 1 ; foldLine = this . session . getNextFoldLine ( row , foldLine ) ; foldStart = foldLine ? foldLine . start . row : Infinity ; }
if ( row > last )
break ; var lineElement = lineElements [ lineElementsIdx ++ ] ; if ( lineElement ) { var html = [ ] ; this . $renderLine ( html , row , ! this . $useLineGroups ( ) , row == foldStart ? foldLine : false ) ; dom . setInnerHtml ( lineElement , html . join ( "" ) ) ; }
row ++ ; } } ; this . scrollLines = function ( config ) { var oldConfig = this . config ; this . config = config ; if ( ! oldConfig || oldConfig . lastRow < config . firstRow )
return this . update ( config ) ; if ( config . lastRow < oldConfig . firstRow )
return this . update ( config ) ; var el = this . element ; if ( oldConfig . firstRow < config . firstRow )
for ( var row = this . session . getFoldedRowCount ( oldConfig . firstRow , config . firstRow - 1 ) ; row > 0 ; row -- )
el . removeChild ( el . firstChild ) ; if ( oldConfig . lastRow > config . lastRow )
for ( var row = this . session . getFoldedRowCount ( config . lastRow + 1 , oldConfig . lastRow ) ; row > 0 ; row -- )
el . removeChild ( el . lastChild ) ; if ( config . firstRow < oldConfig . firstRow ) { var fragment = this . $renderLinesFragment ( config , config . firstRow , oldConfig . firstRow - 1 ) ; if ( el . firstChild )
el . insertBefore ( fragment , el . firstChild ) ; else
el . appendChild ( fragment ) ; }
if ( config . lastRow > oldConfig . lastRow ) { var fragment = this . $renderLinesFragment ( config , oldConfig . lastRow + 1 , config . lastRow ) ; el . appendChild ( fragment ) ; } } ; this . $renderLinesFragment = function ( config , firstRow , lastRow ) { var fragment = this . element . ownerDocument . createDocumentFragment ( ) ; var row = firstRow ; var foldLine = this . session . getNextFoldLine ( row ) ; var foldStart = foldLine ? foldLine . start . row : Infinity ; while ( true ) { if ( row > foldStart ) { row = foldLine . end . row + 1 ; foldLine = this . session . getNextFoldLine ( row , foldLine ) ; foldStart = foldLine ? foldLine . start . row : Infinity ; }
if ( row > lastRow )
break ; var container = dom . createElement ( "div" ) ; var html = [ ] ; this . $renderLine ( html , row , false , row == foldStart ? foldLine : false ) ; container . innerHTML = html . join ( "" ) ; if ( this . $useLineGroups ( ) ) { container . className = 'ace_line_group' ; fragment . appendChild ( container ) ; } else { var lines = container . childNodes
while ( lines . length )
fragment . appendChild ( lines [ 0 ] ) ; }
row ++ ; }
return fragment ; } ; this . update = function ( config ) { this . config = config ; var html = [ ] ; var firstRow = config . firstRow , lastRow = config . lastRow ; var row = firstRow ; var foldLine = this . session . getNextFoldLine ( row ) ; var foldStart = foldLine ? foldLine . start . row : Infinity ; while ( true ) { if ( row > foldStart ) { row = foldLine . end . row + 1 ; foldLine = this . session . getNextFoldLine ( row , foldLine ) ; foldStart = foldLine ? foldLine . start . row : Infinity ; }
if ( row > lastRow )
break ; if ( this . $useLineGroups ( ) )
html . push ( "<div class='ace_line_group'>" )
this . $renderLine ( html , row , false , row == foldStart ? foldLine : false ) ; if ( this . $useLineGroups ( ) )
html . push ( "</div>" ) ; row ++ ; }
this . element = dom . setInnerHtml ( this . element , html . join ( "" ) ) ; } ; this . $textToken = { "text" : true , "rparen" : true , "lparen" : true } ; this . $renderToken = function ( stringBuilder , screenColumn , token , value ) { var self = this ; var replaceReg = /\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g ; var replaceFunc = function ( c , a , b , tabIdx , idx4 ) { if ( a ) { return self . showInvisibles ? "<span class='ace_invisible'>" + lang . stringRepeat ( self . SPACE _CHAR , c . length ) + "</span>" : lang . stringRepeat ( "\xa0" , c . length ) ; } else if ( c == "&" ) { return "&" ; } else if ( c == "<" ) { return "<" ; } else if ( c == "\t" ) { var tabSize = self . session . getScreenTabSize ( screenColumn + tabIdx ) ; screenColumn += tabSize - 1 ; return self . $tabStrings [ tabSize ] ; } else if ( c == "\u3000" ) { var classToUse = self . showInvisibles ? "ace_cjk ace_invisible" : "ace_cjk" ; var space = self . showInvisibles ? self . SPACE _CHAR : "" ; screenColumn += 1 ; return "<span class='" + classToUse + "' style='width:" + ( self . config . characterWidth * 2 ) + "px'>" + space + "</span>" ; } else if ( b ) { return "<span class='ace_invisible ace_invalid'>" + self . SPACE _CHAR + "</span>" ; } else { screenColumn += 1 ; return "<span class='ace_cjk' style='width:" + ( self . config . characterWidth * 2 ) + "px'>" + c + "</span>" ; } } ; var output = value . replace ( replaceReg , replaceFunc ) ; if ( ! this . $textToken [ token . type ] ) { var classes = "ace_" + token . type . replace ( /\./g , " ace_" ) ; var style = "" ; if ( token . type == "fold" )
style = " style='width:" + ( token . value . length * this . config . characterWidth ) + "px;' " ; stringBuilder . push ( "<span class='" , classes , "'" , style , ">" , output , "</span>" ) ; }
else { stringBuilder . push ( output ) ; }
return screenColumn + value . length ; } ; this . renderIndentGuide = function ( stringBuilder , value , max ) { var cols = value . search ( this . $indentGuideRe ) ; if ( cols <= 0 || cols >= max )
return value ; if ( value [ 0 ] == " " ) { cols -= cols % this . tabSize ; stringBuilder . push ( lang . stringRepeat ( this . $tabStrings [ " " ] , cols / this . tabSize ) ) ; return value . substr ( cols ) ; } else if ( value [ 0 ] == "\t" ) { stringBuilder . push ( lang . stringRepeat ( this . $tabStrings [ "\t" ] , cols ) ) ; return value . substr ( cols ) ; }
return value ; } ; this . $renderWrappedLine = function ( stringBuilder , tokens , splits , onlyContents ) { var chars = 0 ; var split = 0 ; var splitChars = splits [ 0 ] ; var screenColumn = 0 ; for ( var i = 0 ; i < tokens . length ; i ++ ) { var token = tokens [ i ] ; var value = token . value ; if ( i == 0 && this . displayIndentGuides ) { chars = value . length ; value = this . renderIndentGuide ( stringBuilder , value , splitChars ) ; if ( ! value )
continue ; chars -= value . length ; }
if ( chars + value . length < splitChars ) { screenColumn = this . $renderToken ( stringBuilder , screenColumn , token , value ) ; chars += value . length ; } else { while ( chars + value . length >= splitChars ) { screenColumn = this . $renderToken ( stringBuilder , screenColumn , token , value . substring ( 0 , splitChars - chars ) ) ; value = value . substring ( splitChars - chars ) ; chars = splitChars ; if ( ! onlyContents ) { stringBuilder . push ( "</div>" , "<div class='ace_line' style='height:" , this . config . lineHeight , "px'>" ) ; }
split ++ ; screenColumn = 0 ; splitChars = splits [ split ] || Number . MAX _VALUE ; }
if ( value . length != 0 ) { chars += value . length ; screenColumn = this . $renderToken ( stringBuilder , screenColumn , token , value ) ; } } } } ; this . $renderSimpleLine = function ( stringBuilder , tokens ) { var screenColumn = 0 ; var token = tokens [ 0 ] ; var value = token . value ; if ( this . displayIndentGuides )
value = this . renderIndentGuide ( stringBuilder , value ) ; if ( value )
screenColumn = this . $renderToken ( stringBuilder , screenColumn , token , value ) ; for ( var i = 1 ; i < tokens . length ; i ++ ) { token = tokens [ i ] ; value = token . value ; screenColumn = this . $renderToken ( stringBuilder , screenColumn , token , value ) ; } } ; this . $renderLine = function ( stringBuilder , row , onlyContents , foldLine ) { if ( ! foldLine && foldLine != false )
foldLine = this . session . getFoldLine ( row ) ; if ( foldLine )
var tokens = this . $getFoldLineTokens ( row , foldLine ) ; else
var tokens = this . session . getTokens ( row ) ; if ( ! onlyContents ) { stringBuilder . push ( "<div class='ace_line' style='height:" , this . config . lineHeight , "px'>" ) ; }
if ( tokens . length ) { var splits = this . session . getRowSplitData ( row ) ; if ( splits && splits . length )
this . $renderWrappedLine ( stringBuilder , tokens , splits , onlyContents ) ; else
this . $renderSimpleLine ( stringBuilder , tokens ) ; }
if ( this . showInvisibles ) { if ( foldLine )
row = foldLine . end . row
stringBuilder . push ( "<span class='ace_invisible'>" , row == this . session . getLength ( ) - 1 ? this . EOF _CHAR : this . EOL _CHAR , "</span>" ) ; }
if ( ! onlyContents )
stringBuilder . push ( "</div>" ) ; } ; this . $getFoldLineTokens = function ( row , foldLine ) { var session = this . session ; var renderTokens = [ ] ; function addTokens ( tokens , from , to ) { var idx = 0 , col = 0 ; while ( ( col + tokens [ idx ] . value . length ) < from ) { col += tokens [ idx ] . value . length ; idx ++ ; if ( idx == tokens . length )
return ; }
if ( col != from ) { var value = tokens [ idx ] . value . substring ( from - col ) ; if ( value . length > ( to - from ) )
value = value . substring ( 0 , to - from ) ; renderTokens . push ( { type : tokens [ idx ] . type , value : value } ) ; col = from + value . length ; idx += 1 ; }
while ( col < to && idx < tokens . length ) { var value = tokens [ idx ] . value ; if ( value . length + col > to ) { renderTokens . push ( { type : tokens [ idx ] . type , value : value . substring ( 0 , to - col ) } ) ; } else
renderTokens . push ( tokens [ idx ] ) ; col += value . length ; idx += 1 ; } }
var tokens = session . getTokens ( row ) ; foldLine . walk ( function ( placeholder , row , column , lastColumn , isNewRow ) { if ( placeholder != null ) { renderTokens . push ( { type : "fold" , value : placeholder } ) ; } else { if ( isNewRow )
tokens = session . getTokens ( row ) ; if ( tokens . length )
addTokens ( tokens , lastColumn , column ) ; } } , foldLine . end . row , this . session . getLine ( foldLine . end . row ) . length ) ; return renderTokens ; } ; this . $useLineGroups = function ( ) { return this . session . getUseWrapMode ( ) ; } ; this . destroy = function ( ) { clearInterval ( this . $pollSizeChangesTimer ) ; if ( this . $measureNode )
this . $measureNode . parentNode . removeChild ( this . $measureNode ) ; delete this . $measureNode ; } ; } ) . call ( Text . prototype ) ; exports . Text = Text ; } ) ; define ( 'ace/layer/cursor' , [ 'require' , 'exports' , 'module' , 'ace/lib/dom' ] , function ( require , exports , module ) { var dom = require ( "../lib/dom" ) ; var Cursor = function ( parentEl ) { this . element = dom . createElement ( "div" ) ; this . element . className = "ace_layer ace_cursor-layer" ; parentEl . appendChild ( this . element ) ; this . isVisible = false ; this . isBlinking = true ; this . blinkInterval = 1000 ; this . smoothBlinking = false ; this . cursors = [ ] ; this . cursor = this . addCursor ( ) ; dom . addCssClass ( this . element , "ace_hidden-cursors" ) ; } ; ( function ( ) { this . $padding = 0 ; this . setPadding = function ( padding ) { this . $padding = padding ; } ; this . setSession = function ( session ) { this . session = session ; } ; this . setBlinking = function ( blinking ) { if ( blinking != this . isBlinking ) { this . isBlinking = blinking ; this . restartTimer ( ) ; } } ; this . setBlinkInterval = function ( blinkInterval ) { if ( blinkInterval != this . blinkInterval ) { this . blinkInterval = blinkInterval ; this . restartTimer ( ) ; } } ; this . setSmoothBlinking = function ( smoothBlinking ) { if ( smoothBlinking != this . smoothBlinking ) { this . smoothBlinking = smoothBlinking ; if ( smoothBlinking )
dom . addCssClass ( this . element , "ace_smooth-blinking" ) ; else
dom . removeCssClass ( this . element , "ace_smooth-blinking" ) ; this . restartTimer ( ) ; } } ; this . addCursor = function ( ) { var el = dom . createElement ( "div" ) ; el . className = "ace_cursor" ; this . element . appendChild ( el ) ; this . cursors . push ( el ) ; return el ; } ; this . removeCursor = function ( ) { if ( this . cursors . length > 1 ) { var el = this . cursors . pop ( ) ; el . parentNode . removeChild ( el ) ; return el ; } } ; this . hideCursor = function ( ) { this . isVisible = false ; dom . addCssClass ( this . element , "ace_hidden-cursors" ) ; this . restartTimer ( ) ; } ; this . showCursor = function ( ) { this . isVisible = true ; dom . removeCssClass ( this . element , "ace_hidden-cursors" ) ; this . restartTimer ( ) ; } ; this . restartTimer = function ( ) { clearInterval ( this . intervalId ) ; clearTimeout ( this . timeoutId ) ; if ( this . smoothBlinking )
dom . removeCssClass ( this . element , "ace_smooth-blinking" ) ; for ( var i = this . cursors . length ; i -- ; )
this . cursors [ i ] . style . opacity = "" ; if ( ! this . isBlinking || ! this . blinkInterval || ! this . isVisible )
return ; if ( this . smoothBlinking )
setTimeout ( function ( ) { dom . addCssClass ( this . element , "ace_smooth-blinking" ) ; } . bind ( this ) ) ; var blink = function ( ) { this . timeoutId = setTimeout ( function ( ) { for ( var i = this . cursors . length ; i -- ; ) { this . cursors [ i ] . style . opacity = 0 ; } } . bind ( this ) , 0.6 * this . blinkInterval ) ; } . bind ( this ) ; this . intervalId = setInterval ( function ( ) { for ( var i = this . cursors . length ; i -- ; ) { this . cursors [ i ] . style . opacity = "" ; }
blink ( ) ; } . bind ( this ) , this . blinkInterval ) ; blink ( ) ; } ; this . getPixelPosition = function ( position , onScreen ) { if ( ! this . config || ! this . session )
return { left : 0 , top : 0 } ; if ( ! position )
position = this . session . selection . getCursor ( ) ; var pos = this . session . documentToScreenPosition ( position ) ; var cursorLeft = this . $padding + pos . column * this . config . characterWidth ; var cursorTop = ( pos . row - ( onScreen ? this . config . firstRowScreen : 0 ) ) * this . config . lineHeight ; return { left : cursorLeft , top : cursorTop } ; } ; this . update = function ( config ) { this . config = config ; var selections = this . session . $selectionMarkers ; var i = 0 , cursorIndex = 0 ; if ( selections === undefined || selections . length === 0 ) { selections = [ { cursor : null } ] ; }
for ( var i = 0 , n = selections . length ; i < n ; i ++ ) { var pixelPos = this . getPixelPosition ( selections [ i ] . cursor , true ) ; if ( ( pixelPos . top > config . height + config . offset || pixelPos . top < - config . offset ) && i > 1 ) { continue ; }
var style = ( this . cursors [ cursorIndex ++ ] || this . addCursor ( ) ) . style ; style . left = pixelPos . left + "px" ; style . top = pixelPos . top + "px" ; style . width = config . characterWidth + "px" ; style . height = config . lineHeight + "px" ; }
while ( this . cursors . length > cursorIndex )
this . removeCursor ( ) ; var overwrite = this . session . getOverwrite ( ) ; this . $setOverwrite ( overwrite ) ; this . $pixelPos = pixelPos ; this . restartTimer ( ) ; } ; this . $setOverwrite = function ( overwrite ) { if ( overwrite != this . overwrite ) { this . overwrite = overwrite ; if ( overwrite )
dom . addCssClass ( this . element , "ace_overwrite-cursors" ) ; else
dom . removeCssClass ( this . element , "ace_overwrite-cursors" ) ; } } ; this . destroy = function ( ) { clearInterval ( this . intervalId ) ; clearTimeout ( this . timeoutId ) ; } ; } ) . call ( Cursor . prototype ) ; exports . Cursor = Cursor ; } ) ; define ( 'ace/scrollbar' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/dom' , 'ace/lib/event' , 'ace/lib/event_emitter' ] , function ( require , exports , module ) { var oop = require ( "./lib/oop" ) ; var dom = require ( "./lib/dom" ) ; var event = require ( "./lib/event" ) ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var ScrollBarV = function ( parent , renderer ) { this . element = dom . createElement ( "div" ) ; this . element . className = "ace_scrollbar" ; this . inner = dom . createElement ( "div" ) ; this . inner . className = "ace_scrollbar-inner" ; this . element . appendChild ( this . inner ) ; parent . appendChild ( this . element ) ; renderer . $scrollbarWidth = this . width = dom . scrollbarWidth ( parent . ownerDocument ) ; renderer . $scrollbarWidth = this . width = dom . scrollbarWidth ( parent . ownerDocument ) ; this . fullWidth = this . width ; this . inner . style . width = this . element . style . width = ( this . width || 15 ) + 5 + "px" ; this . setVisible ( false ) ; this . element . style . overflowY = "scroll" ; event . addListener ( this . element , "scroll" , this . onScrollV . bind ( this ) ) ; event . addListener ( this . element , "mousedown" , event . preventDefault ) ; } ; var ScrollBarH = function ( parent , renderer ) { this . element = dom . createElement ( "div" ) ; this . element . className = "ace_scrollbar-h" ; this . inner = dom . createElement ( "div" ) ; this . inner . className = "ace_scrollbar-inner" ; this . element . appendChild ( this . inner ) ; parent . appendChild ( this . element ) ; this . height = renderer . $scrollbarWidth ; this . fullHeight = this . height ; this . inner . style . height = this . element . style . height = ( this . height || 15 ) + 5 + "px" ; this . setVisible ( false ) ; this . element . style . overflowX = "scroll" ; event . addListener ( this . element , "scroll" , this . onScrollH . bind ( this ) ) ; event . addListener ( this . element , "mousedown" , event . preventDefault ) ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . setVisible = function ( show ) { if ( show ) { this . element . style . display = "" ; if ( this . fullWidth )
this . width = this . fullWidth ; if ( this . fullHeight )
this . height = this . fullHeight ; } else { this . element . style . display = "none" ; this . height = this . width = 0 ; } } ; this . onScrollV = function ( ) { if ( ! this . skipEvent ) { this . scrollTop = this . element . scrollTop ; this . _emit ( "scroll" , { data : this . scrollTop } ) ; }
this . skipEvent = false ; } ; this . onScrollH = function ( ) { if ( ! this . skipEvent ) { this . scrollLeft = this . element . scrollLeft ; this . _emit ( "scroll" , { data : this . scrollLeft } ) ; }
this . skipEvent = false ; } ; this . getWidth = function ( ) { return this . width ; } ; this . getHeight = function ( ) { return this . height ; } ; this . setHeight = function ( height ) { this . element . style . height = height + "px" ; } ; this . setWidth = function ( width ) { this . element . style . width = width + "px" ; } ; this . setInnerHeight = function ( height ) { this . inner . style . height = height + "px" ; } ; this . setInnerWidth = function ( width ) { this . inner . style . width = width + "px" ; } ; this . setScrollTop = function ( scrollTop ) { if ( this . scrollTop != scrollTop ) { this . skipEvent = true ; this . scrollTop = this . element . scrollTop = scrollTop ; } } ; this . setScrollLeft = function ( scrollLeft ) { if ( this . scrollLeft != scrollLeft ) { this . skipEvent = true ; this . scrollLeft = this . element . scrollLeft = scrollLeft ; } } ; } ) . call ( ScrollBarV . prototype ) ; ScrollBarH . prototype = ScrollBarV . prototype ; exports . ScrollBar = ScrollBarV ; exports . ScrollBarV = ScrollBarV ; exports . ScrollBarH = ScrollBarH ; } ) ; define ( 'ace/renderloop' , [ 'require' , 'exports' , 'module' , 'ace/lib/event' ] , function ( require , exports , module ) { var event = require ( "./lib/event" ) ; var RenderLoop = function ( onRender , win ) { this . onRender = onRender ; this . pending = false ; this . changes = 0 ; this . window = win || window ; } ; ( function ( ) { this . schedule = function ( change ) { this . changes = this . changes | change ; if ( ! this . pending ) { this . pending = true ; var _self = this ; event . nextFrame ( function ( ) { _self . pending = false ; var changes ; while ( changes = _self . changes ) { _self . changes = 0 ; _self . onRender ( changes ) ; } } , this . window ) ; } } ; } ) . call ( RenderLoop . prototype ) ; exports . RenderLoop = RenderLoop ; } ) ; define ( 'ace/multi_select' , [ 'require' , 'exports' , 'module' , 'ace/range_list' , 'ace/range' , 'ace/selection' , 'ace/mouse/multi_select_handler' , 'ace/lib/event' , 'ace/lib/lang' , 'ace/commands/multi_select_commands' , 'ace/search' , 'ace/edit_session' , 'ace/editor' , 'ace/config' ] , function ( require , exports , module ) { var RangeList = require ( "./range_list" ) . RangeList ; var Range = require ( "./range" ) . Range ; var Selection = require ( "./selection" ) . Selection ; var onMouseDown = require ( "./mouse/multi_select_handler" ) . onMouseDown ; var event = require ( "./lib/event" ) ; var lang = require ( "./lib/lang" ) ; var commands = require ( "./commands/multi_select_commands" ) ; exports . commands = commands . defaultCommands . concat ( commands . multiSelectCommands ) ; var Search = require ( "./search" ) . Search ; var search = new Search ( ) ; function find ( session , needle , dir ) { search . $options . wrap = true ; search . $options . needle = needle ; search . $options . backwards = dir == - 1 ; return search . find ( session ) ; }
var EditSession = require ( "./edit_session" ) . EditSession ; ( function ( ) { this . getSelectionMarkers = function ( ) { return this . $selectionMarkers ; } ; } ) . call ( EditSession . prototype ) ; ( function ( ) { this . ranges = null ; this . rangeList = null ; this . addRange = function ( range , $blockChangeEvents ) { if ( ! range )
return ; if ( ! this . inMultiSelectMode && this . rangeCount == 0 ) { var oldRange = this . toOrientedRange ( ) ; this . rangeList . add ( oldRange ) ; this . rangeList . add ( range ) ; if ( this . rangeList . ranges . length != 2 ) { this . rangeList . removeAll ( ) ; return $blockChangeEvents || this . fromOrientedRange ( range ) ; }
this . rangeList . removeAll ( ) ; this . rangeList . add ( oldRange ) ; this . $onAddRange ( oldRange ) ; }
if ( ! range . cursor )
range . cursor = range . end ; var removed = this . rangeList . add ( range ) ; this . $onAddRange ( range ) ; if ( removed . length )
this . $onRemoveRange ( removed ) ; if ( this . rangeCount > 1 && ! this . inMultiSelectMode ) { this . _emit ( "multiSelect" ) ; this . inMultiSelectMode = true ; this . session . $undoSelect = false ; this . rangeList . attach ( this . session ) ; }
return $blockChangeEvents || this . fromOrientedRange ( range ) ; } ; this . toSingleRange = function ( range ) { range = range || this . ranges [ 0 ] ; var removed = this . rangeList . removeAll ( ) ; if ( removed . length )
this . $onRemoveRange ( removed ) ; range && this . fromOrientedRange ( range ) ; } ; this . substractPoint = function ( pos ) { var removed = this . rangeList . substractPoint ( pos ) ; if ( removed ) { this . $onRemoveRange ( removed ) ; return removed [ 0 ] ; } } ; this . mergeOverlappingRanges = function ( ) { var removed = this . rangeList . merge ( ) ; if ( removed . length )
this . $onRemoveRange ( removed ) ; else if ( this . ranges [ 0 ] )
this . fromOrientedRange ( this . ranges [ 0 ] ) ; } ; this . $onAddRange = function ( range ) { this . rangeCount = this . rangeList . ranges . length ; this . ranges . unshift ( range ) ; this . _emit ( "addRange" , { range : range } ) ; } ; this . $onRemoveRange = function ( removed ) { this . rangeCount = this . rangeList . ranges . length ; if ( this . rangeCount == 1 && this . inMultiSelectMode ) { var lastRange = this . rangeList . ranges . pop ( ) ; removed . push ( lastRange ) ; this . rangeCount = 0 ; }
for ( var i = removed . length ; i -- ; ) { var index = this . ranges . indexOf ( removed [ i ] ) ; this . ranges . splice ( index , 1 ) ; }
this . _emit ( "removeRange" , { ranges : removed } ) ; if ( this . rangeCount == 0 && this . inMultiSelectMode ) { this . inMultiSelectMode = false ; this . _emit ( "singleSelect" ) ; this . session . $undoSelect = true ; this . rangeList . detach ( this . session ) ; }
lastRange = lastRange || this . ranges [ 0 ] ; if ( lastRange && ! lastRange . isEqual ( this . getRange ( ) ) )
this . fromOrientedRange ( lastRange ) ; } ; this . $initRangeList = function ( ) { if ( this . rangeList )
return ; this . rangeList = new RangeList ( ) ; this . ranges = [ ] ; this . rangeCount = 0 ; } ; this . getAllRanges = function ( ) { return this . rangeCount ? this . rangeList . ranges . concat ( ) : [ this . getRange ( ) ] ; } ; this . splitIntoLines = function ( ) { if ( this . rangeCount > 1 ) { var ranges = this . rangeList . ranges ; var lastRange = ranges [ ranges . length - 1 ] ; var range = Range . fromPoints ( ranges [ 0 ] . start , lastRange . end ) ; this . toSingleRange ( ) ; this . setSelectionRange ( range , lastRange . cursor == lastRange . start ) ; } else { var range = this . getRange ( ) ; var isBackwards = this . isBackwards ( ) ; var startRow = range . start . row ; var endRow = range . end . row ; if ( startRow == endRow ) { if ( isBackwards )
var start = range . end , end = range . start ; else
var start = range . start , end = range . end ; this . addRange ( Range . fromPoints ( end , end ) ) ; this . addRange ( Range . fromPoints ( start , start ) ) ; return ; }
var rectSel = [ ] ; var r = this . getLineRange ( startRow , true ) ; r . start . column = range . start . column ; rectSel . push ( r ) ; for ( var i = startRow + 1 ; i < endRow ; i ++ )
rectSel . push ( this . getLineRange ( i , true ) ) ; r = this . getLineRange ( endRow , true ) ; r . end . column = range . end . column ; rectSel . push ( r ) ; rectSel . forEach ( this . addRange , this ) ; } } ; this . toggleBlockSelection = function ( ) { if ( this . rangeCount > 1 ) { var ranges = this . rangeList . ranges ; var lastRange = ranges [ ranges . length - 1 ] ; var range = Range . fromPoints ( ranges [ 0 ] . start , lastRange . end ) ; this . toSingleRange ( ) ; this . setSelectionRange ( range , lastRange . cursor == lastRange . start ) ; } else { var cursor = this . session . documentToScreenPosition ( this . selectionLead ) ; var anchor = this . session . documentToScreenPosition ( this . selectionAnchor ) ; var rectSel = this . rectangularRangeBlock ( cursor , anchor ) ; rectSel . forEach ( this . addRange , this ) ; } } ; this . rectangularRangeBlock = function ( screenCursor , screenAnchor , includeEmptyLines ) { var rectSel = [ ] ; var xBackwards = screenCursor . column < screenAnchor . column ; if ( xBackwards ) { var startColumn = screenCursor . column ; var endColumn = screenAnchor . column ; } else { var startColumn = screenAnchor . column ; var endColumn = screenCursor . column ; }
var yBackwards = screenCursor . row < screenAnchor . row ; if ( yBackwards ) { var startRow = screenCursor . row ; var endRow = screenAnchor . row ; } else { var startRow = screenAnchor . row ; var endRow = screenCursor . row ; }
if ( startColumn < 0 )
startColumn = 0 ; if ( startRow < 0 )
startRow = 0 ; if ( startRow == endRow )
includeEmptyLines = true ; for ( var row = startRow ; row <= endRow ; row ++ ) { var range = Range . fromPoints ( this . session . screenToDocumentPosition ( row , startColumn ) , this . session . screenToDocumentPosition ( row , endColumn ) ) ; if ( range . isEmpty ( ) ) { if ( docEnd && isSamePoint ( range . end , docEnd ) )
break ; var docEnd = range . end ; }
range . cursor = xBackwards ? range . start : range . end ; rectSel . push ( range ) ; }
if ( yBackwards )
rectSel . reverse ( ) ; if ( ! includeEmptyLines ) { var end = rectSel . length - 1 ; while ( rectSel [ end ] . isEmpty ( ) && end > 0 )
end -- ; if ( end > 0 ) { var start = 0 ; while ( rectSel [ start ] . isEmpty ( ) )
start ++ ; }
for ( var i = end ; i >= start ; i -- ) { if ( rectSel [ i ] . isEmpty ( ) )
rectSel . splice ( i , 1 ) ; } }
return rectSel ; } ; } ) . call ( Selection . prototype ) ; var Editor = require ( "./editor" ) . Editor ; ( function ( ) { this . updateSelectionMarkers = function ( ) { this . renderer . updateCursor ( ) ; this . renderer . updateBackMarkers ( ) ; } ; this . addSelectionMarker = function ( orientedRange ) { if ( ! orientedRange . cursor )
orientedRange . cursor = orientedRange . end ; var style = this . getSelectionStyle ( ) ; orientedRange . marker = this . session . addMarker ( orientedRange , "ace_selection" , style ) ; this . session . $selectionMarkers . push ( orientedRange ) ; this . session . selectionMarkerCount = this . session . $selectionMarkers . length ; return orientedRange ; } ; this . removeSelectionMarker = function ( range ) { if ( ! range . marker )
return ; this . session . removeMarker ( range . marker ) ; var index = this . session . $selectionMarkers . indexOf ( range ) ; if ( index != - 1 )
this . session . $selectionMarkers . splice ( index , 1 ) ; this . session . selectionMarkerCount = this . session . $selectionMarkers . length ; } ; this . removeSelectionMarkers = function ( ranges ) { var markerList = this . session . $selectionMarkers ; for ( var i = ranges . length ; i -- ; ) { var range = ranges [ i ] ; if ( ! range . marker )
continue ; this . session . removeMarker ( range . marker ) ; var index = markerList . indexOf ( range ) ; if ( index != - 1 )
markerList . splice ( index , 1 ) ; }
this . session . selectionMarkerCount = markerList . length ; } ; this . $onAddRange = function ( e ) { this . addSelectionMarker ( e . range ) ; this . renderer . updateCursor ( ) ; this . renderer . updateBackMarkers ( ) ; } ; this . $onRemoveRange = function ( e ) { this . removeSelectionMarkers ( e . ranges ) ; this . renderer . updateCursor ( ) ; this . renderer . updateBackMarkers ( ) ; } ; this . $onMultiSelect = function ( e ) { if ( this . inMultiSelectMode )
return ; this . inMultiSelectMode = true ; this . setStyle ( "ace_multiselect" ) ; this . keyBinding . addKeyboardHandler ( commands . keyboardHandler ) ; this . commands . setDefaultHandler ( "exec" , this . $onMultiSelectExec ) ; this . renderer . updateCursor ( ) ; this . renderer . updateBackMarkers ( ) ; } ; this . $onSingleSelect = function ( e ) { if ( this . session . multiSelect . inVirtualMode )
return ; this . inMultiSelectMode = false ; this . unsetStyle ( "ace_multiselect" ) ; this . keyBinding . removeKeyboardHandler ( commands . keyboardHandler ) ; this . commands . removeDefaultHandler ( "exec" , this . $onMultiSelectExec ) ; this . renderer . updateCursor ( ) ; this . renderer . updateBackMarkers ( ) ; } ; this . $onMultiSelectExec = function ( e ) { var command = e . command ; var editor = e . editor ; if ( ! editor . multiSelect )
return ; if ( ! command . multiSelectAction ) { var result = command . exec ( editor , e . args || { } ) ; editor . multiSelect . addRange ( editor . multiSelect . toOrientedRange ( ) ) ; editor . multiSelect . mergeOverlappingRanges ( ) ; } else if ( command . multiSelectAction == "forEach" ) { result = editor . forEachSelection ( command , e . args ) ; } else if ( command . multiSelectAction == "forEachLine" ) { result = editor . forEachSelection ( command , e . args , true ) ; } else if ( command . multiSelectAction == "single" ) { editor . exitMultiSelectMode ( ) ; result = command . exec ( editor , e . args || { } ) ; } else { result = command . multiSelectAction ( editor , e . args || { } ) ; }
return result ; } ; this . forEachSelection = function ( cmd , args , $byLines ) { if ( this . inVirtualSelectionMode )
return ; var session = this . session ; var selection = this . selection ; var rangeList = selection . rangeList ; var result ; var reg = selection . _eventRegistry ; selection . _eventRegistry = { } ; var tmpSel = new Selection ( session ) ; this . inVirtualSelectionMode = true ; for ( var i = rangeList . ranges . length ; i -- ; ) { if ( $byLines ) { while ( i > 0 && rangeList . ranges [ i ] . start . row == rangeList . ranges [ i - 1 ] . end . row )
i -- ; }
tmpSel . fromOrientedRange ( rangeList . ranges [ i ] ) ; this . selection = session . selection = tmpSel ; var cmdResult = cmd . exec ( this , args || { } ) ; if ( ! result == undefined )
result = cmdResult ; tmpSel . toOrientedRange ( rangeList . ranges [ i ] ) ; }
tmpSel . detach ( ) ; this . selection = session . selection = selection ; this . inVirtualSelectionMode = false ; selection . _eventRegistry = reg ; selection . mergeOverlappingRanges ( ) ; var anim = this . renderer . $scrollAnimation ; this . onCursorChange ( ) ; this . onSelectionChange ( ) ; if ( anim && anim . from == anim . to )
this . renderer . animateScrolling ( anim . from ) ; return result ; } ; this . exitMultiSelectMode = function ( ) { if ( ! this . inMultiSelectMode || this . inVirtualSelectionMode )
return ; this . multiSelect . toSingleRange ( ) ; } ; this . getSelectedText = function ( ) { var text = "" ; if ( this . inMultiSelectMode && ! this . inVirtualSelectionMode ) { var ranges = this . multiSelect . rangeList . ranges ; var buf = [ ] ; for ( var i = 0 ; i < ranges . length ; i ++ ) { buf . push ( this . session . getTextRange ( ranges [ i ] ) ) ; }
var nl = this . session . getDocument ( ) . getNewLineCharacter ( ) ; text = buf . join ( nl ) ; if ( text . length == ( buf . length - 1 ) * nl . length )
text = "" ; } else if ( ! this . selection . isEmpty ( ) ) { text = this . session . getTextRange ( this . getSelectionRange ( ) ) ; }
return text ; } ; this . onPaste = function ( text ) { if ( this . $readOnly )
return ; this . _signal ( "paste" , text ) ; if ( ! this . inMultiSelectMode || this . inVirtualSelectionMode )
return this . insert ( text ) ; var lines = text . split ( /\r\n|\r|\n/ ) ; var ranges = this . selection . rangeList . ranges ; if ( lines . length > ranges . length || lines . length < 2 || ! lines [ 1 ] )
return this . commands . exec ( "insertstring" , this , text ) ; for ( var i = ranges . length ; i -- ; ) { var range = ranges [ i ] ; if ( ! range . isEmpty ( ) )
this . session . remove ( range ) ; this . session . insert ( range . start , lines [ i ] ) ; } } ; this . findAll = function ( needle , options , additive ) { options = options || { } ; options . needle = needle || options . needle ; this . $search . set ( options ) ; var ranges = this . $search . findAll ( this . session ) ; if ( ! ranges . length )
return 0 ; this . $blockScrolling += 1 ; var selection = this . multiSelect ; if ( ! additive )
selection . toSingleRange ( ranges [ 0 ] ) ; for ( var i = ranges . length ; i -- ; )
selection . addRange ( ranges [ i ] , true ) ; this . $blockScrolling -= 1 ; return ranges . length ; } ; this . selectMoreLines = function ( dir , skip ) { var range = this . selection . toOrientedRange ( ) ; var isBackwards = range . cursor == range . end ; var screenLead = this . session . documentToScreenPosition ( range . cursor ) ; if ( this . selection . $desiredColumn )
screenLead . column = this . selection . $desiredColumn ; var lead = this . session . screenToDocumentPosition ( screenLead . row + dir , screenLead . column ) ; if ( ! range . isEmpty ( ) ) { var screenAnchor = this . session . documentToScreenPosition ( isBackwards ? range . end : range . start ) ; var anchor = this . session . screenToDocumentPosition ( screenAnchor . row + dir , screenAnchor . column ) ; } else { var anchor = lead ; }
if ( isBackwards ) { var newRange = Range . fromPoints ( lead , anchor ) ; newRange . cursor = newRange . start ; } else { var newRange = Range . fromPoints ( anchor , lead ) ; newRange . cursor = newRange . end ; }
newRange . desiredColumn = screenLead . column ; if ( ! this . selection . inMultiSelectMode ) { this . selection . addRange ( range ) ; } else { if ( skip )
var toRemove = range . cursor ; }
this . selection . addRange ( newRange ) ; if ( toRemove )
this . selection . substractPoint ( toRemove ) ; } ; this . transposeSelections = function ( dir ) { var session = this . session ; var sel = session . multiSelect ; var all = sel . ranges ; for ( var i = all . length ; i -- ; ) { var range = all [ i ] ; if ( range . isEmpty ( ) ) { var tmp = session . getWordRange ( range . start . row , range . start . column ) ; range . start . row = tmp . start . row ; range . start . column = tmp . start . column ; range . end . row = tmp . end . row ; range . end . column = tmp . end . column ; } }
sel . mergeOverlappingRanges ( ) ; var words = [ ] ; for ( var i = all . length ; i -- ; ) { var range = all [ i ] ; words . unshift ( session . getTextRange ( range ) ) ; }
if ( dir < 0 )
words . unshift ( words . pop ( ) ) ; else
words . push ( words . shift ( ) ) ; for ( var i = all . length ; i -- ; ) { var range = all [ i ] ; var tmp = range . clone ( ) ; session . replace ( range , words [ i ] ) ; range . start . row = tmp . start . row ; range . start . column = tmp . start . column ; } } ; this . selectMore = function ( dir , skip ) { var session = this . session ; var sel = session . multiSelect ; var range = sel . toOrientedRange ( ) ; if ( range . isEmpty ( ) ) { var range = session . getWordRange ( range . start . row , range . start . column ) ; range . cursor = dir == - 1 ? range . start : range . end ; this . multiSelect . addRange ( range ) ; return ; }
var needle = session . getTextRange ( range ) ; var newRange = find ( session , needle , dir ) ; if ( newRange ) { newRange . cursor = dir == - 1 ? newRange . start : newRange . end ; this . multiSelect . addRange ( newRange ) ; }
if ( skip )
this . multiSelect . substractPoint ( range . cursor ) ; } ; this . alignCursors = function ( ) { var session = this . session ; var sel = session . multiSelect ; var ranges = sel . ranges ; if ( ! ranges . length ) { var range = this . selection . getRange ( ) ; var fr = range . start . row , lr = range . end . row ; var lines = this . session . doc . removeLines ( fr , lr ) ; lines = this . $reAlignText ( lines ) ; this . session . doc . insertLines ( fr , lines ) ; range . start . column = 0 ; range . end . column = lines [ lines . length - 1 ] . length ; this . selection . setRange ( range ) ; } else { var row = - 1 ; var sameRowRanges = ranges . filter ( function ( r ) { if ( r . cursor . row == row )
return true ; row = r . cursor . row ; } ) ; sel . $onRemoveRange ( sameRowRanges ) ; var maxCol = 0 ; var minSpace = Infinity ; var spaceOffsets = ranges . map ( function ( r ) { var p = r . cursor ; var line = session . getLine ( p . row ) ; var spaceOffset = line . substr ( p . column ) . search ( /\S/g ) ; if ( spaceOffset == - 1 )
spaceOffset = 0 ; if ( p . column > maxCol )
maxCol = p . column ; if ( spaceOffset < minSpace )
minSpace = spaceOffset ; return spaceOffset ; } ) ; ranges . forEach ( function ( r , i ) { var p = r . cursor ; var l = maxCol - p . column ; var d = spaceOffsets [ i ] - minSpace ; if ( l > d )
session . insert ( p , lang . stringRepeat ( " " , l - d ) ) ; else
session . remove ( new Range ( p . row , p . column , p . row , p . column - l + d ) ) ; r . start . column = r . end . column = maxCol ; r . start . row = r . end . row = p . row ; r . cursor = r . end ; } ) ; sel . fromOrientedRange ( ranges [ 0 ] ) ; this . renderer . updateCursor ( ) ; this . renderer . updateBackMarkers ( ) ; } } ; this . $reAlignText = function ( lines ) { var isLeftAligned = true , isRightAligned = true ; var startW , textW , endW ; return lines . map ( function ( line ) { var m = line . match ( /(\s*)(.*?)(\s*)([=:].*)/ ) ; if ( ! m )
return [ line ] ; if ( startW == null ) { startW = m [ 1 ] . length ; textW = m [ 2 ] . length ; endW = m [ 3 ] . length ; return m ; }
if ( startW + textW + endW != m [ 1 ] . length + m [ 2 ] . length + m [ 3 ] . length )
isRightAligned = false ; if ( startW != m [ 1 ] . length )
isLeftAligned = false ; if ( startW > m [ 1 ] . length )
startW = m [ 1 ] . length ; if ( textW < m [ 2 ] . length )
textW = m [ 2 ] . length ; if ( endW > m [ 3 ] . length )
endW = m [ 3 ] . length ; return m ; } ) . map ( isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign ) ; function spaces ( n ) { return lang . stringRepeat ( " " , n ) ; }
function alignLeft ( m ) { return ! m [ 2 ] ? m [ 0 ] : spaces ( startW ) + m [ 2 ] + spaces ( textW - m [ 2 ] . length + endW ) + m [ 4 ] . replace ( /^([=:])\s+/ , "$1 " ) }
function alignRight ( m ) { return ! m [ 2 ] ? m [ 0 ] : spaces ( startW + textW - m [ 2 ] . length ) + m [ 2 ] + spaces ( endW , " " ) + m [ 4 ] . replace ( /^([=:])\s+/ , "$1 " ) }
function unAlign ( m ) { return ! m [ 2 ] ? m [ 0 ] : spaces ( startW ) + m [ 2 ] + spaces ( endW ) + m [ 4 ] . replace ( /^([=:])\s+/ , "$1 " ) } } } ) . call ( Editor . prototype ) ; function isSamePoint ( p1 , p2 ) { return p1 . row == p2 . row && p1 . column == p2 . column ; }
exports . onSessionChange = function ( e ) { var session = e . session ; if ( ! session . multiSelect ) { session . $selectionMarkers = [ ] ; session . selection . $initRangeList ( ) ; session . multiSelect = session . selection ; }
this . multiSelect = session . multiSelect ; var oldSession = e . oldSession ; if ( oldSession ) { oldSession . multiSelect . removeEventListener ( "addRange" , this . $onAddRange ) ; oldSession . multiSelect . removeEventListener ( "removeRange" , this . $onRemoveRange ) ; oldSession . multiSelect . removeEventListener ( "multiSelect" , this . $onMultiSelect ) ; oldSession . multiSelect . removeEventListener ( "singleSelect" , this . $onSingleSelect ) ; }
session . multiSelect . on ( "addRange" , this . $onAddRange ) ; session . multiSelect . on ( "removeRange" , this . $onRemoveRange ) ; session . multiSelect . on ( "multiSelect" , this . $onMultiSelect ) ; session . multiSelect . on ( "singleSelect" , this . $onSingleSelect ) ; if ( this . inMultiSelectMode != session . selection . inMultiSelectMode ) { if ( session . selection . inMultiSelectMode )
this . $onMultiSelect ( ) ; else
this . $onSingleSelect ( ) ; } } ; function MultiSelect ( editor ) { if ( editor . $multiselectOnSessionChange )
return ; editor . $onAddRange = editor . $onAddRange . bind ( editor ) ; editor . $onRemoveRange = editor . $onRemoveRange . bind ( editor ) ; editor . $onMultiSelect = editor . $onMultiSelect . bind ( editor ) ; editor . $onSingleSelect = editor . $onSingleSelect . bind ( editor ) ; editor . $multiselectOnSessionChange = exports . onSessionChange . bind ( editor ) ; editor . $multiselectOnSessionChange ( editor ) ; editor . on ( "changeSession" , editor . $multiselectOnSessionChange ) ; editor . on ( "mousedown" , onMouseDown ) ; editor . commands . addCommands ( commands . defaultCommands ) ; addAltCursorListeners ( editor ) ; }
function addAltCursorListeners ( editor ) { var el = editor . textInput . getElement ( ) ; var altCursor = false ; event . addListener ( el , "keydown" , function ( e ) { if ( e . keyCode == 18 && ! ( e . ctrlKey || e . shiftKey || e . metaKey ) ) { if ( ! altCursor ) { editor . renderer . setMouseCursor ( "crosshair" ) ; altCursor = true ; } } else if ( altCursor ) { reset ( ) ; } } ) ; event . addListener ( el , "keyup" , reset ) ; event . addListener ( el , "blur" , reset ) ; function reset ( e ) { if ( altCursor ) { editor . renderer . setMouseCursor ( "" ) ; altCursor = false ; } } }
exports . MultiSelect = MultiSelect ; require ( "./config" ) . defineOptions ( Editor . prototype , "editor" , { enableMultiselect : { set : function ( val ) { MultiSelect ( this ) ; if ( val ) { this . on ( "changeSession" , this . $multiselectOnSessionChange ) ; this . on ( "mousedown" , onMouseDown ) ; } else { this . off ( "changeSession" , this . $multiselectOnSessionChange ) ; this . off ( "mousedown" , onMouseDown ) ; } } , value : true } } ) } ) ; define ( 'ace/mouse/multi_select_handler' , [ 'require' , 'exports' , 'module' , 'ace/lib/event' ] , function ( require , exports , module ) { var event = require ( "../lib/event" ) ; function isSamePoint ( p1 , p2 ) { return p1 . row == p2 . row && p1 . column == p2 . column ; }
function onMouseDown ( e ) { var ev = e . domEvent ; var alt = ev . altKey ; var shift = ev . shiftKey ; var ctrl = e . getAccelKey ( ) ; var button = e . getButton ( ) ; if ( e . editor . inMultiSelectMode && button == 2 ) { e . editor . textInput . onContextMenu ( e . domEvent ) ; return ; }
if ( ! ctrl && ! alt ) { if ( button == 0 && e . editor . inMultiSelectMode )
e . editor . exitMultiSelectMode ( ) ; return ; }
var editor = e . editor ; var selection = editor . selection ; var isMultiSelect = editor . inMultiSelectMode ; var pos = e . getDocumentPosition ( ) ; var cursor = selection . getCursor ( ) ; var inSelection = e . inSelection ( ) || ( selection . isEmpty ( ) && isSamePoint ( pos , cursor ) ) ; var mouseX = e . x , mouseY = e . y ; var onMouseSelection = function ( e ) { mouseX = e . clientX ; mouseY = e . clientY ; } ; var blockSelect = function ( ) { var newCursor = editor . renderer . pixelToScreenCoordinates ( mouseX , mouseY ) ; var cursor = session . screenToDocumentPosition ( newCursor . row , newCursor . column ) ; if ( isSamePoint ( screenCursor , newCursor ) && isSamePoint ( cursor , selection . selectionLead ) )
return ; screenCursor = newCursor ; editor . selection . moveCursorToPosition ( cursor ) ; editor . selection . clearSelection ( ) ; editor . renderer . scrollCursorIntoView ( ) ; editor . removeSelectionMarkers ( rectSel ) ; rectSel = selection . rectangularRangeBlock ( screenCursor , screenAnchor ) ; rectSel . forEach ( editor . addSelectionMarker , editor ) ; editor . updateSelectionMarkers ( ) ; } ; var session = editor . session ; var screenAnchor = editor . renderer . pixelToScreenCoordinates ( mouseX , mouseY ) ; var screenCursor = screenAnchor ; if ( ctrl && ! shift && ! alt && button == 0 ) { if ( ! isMultiSelect && inSelection )
return ; if ( ! isMultiSelect ) { var range = selection . toOrientedRange ( ) ; editor . addSelectionMarker ( range ) ; }
var oldRange = selection . rangeList . rangeAtPoint ( pos ) ; editor . once ( "mouseup" , function ( ) { var tmpSel = selection . toOrientedRange ( ) ; if ( oldRange && tmpSel . isEmpty ( ) && isSamePoint ( oldRange . cursor , tmpSel . cursor ) )
selection . substractPoint ( tmpSel . cursor ) ; else { if ( range ) { editor . removeSelectionMarker ( range ) ; selection . addRange ( range ) ; }
selection . addRange ( tmpSel ) ; } } ) ; } else if ( alt && button == 0 ) { e . stop ( ) ; if ( isMultiSelect && ! ctrl )
selection . toSingleRange ( ) ; else if ( ! isMultiSelect && ctrl )
selection . addRange ( ) ; var rectSel = [ ] ; if ( shift ) { screenAnchor = session . documentToScreenPosition ( selection . lead ) ; blockSelect ( ) ; } else { selection . moveCursorToPosition ( pos ) ; selection . clearSelection ( ) ; }
var onMouseSelectionEnd = function ( e ) { clearInterval ( timerId ) ; editor . removeSelectionMarkers ( rectSel ) ; for ( var i = 0 ; i < rectSel . length ; i ++ )
selection . addRange ( rectSel [ i ] ) ; } ; var onSelectionInterval = blockSelect ; event . capture ( editor . container , onMouseSelection , onMouseSelectionEnd ) ; var timerId = setInterval ( function ( ) { onSelectionInterval ( ) ; } , 20 ) ; return e . preventDefault ( ) ; } }
exports . onMouseDown = onMouseDown ; } ) ; define ( 'ace/commands/multi_select_commands' , [ 'require' , 'exports' , 'module' , 'ace/keyboard/hash_handler' ] , function ( require , exports , module ) { exports . defaultCommands = [ { name : "addCursorAbove" , exec : function ( editor ) { editor . selectMoreLines ( - 1 ) ; } , bindKey : { win : "Ctrl-Alt-Up" , mac : "Ctrl-Alt-Up" } , readonly : true } , { name : "addCursorBelow" , exec : function ( editor ) { editor . selectMoreLines ( 1 ) ; } , bindKey : { win : "Ctrl-Alt-Down" , mac : "Ctrl-Alt-Down" } , readonly : true } , { name : "addCursorAboveSkipCurrent" , exec : function ( editor ) { editor . selectMoreLines ( - 1 , true ) ; } , bindKey : { win : "Ctrl-Alt-Shift-Up" , mac : "Ctrl-Alt-Shift-Up" } , readonly : true } , { name : "addCursorBelowSkipCurrent" , exec : function ( editor ) { editor . selectMoreLines ( 1 , true ) ; } , bindKey : { win : "Ctrl-Alt-Shift-Down" , mac : "Ctrl-Alt-Shift-Down" } , readonly : true } , { name : "selectMoreBefore" , exec : function ( editor ) { editor . selectMore ( - 1 ) ; } , bindKey : { win : "Ctrl-Alt-Left" , mac : "Ctrl-Alt-Left" } , readonly : true } , { name : "selectMoreAfter" , exec : function ( editor ) { editor . selectMore ( 1 ) ; } , bindKey : { win : "Ctrl-Alt-Right" , mac : "Ctrl-Alt-Right" } , readonly : true } , { name : "selectNextBefore" , exec : function ( editor ) { editor . selectMore ( - 1 , true ) ; } , bindKey : { win : "Ctrl-Alt-Shift-Left" , mac : "Ctrl-Alt-Shift-Left" } , readonly : true } , { name : "selectNextAfter" , exec : function ( editor ) { editor . selectMore ( 1 , true ) ; } , bindKey : { win : "Ctrl-Alt-Shift-Right" , mac : "Ctrl-Alt-Shift-Right" } , readonly : true } , { name : "splitIntoLines" , exec : function ( editor ) { editor . multiSelect . splitIntoLines ( ) ; } , bindKey : { win : "Ctrl-Alt-L" , mac : "Ctrl-Alt-L" } , readonly : true } , { name : "alignCursors" , exec : function ( editor ) { editor . alignCursors ( ) ; } , bindKey : { win : "Ctrl-Alt-A" , mac : "Ctrl-Alt-A" } } ] ; exports . multiSelectCommands = [ { name : "singleSelection" , bindKey : "esc" , exec : function ( editor ) { editor . exitMultiSelectMode ( ) ; } , readonly : true , isAvailable : function ( editor ) { return editor && editor . inMultiSelectMode } } ] ; var HashHandler = require ( "../keyboard/hash_handler" ) . HashHandler ; exports . keyboardHandler = new HashHandler ( exports . multiSelectCommands ) ; } ) ; define ( 'ace/worker/worker_client' , [ 'require' , 'exports' , 'module' , 'ace/lib/oop' , 'ace/lib/event_emitter' , 'ace/config' ] , function ( require , exports , module ) { var oop = require ( "../lib/oop" ) ; var EventEmitter = require ( "../lib/event_emitter" ) . EventEmitter ; var config = require ( "../config" ) ; var WorkerClient = function ( topLevelNamespaces , mod , classname ) { this . $sendDeltaQueue = this . $sendDeltaQueue . bind ( this ) ; this . changeListener = this . changeListener . bind ( this ) ; this . onMessage = this . onMessage . bind ( this ) ; this . onError = this . onError . bind ( this ) ; if ( require . nameToUrl && ! require . toUrl )
require . toUrl = require . nameToUrl ; var workerUrl ; if ( config . get ( "packaged" ) || ! require . toUrl ) { workerUrl = config . moduleUrl ( mod , "worker" ) ; } else { var normalizePath = this . $normalizePath ; workerUrl = normalizePath ( require . toUrl ( "ace/worker/worker.js" , null , "_" ) ) ; var tlns = { } ; topLevelNamespaces . forEach ( function ( ns ) { tlns [ ns ] = normalizePath ( require . toUrl ( ns , null , "_" ) . replace ( /(\.js)?(\?.*)?$/ , "" ) ) ; } ) ; }
this . $worker = new Worker ( workerUrl ) ; this . $worker . postMessage ( { init : true , tlns : tlns , module : mod , classname : classname } ) ; this . callbackId = 1 ; this . callbacks = { } ; this . $worker . onerror = this . onError ; this . $worker . onmessage = this . onMessage ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . onError = function ( e ) { window . console && console . log && console . log ( e ) ; throw e ; } ; this . onMessage = function ( e ) { var msg = e . data ; switch ( msg . type ) { case "log" : window . console && console . log && console . log . apply ( console , msg . data ) ; break ; case "event" : this . _emit ( msg . name , { data : msg . data } ) ; break ; case "call" : var callback = this . callbacks [ msg . id ] ; if ( callback ) { callback ( msg . data ) ; delete this . callbacks [ msg . id ] ; }
break ; } } ; this . $normalizePath = function ( path ) { if ( ! location . host )
return path ; path = path . replace ( /^[a-z]+:\/\/[^\/]+/ , "" ) ; path = location . protocol + "//" + location . host + ( path . charAt ( 0 ) == "/" ? "" : location . pathname . replace ( /\/[^\/]*$/ , "" ) ) + "/" + path . replace ( /^[\/]+/ , "" ) ; return path ; } ; this . terminate = function ( ) { this . _emit ( "terminate" , { } ) ; this . deltaQueue = null ; this . $worker . terminate ( ) ; this . $worker = null ; this . $doc . removeEventListener ( "change" , this . changeListener ) ; this . $doc = null ; } ; this . send = function ( cmd , args ) { this . $worker . postMessage ( { command : cmd , args : args } ) ; } ; this . call = function ( cmd , args , callback ) { if ( callback ) { var id = this . callbackId ++ ; this . callbacks [ id ] = callback ; args . push ( id ) ; }
this . send ( cmd , args ) ; } ; this . emit = function ( event , data ) { try { this . $worker . postMessage ( { event : event , data : { data : data . data } } ) ; }
catch ( ex ) { } } ; this . attachToDocument = function ( doc ) { if ( this . $doc )
this . terminate ( ) ; this . $doc = doc ; this . call ( "setValue" , [ doc . getValue ( ) ] ) ; doc . on ( "change" , this . changeListener ) ; } ; this . changeListener = function ( e ) { if ( ! this . deltaQueue ) { this . deltaQueue = [ e . data ] ; setTimeout ( this . $sendDeltaQueue , 1 ) ; } else
this . deltaQueue . push ( e . data ) ; } ; this . $sendDeltaQueue = function ( ) { var q = this . deltaQueue ; if ( ! q ) return ; this . deltaQueue = null ; if ( q . length > 20 && q . length > this . $doc . getLength ( ) >> 1 ) { this . call ( "setValue" , [ this . $doc . getValue ( ) ] ) ; } else
this . emit ( "change" , { data : q } ) ; } } ) . call ( WorkerClient . prototype ) ; var UIWorkerClient = function ( topLevelNamespaces , mod , classname ) { this . $sendDeltaQueue = this . $sendDeltaQueue . bind ( this ) ; this . changeListener = this . changeListener . bind ( this ) ; this . callbackId = 1 ; this . callbacks = { } ; this . messageBuffer = [ ] ; var main = null ; var sender = Object . create ( EventEmitter ) ; var _self = this ; this . $worker = { } ; this . $worker . terminate = function ( ) { } ; this . $worker . postMessage = function ( e ) { _self . messageBuffer . push ( e ) ; main && setTimeout ( processNext ) ; } ; var processNext = function ( ) { var msg = _self . messageBuffer . shift ( ) ; if ( msg . command )
main [ msg . command ] . apply ( main , msg . args ) ; else if ( msg . event )
sender . _emit ( msg . event , msg . data ) ; } ; sender . postMessage = function ( msg ) { _self . onMessage ( { data : msg } ) ; } ; sender . callback = function ( data , callbackId ) { this . postMessage ( { type : "call" , id : callbackId , data : data } ) ; } ; sender . emit = function ( name , data ) { this . postMessage ( { type : "event" , name : name , data : data } ) ; } ; config . loadModule ( [ "worker" , mod ] , function ( Main ) { main = new Main [ classname ] ( sender ) ; while ( _self . messageBuffer . length )
processNext ( ) ; } ) ; } ; UIWorkerClient . prototype = WorkerClient . prototype ; exports . UIWorkerClient = UIWorkerClient ; exports . WorkerClient = WorkerClient ; } ) ; define ( 'ace/placeholder' , [ 'require' , 'exports' , 'module' , 'ace/range' , 'ace/lib/event_emitter' , 'ace/lib/oop' ] , function ( require , exports , module ) { var Range = require ( "./range" ) . Range ; var EventEmitter = require ( "./lib/event_emitter" ) . EventEmitter ; var oop = require ( "./lib/oop" ) ; var PlaceHolder = function ( session , length , pos , others , mainClass , othersClass ) { var _self = this ; this . length = length ; this . session = session ; this . doc = session . getDocument ( ) ; this . mainClass = mainClass ; this . othersClass = othersClass ; this . $onUpdate = this . onUpdate . bind ( this ) ; this . doc . on ( "change" , this . $onUpdate ) ; this . $others = others ; this . $onCursorChange = function ( ) { setTimeout ( function ( ) { _self . onCursorChange ( ) ; } ) ; } ; this . $pos = pos ; var undoStack = session . getUndoManager ( ) . $undoStack || session . getUndoManager ( ) . $undostack || { length : - 1 } ; this . $undoStackDepth = undoStack . length ; this . setup ( ) ; session . selection . on ( "changeCursor" , this . $onCursorChange ) ; } ; ( function ( ) { oop . implement ( this , EventEmitter ) ; this . setup = function ( ) { var _self = this ; var doc = this . doc ; var session = this . session ; var pos = this . $pos ; this . pos = doc . createAnchor ( pos . row , pos . column ) ; this . markerId = session . addMarker ( new Range ( pos . row , pos . column , pos . row , pos . column + this . length ) , this . mainClass , null , false ) ; this . pos . on ( "change" , function ( event ) { session . removeMarker ( _self . markerId ) ; _self . markerId = session . addMarker ( new Range ( event . value . row , event . value . column , event . value . row , event . value . column + _self . length ) , _self . mainClass , null , false ) ; } ) ; this . others = [ ] ; this . $others . forEach ( function ( other ) { var anchor = doc . createAnchor ( other . row , other . column ) ; _self . others . push ( anchor ) ; } ) ; session . setUndoSelect ( false ) ; } ; this . showOtherMarkers = function ( ) { if ( this . othersActive ) return ; var session = this . session ; var _self = this ; this . othersActive = true ; this . others . forEach ( function ( anchor ) { anchor . markerId = session . addMarker ( new Range ( anchor . row , anchor . column , anchor . row , anchor . column + _self . length ) , _self . othersClass , null , false ) ; anchor . on ( "change" , function ( event ) { session . removeMarker ( anchor . markerId ) ; anchor . markerId = session . addMarker ( new Range ( event . value . row , event . value . column , event . value . row , event . value . column + _self . length ) , _self . othersClass , null , false ) ; } ) ; } ) ; } ; this . hideOtherMarkers = function ( ) { if ( ! this . othersActive ) return ; this . othersActive = false ; for ( var i = 0 ; i < this . others . length ; i ++ ) { this . session . removeMarker ( this . others [ i ] . markerId ) ; } } ; this . onUpdate = function ( event ) { var delta = event . data ; var range = delta . range ; if ( range . start . row !== range . end . row ) return ; if ( range . start . row !== this . pos . row ) return ; if ( this . $updating ) return ; this . $updating = true ; var lengthDiff = delta . action === "insertText" ? range . end . column - range . start . column : range . start . column - range . end . column ; if ( range . start . column >= this . pos . column && range . start . column <= this . pos . column + this . length + 1 ) { var distanceFromStart = range . start . column - this . pos . column ; this . length += lengthDiff ; if ( ! this . session . $fromUndo ) { if ( delta . action === "insertText" ) { for ( var i = this . others . length - 1 ; i >= 0 ; i -- ) { var otherPos = this . others [ i ] ; var newPos = { row : otherPos . row , column : otherPos . column + distanceFromStart } ; if ( otherPos . row === range . start . row && range . start . column < otherPos . column )
newPos . column += lengthDiff ; this . doc . insert ( newPos , delta . text ) ; } } else if ( delta . action === "removeText" ) { for ( var i = this . others . length - 1 ; i >= 0 ; i -- ) { var otherPos = this . others [ i ] ; var newPos = { row : otherPos . row , column : otherPos . column + distanceFromStart } ; if ( otherPos . row === range . start . row && range . start . column < otherPos . column )
newPos . column += lengthDiff ; this . doc . remove ( new Range ( newPos . row , newPos . column , newPos . row , newPos . column - lengthDiff ) ) ; } }
if ( range . start . column === this . pos . column && delta . action === "insertText" ) { setTimeout ( function ( ) { this . pos . setPosition ( this . pos . row , this . pos . column - lengthDiff ) ; for ( var i = 0 ; i < this . others . length ; i ++ ) { var other = this . others [ i ] ; var newPos = { row : other . row , column : other . column - lengthDiff } ; if ( other . row === range . start . row && range . start . column < other . column )
newPos . column += lengthDiff ; other . setPosition ( newPos . row , newPos . column ) ; } } . bind ( this ) , 0 ) ; }
else if ( range . start . column === this . pos . column && delta . action === "removeText" ) { setTimeout ( function ( ) { for ( var i = 0 ; i < this . others . length ; i ++ ) { var other = this . others [ i ] ; if ( other . row === range . start . row && range . start . column < other . column ) { other . setPosition ( other . row , other . column - lengthDiff ) ; } } } . bind ( this ) , 0 ) ; } }
this . pos . _emit ( "change" , { value : this . pos } ) ; for ( var i = 0 ; i < this . others . length ; i ++ ) { this . others [ i ] . _emit ( "change" , { value : this . others [ i ] } ) ; } }
this . $updating = false ; } ; this . onCursorChange = function ( event ) { if ( this . $updating ) return ; var pos = this . session . selection . getCursor ( ) ; if ( pos . row === this . pos . row && pos . column >= this . pos . column && pos . column <= this . pos . column + this . length ) { this . showOtherMarkers ( ) ; this . _emit ( "cursorEnter" , event ) ; } else { this . hideOtherMarkers ( ) ; this . _emit ( "cursorLeave" , event ) ; } } ; this . detach = function ( ) { this . session . removeMarker ( this . markerId ) ; this . hideOtherMarkers ( ) ; this . doc . removeEventListener ( "change" , this . $onUpdate ) ; this . session . selection . removeEventListener ( "changeCursor" , this . $onCursorChange ) ; this . pos . detach ( ) ; for ( var i = 0 ; i < this . others . length ; i ++ ) { this . others [ i ] . detach ( ) ; }
this . session . setUndoSelect ( true ) ; } ; this . cancel = function ( ) { if ( this . $undoStackDepth === - 1 )
throw Error ( "Canceling placeholders only supported with undo manager attached to session." ) ; var undoManager = this . session . getUndoManager ( ) ; var undosRequired = ( undoManager . $undoStack || undoManager . $undostack ) . length - this . $undoStackDepth ; for ( var i = 0 ; i < undosRequired ; i ++ ) { undoManager . undo ( true ) ; } } ; } ) . call ( PlaceHolder . prototype ) ; exports . PlaceHolder = PlaceHolder ; } ) ; define ( 'ace/mode/folding/fold_mode' , [ 'require' , 'exports' , 'module' , 'ace/range' ] , function ( require , exports , module ) { var Range = require ( "../../range" ) . Range ; var FoldMode = exports . FoldMode = function ( ) { } ; ( function ( ) { this . foldingStartMarker = null ; this . foldingStopMarker = null ; this . getFoldWidget = function ( session , foldStyle , row ) { var line = session . getLine ( row ) ; if ( this . foldingStartMarker . test ( line ) )
return "start" ; if ( foldStyle == "markbeginend" && this . foldingStopMarker && this . foldingStopMarker . test ( line ) )
return "end" ; return "" ; } ; this . getFoldWidgetRange = function ( session , foldStyle , row ) { return null ; } ; this . indentationBlock = function ( session , row , column ) { var re = /\S/ ; var line = session . getLine ( row ) ; var startLevel = line . search ( re ) ; if ( startLevel == - 1 )
return ; var startColumn = column || line . length ; var maxRow = session . getLength ( ) ; var startRow = row ; var endRow = row ; while ( ++ row < maxRow ) { var level = session . getLine ( row ) . search ( re ) ; if ( level == - 1 )
continue ; if ( level <= startLevel )
break ; endRow = row ; }
if ( endRow > startRow ) { var endColumn = session . getLine ( endRow ) . length ; return new Range ( startRow , startColumn , endRow , endColumn ) ; } } ; this . openingBracketBlock = function ( session , bracket , row , column , typeRe ) { var start = { row : row , column : column + 1 } ; var end = session . $findClosingBracket ( bracket , start , typeRe ) ; if ( ! end )
return ; var fw = session . foldWidgets [ end . row ] ; if ( fw == null )
fw = this . getFoldWidget ( session , end . row ) ; if ( fw == "start" && end . row > start . row ) { end . row -- ; end . column = session . getLine ( end . row ) . length ; }
return Range . fromPoints ( start , end ) ; } ; this . closingBracketBlock = function ( session , bracket , row , column , typeRe ) { var end = { row : row , column : column } ; var start = session . $findOpeningBracket ( bracket , end ) ; if ( ! start )
return ; start . column ++ ; end . column -- ; return Range . fromPoints ( start , end ) ; } ; } ) . call ( FoldMode . prototype ) ; } ) ; define ( 'ace/theme/textmate' , [ 'require' , 'exports' , 'module' , 'ace/lib/dom' ] , function ( require , exports , module ) { exports . isDark = false ; exports . cssClass = "ace-tm" ; exports . cssText = " . ace - tm . ace _gutter { \
background : # f0f0f0 ; \
color : # 333 ; \
} \
. ace - tm . ace _print - margin { \
width : 1 px ; \
background : # e8e8e8 ; \
} \
. ace - tm . ace _fold { \
background - color : # 6 B72E6 ; \
} \
. ace - tm { \
background - color : # FFFFFF ; \
} \
. ace - tm . ace _cursor { \
color : black ; \
} \
. ace - tm . ace _invisible { \
color : rgb ( 191 , 191 , 191 ) ; \
} \
. ace - tm . ace _storage , \
. ace - tm . ace _keyword { \
color : blue ; \
} \
. ace - tm . ace _constant { \
color : rgb ( 197 , 6 , 11 ) ; \
} \
. ace - tm . ace _constant . ace _buildin { \
color : rgb ( 88 , 72 , 246 ) ; \
} \
. ace - tm . ace _constant . ace _language { \
color : rgb ( 88 , 92 , 246 ) ; \
} \
. ace - tm . ace _constant . ace _library { \
color : rgb ( 6 , 150 , 14 ) ; \
} \
. ace - tm . ace _invalid { \
background - color : rgba ( 255 , 0 , 0 , 0.1 ) ; \
color : red ; \
} \
. ace - tm . ace _support . ace _function { \
color : rgb ( 60 , 76 , 114 ) ; \
} \
. ace - tm . ace _support . ace _constant { \
color : rgb ( 6 , 150 , 14 ) ; \
} \
. ace - tm . ace _support . ace _type , \
. ace - tm . ace _support . ace _class { \
color : rgb ( 109 , 121 , 222 ) ; \
} \
. ace - tm . ace _keyword . ace _operator { \
color : rgb ( 104 , 118 , 135 ) ; \
} \
. ace - tm . ace _string { \
color : rgb ( 3 , 106 , 7 ) ; \
} \
. ace - tm . ace _comment { \
color : rgb ( 76 , 136 , 107 ) ; \
} \
. ace - tm . ace _comment . ace _doc { \
color : rgb ( 0 , 102 , 255 ) ; \
} \
. ace - tm . ace _comment . ace _doc . ace _tag { \
color : rgb ( 128 , 159 , 191 ) ; \
} \
. ace - tm . ace _constant . ace _numeric { \
color : rgb ( 0 , 0 , 205 ) ; \
} \
. ace - tm . ace _variable { \
color : rgb ( 49 , 132 , 149 ) ; \
} \
. ace - tm . ace _xml - pe { \
color : rgb ( 104 , 104 , 91 ) ; \
} \
. ace - tm . ace _entity . ace _name . ace _function { \
color : # 0000 A2 ; \
} \
. ace - tm . ace _heading { \
color : rgb ( 12 , 7 , 255 ) ; \
} \
. ace - tm . ace _list { \
color : rgb ( 185 , 6 , 144 ) ; \
} \
. ace - tm . ace _meta . ace _tag { \
color : rgb ( 0 , 22 , 142 ) ; \
} \
. ace - tm . ace _string . ace _regex { \
color : rgb ( 255 , 0 , 0 ) \
} \
. ace - tm . ace _marker - layer . ace _selection { \
background : rgb ( 181 , 213 , 255 ) ; \
} \
. ace - tm . ace _multiselect . ace _selection . ace _start { \
box - shadow : 0 0 3 px 0 px white ; \
border - radius : 2 px ; \
} \
. ace - tm . ace _marker - layer . ace _step { \
background : rgb ( 252 , 255 , 0 ) ; \
} \
. ace - tm . ace _marker - layer . ace _stack { \
background : rgb ( 164 , 229 , 101 ) ; \
} \
. ace - tm . ace _marker - layer . ace _bracket { \
margin : - 1 px 0 0 - 1 px ; \
border : 1 px solid rgb ( 192 , 192 , 192 ) ; \
} \
. ace - tm . ace _marker - layer . ace _active - line { \
background : rgba ( 0 , 0 , 0 , 0.07 ) ; \
} \
. ace - tm . ace _gutter - active - line { \
background - color : # dcdcdc ; \
} \
. ace - tm . ace _marker - layer . ace _selected - word { \
background : rgb ( 250 , 250 , 255 ) ; \
border : 1 px solid rgb ( 200 , 200 , 250 ) ; \
} \
. ace - tm . ace _indent - guide { \
background : url ( \ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\" ) right repeat - y ; \
} \
";var dom=require(" . . / lib / dom ");dom.importCssString(exports.cssText,exports.cssClass);});;(function(){window.require([" ace / ace " ] , function ( a ) { a && a . config . init ( ) ; if ( ! window . ace )
window . ace = { } ; for ( var key in a ) if ( a . hasOwnProperty ( key ) )
ace [ key ] = a [ key ] ; } ) ; } ) ( ) ;