{"version":3,"file":"squeak.min.js","sources":["../squeak.js","../vm.js","../jit.js","../plugins/ADPCMCodecPlugin.js","../plugins/B2DPlugin.js","../plugins/BitBltPlugin.js","../plugins/FFTPlugin.js","../plugins/FloatArrayPlugin.js","../plugins/GeniePlugin.js","../plugins/JPEGReaderPlugin.js","../plugins/KedamaPlugin.js","../plugins/KedamaPlugin2.js","../plugins/Klatt.js","../plugins/LargeIntegers.js","../plugins/Matrix2x3Plugin.js","../plugins/MiscPrimitivePlugin.js","../plugins/ScratchPlugin.js","../plugins/SoundGenerationPlugin.js","../plugins/StarSqueakPlugin.js","../plugins/ZipPlugin.js","../lib/lz-string.js"],"names":["window","module","dottedPath","path","split","name","pop","parent","join","self","loaded","pending","requires","req","toRun","code","load","forEach","f","push","Object","extend","obj","i","arguments","length","Function","prototype","subclass","classPath","this","initialize","apply","protoclass","modulePath","className","scripts","document","getElementsByTagName","squeakjs","vmDir","src","replace","match","filename","script","createElement","setAttribute","appendChild","setupFullscreen","display","canvas","options","fullscreenChange","fullscreen","box","style","background","header","footer","fullscreenCheckbox","checked","setTimeout","onresize","parentElement","fullscreenEvent","fullscreenElement","fullscreenEnabled","requestFullscreen","webkitRequestFullscreen","exit","webkitExitFullscreen","evt","elem","enable","mozRequestFullScreen","mozCancelFullScreen","msRequestFullscreen","msExitFullscreen","browser","exitFullscreen","checkFullscreen","addEventListener","isFullscreen","onclick","setupSwapButtons","swapCheckbox","imageName","localStorage","settings","JSON","parse","swapButtons","stringify","recordModifiers","shiftPressed","shiftKey","ctrlPressed","ctrlKey","altKey","cmdPressed","metaKey","modifiers","Squeak","Keyboard_Shift","Keyboard_Ctrl","Keyboard_Cmd","buttons","Keyboard_All","updateMousePos","evtX","canUseMouseOffset","offsetX","layerX","evtY","offsetY","layerY","cursorCanvas","left","offsetLeft","cursorOffsetX","top","offsetTop","cursorOffsetY","x","width","offsetWidth","y","height","offsetHeight","mouseX","Math","max","min","mouseY","recordMouseEvent","what","eventQueue","vm","Mouse_All","button","Mouse_Red","Mouse_Yellow","Mouse_Blue","EventTypeMouse","timeStamp","signalInputEvent","idle","runFor","runNow","recordKeyboardEvent","key","timestamp","interruptKeycode","interruptPending","EventTypeKeyboard","EventKeyChar","keys","recordDragDropEvent","type","EventTypeDragDropFiles","droppedFiles","fakeCmdOrCtrlKey","makeSqueakEvent","sqEvtBuf","sqTimeOffset","MillisecondClockMask","createSqueakDisplay","touchToMouse","touches","touch","pageX","pageY","dd","ax","ay","bx","by","sqrt","dist","a","b","adjustDisplay","l","t","w","h","scale","pixelated","classList","add","remove","zoomStart","down","orig","right","bottom","zoomMove","minScale","nowScale","maxZoom","zoomEnd","dragEventHasFiles","dataTransfer","types","body","margin","backgroundColor","ontouchmove","preventDefault","context","getContext","clipboardString","clipboardStringChanged","reset","lastTick","getNextEvent","firstEvtBuf","firstOffset","offset","Date","now","evtBuf","timeOffset","shift","EventTypeNone","fullscreenRequest","thenDo","resizeTodo","resizeTodoTimeout","resizeDone","clearTimeout","todo","clear","showBanner","msg","ctx","clearRect","fillStyle","color","font","textAlign","textBaseline","fillText","showProgress","value","fillRect","lineWidth","strokeStyle","strokeRect","executeClipboardPaste","text","charCodeAt","err","console","error","executeClipboardCopy","start","interpret","onmousedown","onmouseup","onmousemove","oncontextmenu","state","ontouchstart","e","changedTouches","first","didMove","abs","ontouchend","ontouchcancel","position","cursor","pointerEvents","onkeypress","test","String","fromCharCode","charCode","onkeydown","squeakCode",8,9,13,27,33,34,35,36,37,38,39,40,45,46,"keyCode","keyIdentifier","slice","parseInt","onkeyup","oncopy","clipboardData","setData","oncut","onpaste","getData","ondragover","dropEffect","EventDragMove","ondragenter","EventDragEnter","ondragleave","EventDragLeave","ondrop","image","files","call","reader","FileReader","onload","buffer","result","filePut","confirm","SqueakJS","appName","runImage","EventDragDrop","readAsArrayBuffer","debounceWidth","innerWidth","debounceHeight","innerHeight","paddingX","paddingY","fixedWidth","fixedHeight","wantRatio","haveRatio","floor","preserveScreen","imgData","getImageData","putImageData","setupSpinner","spinner","updateSpinner","idleMS","busy","animating","becameBusy","spinnerAngle","webkitTransform","transform","processOptions","search","location","hash","args","keyAndVal","val","decodeURIComponent","root","splitFilePath","fullname","dirCreate","url","fetchTemplates","templates","constructor","Array","fetchTemplateDir","Error","loop","navigator","userAgent","onbeforeunload","returnValue","Image","readFromBuffer","run","quitFlag","onQuit","ms","alert","Interpreter","milliseconds","stoptime","runSqueak","imageUrl","getNextFile","whenAllDone","imageData","file","forceDownload","fileExists","fileGet","data","fileDelete","unshift","rq","XMLHttpRequest","open","responseType","onprogress","lengthComputable","total","status","response","onerror","statusText","warn","proxy","retry","send","protocol","fsck","basename","baseUrl","docName","documentName","quitSqueak","applicationCache","reload","users","bert","vmVersion","vmBuild","vmPath","vmFile","platformName","platformSubtype","osVersion","windowSystem","HeaderTypeMask","HeaderTypeSizeAndClass","HeaderTypeClass","HeaderTypeFree","HeaderTypeShort","splOb_NilObject","splOb_FalseObject","splOb_TrueObject","splOb_SchedulerAssociation","splOb_ClassBitmap","splOb_ClassInteger","splOb_ClassString","splOb_ClassArray","splOb_SmalltalkDictionary","splOb_ClassFloat","splOb_ClassMethodContext","splOb_ClassBlockContext","splOb_ClassPoint","splOb_ClassLargePositiveInteger","splOb_TheDisplay","splOb_ClassMessage","splOb_ClassCompiledMethod","splOb_TheLowSpaceSemaphore","splOb_ClassSemaphore","splOb_ClassCharacter","splOb_SelectorDoesNotUnderstand","splOb_SelectorCannotReturn","splOb_TheInputSemaphore","splOb_SpecialSelectors","splOb_CharacterTable","splOb_SelectorMustBeBoolean","splOb_ClassByteArray","splOb_ClassProcess","splOb_CompactClasses","splOb_TheTimerSemaphore","splOb_TheInterruptSemaphore","splOb_FloatProto","splOb_SelectorCannotInterpret","splOb_MethodContextProto","splOb_ClassBlockClosure","splOb_BlockContextProto","splOb_ExternalObjectsArray","splOb_ClassPseudoContext","splOb_ClassTranslatedMethod","splOb_TheFinalizationSemaphore","splOb_ClassLargeNegativeInteger","splOb_ClassExternalAddress","splOb_ClassExternalStructure","splOb_ClassExternalData","splOb_ClassExternalFunction","splOb_ClassExternalLibrary","splOb_SelectorAboutToReturn","splOb_SelectorRunWithIn","splOb_SelectorAttemptToAssign","splOb_PrimErrTableIndex","splOb_ClassAlien","splOb_InvokeCallbackSelector","splOb_ClassUnsafeAlien","splOb_ClassWeakFinalizer","Class_superclass","Class_mdict","Class_format","Class_instVars","Class_name","Context_sender","Context_instructionPointer","Context_stackPointer","Context_method","Context_closure","Context_receiver","Context_tempFrameStart","Context_smallFrameSize","Context_largeFrameSize","BlockContext_caller","BlockContext_argumentCount","BlockContext_initialIP","BlockContext_home","Closure_outerContext","Closure_startpc","Closure_numArgs","Closure_firstCopiedValue","Stream_array","Stream_position","Stream_limit","ProcSched_processLists","ProcSched_activeProcess","Link_nextLink","LinkedList_firstLink","LinkedList_lastLink","Semaphore_excessSignals","Proc_suspendedContext","Proc_priority","Proc_myList","Assn_key","Assn_value","MethodDict_array","MethodDict_selectorStart","Message_selector","Message_arguments","Message_lookupClass","Point_x","Point_y","LargeInteger_bytes","LargeInteger_neg","BitBlt_dest","BitBlt_source","BitBlt_halftone","BitBlt_combinationRule","BitBlt_destX","BitBlt_destY","BitBlt_width","BitBlt_height","BitBlt_sourceX","BitBlt_sourceY","BitBlt_clipX","BitBlt_clipY","BitBlt_clipW","BitBlt_clipH","BitBlt_colorMap","BitBlt_warpBase","Form_bits","Form_width","Form_height","Form_depth","Form_offset","WeakFinalizationList_first","WeakFinalizerItem_list","WeakFinalizerItem_next","Keyboard_Alt","EventKeyDown","EventKeyUp","MinSmallInt","MaxSmallInt","NonSmallInt","externalModules","registerExternalModule","whenDone","dir","stats","dirs","bytes","deleted","indexedDB","dbTransaction","fileStore","cursorReq","openCursor","onsuccess","target","continue","entries","dirList","isDir","exists","log","dirDelete","toFixed","orphaned","delete","mode","description","transactionFunc","completionFunc","fakeTransaction","dbFake","startTransaction","trans","SqueakDB","transaction","objectStore","oncomplete","onabort","openReq","onversionchange","close","onupgradeneeded","db","createObjectStore","onblocked","SqueakDBFake","bigFiles","bigFileThreshold","get","string","compressed","LZString","decompressFromUTF16","Uint8Array","put","byteLength","bytesAsString","compressToUTF16","filepath","errorDo","getReq","undefined","fetchTemplateFile","template","fakeReq","contents","optSuccess","directory","dirname","entry","totalSeconds","entryOnly","fileRename","from","to","oldpath","newpath","olddir","samedir","newdir","bind","dirpath","withParents","children","child","includeTemplates","addEntries","hasOwnProperty","localEntries","matches","flushFile","modified","size","ArrayBuffer","set","subarray","flushAllFiles","SqueakFiles","closeAllFiles","ensureTemplateParent","checkSubTemplates","index","ifFound","ifNotFound","timeout","onreadystatechange","readyState","DONE","startAudioOut","audioOutContext","ctxProto","AudioContext","webkitAudioContext","mozAudioContext","msAudioContext","startAudioIn","audioInContext","audioInSource","disconnect","getUserMedia","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","audio","toString","stream","createMediaStreamSource","stopAudio","Epoch","UTC","getTimezoneOffset","EpochUTC","chars","about","totalMemory","gcCount","gcTenured","gcMilliseconds","allocationCount","oldSpaceCount","newSpaceCount","hasNewInstances","arraybuffer","progressDo","mapSomeObjects","stop","done","installFromImage","oopMap","compactClasses","floatClass","littleEndian","nativeFloats","nextObject","specialObjectsArray","splObs","decorateKnownObjects","fixCompiledMethods","fixCompactOops","mapSomeObjectsAsync","startupTime","DataView","pos","readWord","int","getUint32","readBits","nWords","format","oops","bits","Uint32Array","versions","version","fileHeaderSize","indexOf","hasClosures","imageHeaderSize","objectMemorySize","oldBaseAddr","specialObjectsOopInt","lastHash","prevObj","headerSize","classInt","oop","object","initFromImage","firstOldObject","lastOldObject","oldSpaceBytes","cc","renamedObj","renameFromImage","splObjs","pointers","isNil","isTrue","isFalse","isFloatClass","isCompact","Number","sqInstName","defineProperty","enumerable","adjust","hadCompactHeader","mightBeCompact","sqClass","snapshotSize","compiledMethodClass","partialGC","fullGC","reason","addMessage","newObjects","markReachableObjects","removeUnmarkedOldObjects","appendToOldObjects","finalizeWeakReferences","storeContextRegisters","activeContext","mark","n","isContext","contextSizeWithStack","nilObj","isWeak","classInstSize","sort","removedCount","removedBytes","next","corpse","totalBytes","oldObj","newObj","setAddr","weakObj","firstWeak","finalized","pendingFinalizationSignals","list","specialObjects","items","forceInterruptCheck","registerObject","instantiateClass","aClass","indexableSize","filler","newObject","classInstProto","initInstanceOf","clone","initAsClone","bulkBecome","fromArray","toArray","twoWay","copyHash","mutations","fromHash","mut","j","flushMethodCacheAfterBecome","objectAfter","someInstanceOf","clsObj","nextObjectWithGCFor","nextInstanceAfter","writeToBuffer","writeWord","word","setUint32","formatVersion","addr","objectToOop","writeTo","bytesLeft","segmentVersion","dnu","wholeWord","loadImageSegment","segmentWordArray","outPointerArray","words","segment","fakeClsOop","compactClassOops","map","cls","roots","instSpec","instSize","fillArray","isFloat","float","original","fmt","hsh","classNameFromImage","decodeBytes","ccArray","classObj","instProto","ccInt","decodePointers","methodHeader","decodeWords","numLits","decodeFloat","decodeFloatDeoptimized","theBits","ptrs","byteOffset","wordOffset","fmtLowBits","nBytes","wordsAsBytes","getFloat64","swapped","array","bytesAsNumberString","negative","hex","digits","sign","approx","assnKeyAsString","slotNameAt","allInstVarNames","str","isWords","isBytes","isWordsOrBytes","isPointers","isMethod","pointersSize","bytesSize","wordsSize","floatData","setFloat64","wordsAsFloat32Array","float32Array","Float32Array","wordsAsFloat64Array","float64Array","Float64Array","wordsAsInt32Array","int32Array","Int32Array","wordsAsInt16Array","int16Array","Int16Array","wordsAsUint16Array","uint16Array","Uint16Array","wordsAsUint8Array","uint8Array","wordsOrBytes","uint32Array","extraHeader","beforePos","formatAndHash","classIndex","setUint8","instVarNames","each","superclass","concat","clsIndex","proto","safeName","methodNumLits","methodNumArgs","methodPrimitiveIndex","primBits","methodClassForSuper","assn","methodNeedsLargeFrame","methodAddPointers","headerAndLits","methodTempCount","methodGetLiteral","zeroBasedIndex","methodGetSelector","methodSetLiteral","contextHome","contextIsBlock","contextMethod","contextSender","sp","primHandler","Primitives","loadImageState","hackImage","initVMState","loadInitialContext","initCompiler","specialSelectors","falseObj","trueObj","globals","findGlobals","findMethod","emulateMac","reverseDisplay","byteCodeCount","sendCount","interruptCheckCounter","interruptCheckCounterFeedBackReset","interruptChecksEveryNms","nextPollTick","nextWakeupTick","freeContexts","freeLargeContexts","reclaimableContextCount","nRecycledContexts","nAllocatedContexts","methodCacheSize","methodCacheMask","methodCacheRandomish","methodCache","lkupClass","selector","method","primIndex","argCount","mClass","breakOutOfInterpreter","breakOutTick","breakOnMethod","breakOnNewMethod","breakOnContextChanged","breakOnContextReturned","messages","schedAssn","sched","proc","fetchContextRegisters","smalltalk","smalltalkClass","globalsClass","Compiler","kObjPerSec","compiler","m","primitive","interpretOne","singleStep","compiled","enableSingleStepping","breakNow","b2","nextByte","receiver","homeContext","doReturn","nono","extendedPush","extendedStore","extendedStorePop","doubleExtendedDoAnything","exportThisContext","pushNewArray","pushClosureCopy","pc","jumpIfFalse","checkForInterrupts","jumpIfTrue","success","resultIsFloat","pop2AndPushNumResult","stackIntOrFloat","sendSpecial","pop2AndPushBoolResult","pop2AndPushIntResult","quickDivide","stackInteger","mod","primitiveMakePoint","safeShift","div","quickSendOther","forMilliseconds","frozen","isIdle","millisecondClockValue","goIdle","hadTimer","hasTimer","breakOut","freeze","frozenDo","continueFunc","unfreeze","methodBytes","sema","synchronousSignal","semaphoresToSignal","signalExternalSemaphores","compile","lobits","byte2","byte3","delta","popValues","count","stackValue","popN","numArgsNumCopied","numArgs","numCopied","blockSizeHigh","blockSize","initialPC","encodeSqueakPC","closure","newClosure","doSuper","newRcvr","lookupClass","getClass","findSelectorInClass","verifyAtSelector","verifyAtClass","executeNewMethod","sendAsPrimitiveFailure","rcvr","startingClass","cacheEntry","findMethodCacheEntry","mDict","currentClass","cantInterpSel","cantInterpMsg","createActualMessage","popNandPush","newMethod","lookupSelectorInDict","currentSelector","currentLookupClass","dnuSel","dnuMsg","messageSelector","dictSize","mask","hasWrapped","nextSelector","methArray","argumentCount","primitiveIndex","optClass","optSel","printMethod","logSends","tryPrimitive","newContext","allocateOrRecycleContext","tempCount","newPC","newSP","arrayCopy","arrayFill","targetContext","cannotReturn","thisContext","isUnwindMarked","aboutToReturnThrough","nextContext","recycleIfPossible","resultObj","aContext","aboutToReturnSel","cannotReturnSel","doPrimitive","message","argArray","primitivePerform","trueArgCount","selectorIndex","stack","primitivePerformWithArgs","supered","primitiveInvokeObjectAsMethod","orgArgs","orgReceiver","orgSelector","runWithIn","firstProbe","probe","flushMethodCache","flushMethodCacheForSelector","flushMethodCacheForMethod","isMethodContext","newActiveContext","ctxt","meth","isSmallInt","decodeSqueakPC","decodeSqueakSP","encodeSqueakSP","intPC","squeakPC","intSP","squeakSP","needsLarge","freebie","nToPop","depthIntoStack","checkSmallInt","num","intResult","canBeSmallInt","numResult","makeFloat","unsigned","lgIntClass","lgIntObj","boolResult","anInt","maybeSmallInt","arg","smallInt","shiftCount","shifted","fromIndex","toIndex","srcPos","dest","destPos","warnOnce","aMethod","optContext","found","allMethodsDo","methodObj","selectorObj","allInstancesOf","callback","globalNamed","instances","inst","allGlobalsDo","nameObj","globalObj","globalNameObj","clsAndMeta","c","mdict","methods","selectors","printStack","limit","contexts","hardLimit","extra","block","classAndMethodString","methodName","breakOn","breakOnReturnFromThisContext","breakOnSendOrReturn","printActiveContext","isBlock","isClosure","homeCtx","stackBottom","stackTop","firstTemp","lastTemp","label","nArgs","firstArg","lastArg","printAllProcesses","activeProc","printProcess","lists","priority","process","semaClass","active","printByteCodes","optionalIndent","optionalHighlight","optionalPC","printer","InstructionPrinter","printInstructions","willSendOrReturn","byte","litIndex","oldPrims","allowAccessBeyondSP","deferDisplayUpdates","initDisplay","initAtCache","initModules","loadedModules","builtinModules","JavaScriptPlugin","findPluginFunctions","FilePlugin","DropPlugin","SoundPlugin","JPEGReadWriter2Plugin","SecurityPlugin","primitiveDisableImageWrite","fakePrimitive","patchModules","ScratchPlugin","interpreterProxy","InterpreterProxy","prefix","bindLate","plugin","regex","RegExp","funcName","primName","toLowerCase","indexedColors","popNandPushIfOK","objectAt","objectAtPut","objectSize","pop2andPushBoolIfOK","doBlockCopy","primitiveBlockValue","primMethod","popNandPushIntIfOK","doBitAnd","doBitOr","doBitXor","doBitShift","primitiveLessThanLargeIntegers","primitiveGreaterThanLargeIntegers","primitiveLessOrEqualLargeIntegers","primitiveGreaterOrEqualLargeIntegers","primitiveEqualLargeIntegers","primitiveNotEqualLargeIntegers","popNandPushFloatIfOK","stackFloat","safeFDiv","floatAsSmallInt","frexp_exponent","ldexp","sin","atan","exp","stackNonInteger","stackPos32BitInt","primitiveArrayBecome","primitiveStoreStackp","primitiveNewMethod","primitiveBlockValueWithArgs","primitiveSignal","primitiveWait","primitiveResume","primitiveSuspend","primitiveMousePoint","primitiveTestDisplayDepth","primitiveInputSemaphore","primitiveGetNextEvent","primitiveInputWord","namedPrimitive","primitiveSnapshot","primitiveLoadImageSegment","primitiveBeCursor","primitiveBeDisplay","doStringReplace","primitiveScreenSize","primitiveMouseButtons","primitiveKeyboardNext","primitiveKeyboardPeek","primitiveQuit","primitiveExitToDebugger","primitiveChangeClass","doNamedPrimitive","primitiveDoPrimitiveWithArgs","primitiveImageName","primitiveReverseDisplay","registerSemaphore","setLowSpaceThreshold","primitiveDeferDisplayUpdates","primitiveShowDisplayRect","primitiveFullGC","pointsTo","primitiveSignalAtMilliseconds","secondClock","someObject","primitiveBeep","primitiveClipboardText","makeStString","filenameToSqueak","primitiveShortAtAndPut","primitiveConstantFill","primitiveGetAttribute","primitiveFileAtEnd","primitiveFileClose","primitiveFileGetPosition","primitiveFileOpen","primitiveFileRead","primitiveFileSetPosition","primitiveFileDelete","primitiveFileSize","primitiveFileWrite","primitiveFileRename","primitiveDirectoryCreate","primitiveDirectoryDelimitor","primitiveDirectoryLookup","primitiveDirectoryDelete","primitiveIntegerAtAndPut","primitiveCopyObject","primitiveDirectorySetMacTypeAndCreator","primitiveNotIdentical","primitiveExecuteMethodArgsArray","primitiveClosureCopyWithCopiedValues","primitiveClosureValue","primitiveClosureValueWithArgs","primitiveClosureValueNoContextSwitch","primitiveRelinquishProcessorForMicroseconds","primitiveForceDisplayUpdate","primitiveSetFullScreen","microsecondClockUTC","microsecondClockLocal","primitiveVMParameter","primitiveUnloadModule","primitiveListBuiltinModule","primitiveListLoadedModule","modName","functionName","loadModule","firstLiteral","moduleName","prim","retVal","makeStObject","patchModule","setInterpreter","initFunc","initialiseModule","failed","patch","unloadModule","unloadFunc","loadFunctionFrom","func","popNIfOK","moduleNames","getModuleName","bool","nDeep","checkNonInteger","positive32BitValueOf","pos32BitIntFor","signed32","pos64BitIntFor","longlong","sz","stackSigned32BitInt","stackVal","isA","signed32BitIntegerFor","checkFloat","stackBoolean","checkBoolean","stackSigned53BitInt","dividend","divisor","truncated","ceil","ensureSmallInt","pow","exponent","mantissa","floatOrInt","maybeFloat","maybeSmall","knownClass","isKindOf","classOrSuper","theClass","isAssociation","number","charFromInt","ascii","charTable","newFloat","makeLargeIfNeeded","integer","makeLargeInt","makePointWithXandY","pointClass","newPoint","makeStArray","jsArray","proxyClass","jsString","stString","stObj","jsObject","asUint8Array","unixpath","slash","filenameFromSqueak","cameFromBytecode","convertChars","includeInstVars","info","atCache","atCacheMask","makeAtCacheInfo","ivarOffset","atPutCache","wordToPut","objToPut","intToPut","atCacheSize","nonCachedInfo","clearAtCache","atOrPutCache","atOrPutSelector","cacheable","someInstance","nextInstance","checkNumbers","newStackp","stackp","argumentArray","primIdx","arraySize","cntxSize","bytecodeCount","litCount","argsArray","doBothWays","dst","dstPos","srcFmt","dstFmt","totalLength","srcInstSize","dstInstSize","sqArgCount","homeCtxt","newBlock","blockArgCount","initialIP","blockClosure","activateNewClosureMethod","outerContext","where","resume","getScheduler","transferTo","pickTopProcess","newProc","activePriority","newPriority","putToSleep","aProcess","processLists","processList","linkProcessToList","oldProc","schedLists","p","isEmptyList","removeFirstLinkOfList","aList","lastLink","aLinkedList","last","specialObjIndex","excessSignals","msTime","signalSemaphoreWithIndex","semaIndex","semaphores","attr","lowSpaceThreshold","paramsArraySize","arrayObj","vmParameterAt","parm","primitiveSetGCBiasToGrow","primitiveSetGCBiasToGrowGCLimit","cursorForm","loadForm","maskForm","bounds","depth","cursorMergeMask","showForm","bit","merged","msb","pixPerWord","pitch","displayObj","redrawDisplay","rect","theDisplay","displayUpdate","form","cursorColors","srcX","srcY","srcW","srcH","pixels","createImageData","pixelData","colors","swappedColors","argb","abgr","reversedColors","leftSrcShift","srcIndex","srcShift","dstIndex","rgb","opaque","flag","supportedDepths","formObj","withOffset","displayDirty","beep","createOscillator","connect","destination","frequency","noteOn","noteOff","currentTime","stringObj","inputEventSemaIndex","millisecondClockValueSet","clock","millis","dirNameObj","dirName","delimitor","primitiveDirectoryEntry","sqDirName","handle","filePos","fileClose","fileNameObj","fileName","primitiveFileFlush","writeFlag","fileOpen","fileWrite","startIndex","fileContentsDo","srcArray","dstArray","oldNameObj","newNameObj","oldName","newName","primitiveFileStdioHandles","primitiveFileTruncate","primitiveDisableFileAccess","newSize","refCount","primitiveDropRequestFileHandle","fileNames","primitiveDropRequestFileName","snd_primitiveSoundStart","snd_primitiveSoundStartWithSemaphore","bufFrames","samplesPerSec","stereoFlag","audioContext","audioSema","audioNextTimeSlot","audioBuffersReady","audioBuffersUnused","createBuffer","snd_playNextBuffer","source","createBufferSource","duration","snd_primitiveSoundAvailableSpace","available","buf","numberOfChannels","snd_primitiveSoundPlaySamples","sqSamples","channels","channel","jsSamples","getChannelData","snd_primitiveSoundPlaySilence","snd_primitiveSoundStop","snd_primitiveSoundStartRecording","audioInSema","audioInBuffers","audioInBufferIndex","audioInOverSample","sampleRate","bufferSize","audioInProcessor","createScriptProcessor","onaudioprocess","event","snd_recordNextBuffer","inputBuffer","audioBuffer","snd_primitiveSoundGetRecordingSampleRate","actualRate","snd_primitiveSoundRecordSamples","sqStartIndex","sampleCount","sqStep","jsStep","sqCount","jsCount","jsIndex","sqIndex","snd_primitiveSoundStopRecording","snd_primitiveSoundSetRecordLevel","jpeg2_primJPEGPluginIsPresent","jpeg2_primImageHeight","decompressStruct","jpeg2_primImageWidth","jpeg2_primJPEGCompressStructSize","jpeg2_primJPEGDecompressStructSize","jpeg2_primJPEGErrorMgr2StructSize","jpeg2_primJPEGReadHeaderfromByteArrayerrorMgr","jpeg2_readImageFromBytes","jpeg2state","img","jpeg2_primJPEGReadImagefromByteArrayonFormdoDitheringerrorMgr","ditherFlag","jpeg2_getPixelsFromImage","formBits","jpeg2_copyPixelsToForm32","jpeg2_ditherPixelsToForm16","jpeg2_copyPixelsToForm16","jpeg2_primJPEGWriteImageonByteArrayformqualityprogressiveJPEGerrorMgr","blob","Blob","URL","webkitURL","createObjectURL","drawImage","r","g","r1","g1","b1","r2","g2","formPix","ditherMatrix1","ditherMatrix2","di","dmi","dmo","v","dmv1","dmv2","scratch_primitiveOpenURL","scratch_primitiveGetFolderPath","js_primitiveDoUnderstand","js_objectOrGlobal","isGlobal","jsResult","js_activeCallback","propName","js_setError","propValue","js_fromStArray","js_fromStObject","newArgs","stResult","js_primitiveAsString","js_primitiveTypeof","js_primitiveAt","jsRcvr","jsPropName","jsPropValue","js_primitiveAtPut","js_primitiveSqueakAsJSObject","js_primitiveInitCallbacks","js_callbackSema","js_primitiveGetActiveCallbackBlock","js_primitiveGetActiveCallbackArgs","js_primitiveReturnFromCallback","js_primitiveGetError","js_error","js_fromStBlock","objs","maybeDict","js_fromStDict","jsDict","assoc","jsKey","jsValue","squeak","js_executeCallback","sqObject","primitiveFloatArrayAt","primitiveFloatArrayMulFloatArray","primitiveFloatArrayAddScalar","primitiveFloatArrayDivFloatArray","primitiveFloatArrayDivScalar","primitiveFloatArrayHash","primitiveFloatArrayAtPut","primitiveFloatArrayMulScalar","primitiveFloatArrayAddFloatArray","primitiveFloatArraySubScalar","primitiveFloatArraySubFloatArray","primitiveFloatArrayEqual","primitiveFloatArrayDotProduct","m23PrimitiveInvertRectInto","m23PrimitiveTransformPoint","m23PrimitiveIsPureTranslation","m23PrimitiveComposeMatrix","m23PrimitiveTransformRectInto","m23PrimitiveIsIdentity","m23PrimitiveInvertPoint","primitiveDeflateBlock","primitiveDeflateUpdateHashTable","primitiveUpdateGZipCrc32","primitiveInflateDecompressBlock","primitiveZipSendBlock","primitiveFFTTransformData","primitiveFFTScaleData","primitiveFFTPermuteData","gePrimitiveMergeFillFrom","gePrimitiveCopyBuffer","gePrimitiveAddRect","gePrimitiveAddGradientFill","gePrimitiveSetClipRect","gePrimitiveSetBitBltPlugin","gePrimitiveRegisterExternalEdge","gePrimitiveGetClipRect","gePrimitiveAddBezier","gePrimitiveInitializeProcessing","gePrimitiveRenderImage","gePrimitiveGetOffset","gePrimitiveSetDepth","gePrimitiveAddBezierShape","gePrimitiveSetEdgeTransform","gePrimitiveGetTimes","gePrimitiveNextActiveEdgeEntry","gePrimitiveAddBitmapFill","gePrimitiveGetDepth","gePrimitiveAbortProcessing","gePrimitiveNextGlobalEdgeEntry","gePrimitiveGetFailureReason","gePrimitiveDisplaySpanBuffer","gePrimitiveGetCounts","gePrimitiveChangedActiveEdgeEntry","gePrimitiveRenderScanline","gePrimitiveGetBezierStats","gePrimitiveFinishedProcessing","gePrimitiveNeedsFlush","gePrimitiveAddLine","gePrimitiveSetOffset","gePrimitiveNextFillEntry","gePrimitiveInitializeBuffer","gePrimitiveDoProfileStats","gePrimitiveAddActiveEdgeEntry","gePrimitiveSetAALevel","gePrimitiveNeedsFlushPut","gePrimitiveAddCompressedShape","gePrimitiveSetColorTransform","gePrimitiveAddOval","gePrimitiveRegisterExternalFill","gePrimitiveAddPolygon","gePrimitiveGetAALevel","VM_PROXY_MAJOR","VM_PROXY_MINOR","remappableOops","majorVersion","minorVersion","successFlag","primitiveFail","primitiveFailFor","boolean","popthenPush","pushBool","pushInteger","pushFloat","floatObjectOf","stackIntegerValue","stackFloatValue","stackObjectValue","stackBytes","stackWords","stackInt32Array","stackInt16Array","stackUint16Array","isIntegerValue","isArray","isMemberOf","nameBytes","booleanValueOf","positive32BitIntegerFor","floatValueOf","fetchPointerofObject","fetchBytesofObject","fetchWordsofObject","fetchInt32ArrayofObject","fetchInt16ArrayofObject","fetchUint16ArrayofObject","fetchIntegerofObject","fetchLong32ofObject","fetchFloatofObject","storeIntegerofObjectwithValue","storePointerofObjectwithValue","stObjectatput","classArray","isKindOfInteger","classLargeNegativeInteger","classLargePositiveInteger","classBitmap","classSmallInteger","classPoint","classString","nilObject","falseObject","trueObject","instantiateClassindexableSize","methodArgumentCount","makePointwithxValueyValue","pushRemappableOop","popRemappableOop","showDisplayBitsLeftTopRightBottom","ioLoadFunctionFrom","pluginName","indent","highlight","highlightPC","innerIndents","scanner","InstructionStream","oldPC","endPC","interpretNextInstructionFor","print","instruction","substr","toUpperCase","blockReturnTop","doDup","doPop","jump","jumpIf","condition","methodReturnReceiver","methodReturnTop","methodReturnConstant","popIntoLiteralVariable","anAssociation","popIntoReceiverVariable","popIntoTemporaryVariable","pushActiveContext","pushConstant","pushLiteralVariable","pushReceiver","pushReceiverVariable","pushTemporaryVariable","numberArguments","storeIntoLiteralVariable","storeIntoReceiverVariable","storeIntoTemporaryVariable","popIntoNewArray","numElements","pushRemoteTemp","arrayOffset","storeIntoRemoteTemp","popIntoRemoteTemp","specialConstants","client","interpretExtension","offset2","byte4","comments","isHot","debug","clsName","sel","generate","canSingleStep","clsAndSel","functionNameFor","op","char","repl","|","~","<","=",">","&","@","*","+","\\","-",",","/","?","prevPC","sourceLabels","needsLabel","needsBreak","generatePush","generatePopInto","generateReturn","generateBlockReturn","generateExtended","generateJump","generateJumpIf","generateNumericOp","generateQuickPrim","generateSend","deleteUnneededLabels","bytecode","generateStoreInto","generateInstruction","generateClosureTemps","generateClosureCopy","arg1","suffix1","arg2","suffix2","generateDebugCode","generateLabel","distance","suffix","superSend","comment","bytecodes","instr","SHL","SHR","indexForDeltaFromto","thisSample","nextSample","bestIndex","diff","stepSizeTable","nextBits","remaining","bitPosition","currentByte","encodedBytes","byteIndex","nextBitsput","anInteger","bitsAvailable","bufBits","primitiveDecodeMono","predictedDelta","step","bitsPerSample","deltaSignMask","deltaValueHighBit","deltaValueMask","frameSizeMask","indexTable","predicted","sampleIndex","samples","primitiveDecodeStereo","deltaLeft","deltaRight","indexLeft","indexRight","predictedDeltaLeft","predictedDeltaRight","predictedLeft","predictedRight","stepLeft","stepRight","rightSamples","primitiveEncodeMono","primitiveEncodeStereo","anInterpreter","ok","CLASSOF","SIZEOF","BYTESIZEOF","DIV","MOD","PTR_ADD","FPTR_ADD","aaColorMaskGet","workBuffer","GWAAColorMask","aaColorMaskPut","aaColorShiftGet","GWAAColorShift","aaColorShiftPut","aaFirstPixelFromto","leftX","rightX","firstPixel","aaLevelGet","aaHalfPixelPut","GWAAHalfPixel","aaLastPixelFromto","GWAALevel","aaLevelPut","aaScanMaskGet","GWAAScanMask","aaScanMaskPut","aaShiftGet","GWAAShift","aaShiftPut","absoluteSquared8Dot24","word1","word2","accurateLengthOfwith","deltaX","deltaY","length2","computeSqrt","addEdgeToGET","edge","allocateGETEntry","getBuffer","getUsedGet","getUsedPut","adjustWideBezierLeftwidthoffsetendX","bezier","lineOffset","endX","lastX","lastY","bezierUpdateDataOf","GBUpdateX","wideBezierUpdateDataOf","GBUpdateY","bezierFinalXOfput","adjustWideBezierRightwidthoffsetendX","adjustWideLineafterSteppingFromto","line","nextX","baseWidth","xDir","yEntry","yExit","wideLineEntryOf","wideLineExitOf","wideLineExtentOf","offsetFromWidth","wideLineWidthOf","lineXDirectionOf","edgeXValueOfput","lineXIncrementOf","wideLineWidthOfput","aetStartGet","GWAETStart","aetStartPut","aetUsedGet","GWAETUsed","aetUsedPut","allocateAETEntry","nSlots","needAvailableSpace","allocateBezier","allocateObjEntry","GBBaseSize","objUsed","objectTypeOfput","GEPrimitiveBezier","objectIndexOfput","objectLengthOfput","allocateBezierStackEntry","wbStackPush","wbStackSize","allocateBitmapFillcolormap","cmSize","cmBits","cm","fill","fillSize","GBMBaseSize","GEPrimitiveClippedBitmapFill","colormapOf","hasColorTransform","transformColor","bitmapCmSizeOfput","iLimiT","aetBuffer","allocateGradientFillrampWidthisRadial","ramp","rampWidth","isRadial","rampPtr","GGBaseSize","GEPrimitiveRadialGradientFill","GEPrimitiveLinearGradientFill","gradientRampOf","gradientRampLengthOfput","allocateLine","GLBaseSize","GEPrimitiveLine","allocateStackEntry","allocateStackFillEntry","stackFillEntryLength","allocateWideBezier","GBWideSize","GEPrimitiveWideBezier","allocateWideLine","GLWideSize","GEPrimitiveWideLine","areEdgeFillsValid","objectHeaderOf","GEEdgeFillsInvalid","assureValuebetweenand","val1","val2","val3","bezierEndXOf","objat","GBEndX","bezierEndXOfput","objatput","bezierEndYOf","GBEndY","bezierEndYOfput","bezierFinalXOf","GBFinalX","objBuffer","GBUpdateData","bezierViaXOf","GBViaX","bezierViaXOfput","bezierViaYOf","GBViaY","bezierViaYOfput","bitmapCmSizeOf","bmFill","GBColormapSize","bitmapDepthOf","GBBitmapDepth","bitmapDepthOfput","bitmapHeightOf","GBBitmapHeight","bitmapHeightOfput","bitmapRasterOf","GBBitmapRaster","bitmapRasterOfput","bitmapSizeOf","GBBitmapSize","bitmapSizeOfput","bitmapTileFlagOf","GBTileFlag","bitmapTileFlagOfput","bitmapValuebitsatXy","xp","yp","bmDepth","bmRaster","cMask","rShift","uncheckedTransformColor","rShiftTable","bitmapWidthOf","GBBitmapWidth","bitmapWidthOfput","bzEndX","wbStackValue","bzEndXput","wbStackValueput","bzEndY","bzEndYput","bzStartX","bzStartXput","bzStartY","bzStartYput","bzViaX","bzViaXput","bzViaY","bzViaYput","checkCompressedFillIndexListmaxsegments","fillList","maxIndex","nSegs","fillPtr","nFills","runLength","runValue","shortRunLengthAtfrom","shortRunValueAtfrom","checkCompressedFills","indexList","fillIndex","isFillOkay","checkCompressedLineWidthssegments","lineWidthList","nSegments","nItems","ptr","checkCompressedPointssegments","points","pSize","checkCompressedShapesegmentsleftFillsrightFillslineWidthslineFillsfillIndexList","leftFills","rightFills","lineWidths","lineFills","fillIndexList","maxFillIndex","checkedAddBezierToGET","isWide","wideBezierExtentOf","fillMinYGet","edgeXValueOf","fillMaxXGet","checkedAddEdgeToGET","isLine","checkedAddLineToGET","isBezier","lineEndYOf","lineEndXOf","circleCosTable","theTable","circleSinTable","clampValuemax","maxValue","clearSpanBuffer","x0","x1","spanStartGet","spanEndGet","spanSizeGet","spanBuffer","spanStartPut","spanEndPut","clearSpanBufferGet","GWClearSpanBuffer","clearSpanBufferPut","clipMaxXGet","GWClipMaxX","clipMaxXPut","clipMaxYGet","GWClipMaxY","clipMaxYPut","clipMinXGet","GWClipMinX","clipMinXPut","clipMinYGet","GWClipMinY","clipMinYPut","colorTransform","GWColorTransform","GBColormapOffset","computeBeziersplitAt","param","endY","leftViaX","leftViaY","newIndex","rightViaX","rightViaY","sharedX","sharedY","startX","startY","viaX","viaY","engineStopped","computeBezierSplitAtHalf","computeFinalWideBezierValueswidth","temp","wideBezierWidthOfput","smallSqrtTable","copyBitsFromtoat","yValue","copyBitsFn","createGlobalEdgeTable","end","isEdge","edgeYValueOf","fillMaxYGet","objectLengthOf","currentYGet","GWCurrentY","currentYPut","currentZGet","GWCurrentZ","currentZPut","destOffsetXGet","GWDestOffsetX","destOffsetXPut","destOffsetYGet","GWDestOffsetY","destOffsetYPut","displaySpanBufferAt","targetX0","targetX1","targetY","edgeFillsInvalidate","objectTypeOf","edgeFillsValidate","edgeLeftFillOf","GEFillIndexLeft","edgeLeftFillOfput","edgeNumLinesOf","GENumLines","edgeNumLinesOfput","edgeRightFillOf","GEFillIndexRight","edgeRightFillOfput","edgeTransform","GWEdgeTransform","edgeTypeOf","GEXValue","GEYValue","edgeYValueOfput","edgeZValueOf","GEZValue","edgeZValueOfput","errorWrongIndex","fillAllFromto","stopX","topFill","topRightX","fillSpanfromto","quickRemoveInvalidFillsAt","fillBitmapSpan","fillBitmapSpanfromtoat","lastExportedFillGet","lastExportedLeftXGet","lastExportedRightXGet","fillBitmapSpanfromto","baseShift","bitX","colorMask","colorShift","fillValue","spanEndAAGet","spanEndAAPut","bmHeight","bmWidth","ds","dsX","dt","dtX","tileFlag","fillBitmapSpanAAfromtoat","loadBitsFrom","fillOriginXOf","fillOriginYOf","fillDirectionXOf","fillNormalXOf","fillDirectionYOf","fillNormalYOf","repeatValuemax","aaLevel","cShift","idx","lastPixel","fillColorSpanfromto","pixelValue32","fillColorSpanAAx0x1","pv32","GFDirectionX","fillDirectionXOfput","GFDirectionY","fillDirectionYOfput","fillLinearGradient","fillLinearGradientfromtoat","rampIndex","rampSize","gradientRampLengthOf","fillLinearGradientAArampdsdsXfromto","deltaS","rampValue","GWFillMaxX","fillMaxXPut","GWFillMaxY","fillMaxYPut","fillMinXGet","GWFillMinX","fillMinXPut","GWFillMinY","fillMinYPut","GFNormalX","fillNormalXOfput","GFNormalY","fillNormalYOfput","GFOriginX","fillOriginXOfput","GFOriginY","fillOriginYOfput","fillRadialDecreasingrampdeltaSTdsXdtXfromto","deltaST","nextLength","squaredLengthOfwith","fillRadialDecreasingAArampdeltaSTdsXdtXfromto","fillRadialGradient","fillRadialGradientfromtoat","point1Get","fillRadialIncreasingrampdeltaSTdsXdtXfromto","fillRadialIncreasingAArampdeltaSTdsXdtXfromto","lastLength","fillSortsbefore","fillEntry1","fillEntry2","stackFillDepth","stackFillValue","isFillColor","lastExportedFillPut","lastExportedLeftXPut","lastExportedRightXPut","fillTypeOf","GEPrimitiveFillMask","findNextExternalEntryFromGET","getStartGet","GEPrimitiveWideMask","GEPrimitiveEdge","stepToFirstLine","stepToFirstWideLine","stepToFirstBezier","stepToFirstWideBezier","insertEdgeIntoAET","getStartPut","findNextExternalFillFromAET","leftEdge","rightEdge","toggleWideFillOf","toggleFillsOf","findNextExternalUpdateFromAET","removeFirstAETEntry","stepToNextLine","stepToNextWideLine","stepToNextBezier","stepToNextWideBezier","resortFirstAETEntry","findStackFilldepth","stackFillSize","finishedProcessing","stateGet","GEStateCompleted","freeStackFillEntry","wbStackPop","getSortsbefore","edge1","edge2","GWGETStart","GWGETUsed","GFRampLength","GFRampOffset","hasColorTransformGet","GWHasColorTransform","hasColorTransformPut","hasEdgeTransform","hasEdgeTransformGet","GWHasEdgeTransform","hasEdgeTransformPut","hideFilldepth","newDepth","newRightX","newTop","newTopIndex","stackFillValueput","stackFillDepthput","stackFillRightXput","stackFillRightX","topFillValue","topFillValuePut","topFillDepth","topFillDepthPut","topFillRightX","topFillRightXPut","incrementStatby","statIndex","indexForInsertingIntoAET","initialX","initColorTransform","initEdgeTransform","loadBBFn","bbPluginName","initializeGETProcessing","setAALevel","sortGlobalEdgeTable","insertToAETbeforeIndex","GEPrimitiveEdgeMask","isFill","isRealFill","isObject","GEPrimitiveWide","lastExportedEdgeGet","GWLastExportedEdge","lastExportedEdgePut","GWLastExportedFill","GWLastExportedLeftX","GWLastExportedRightX","GLEndX","lineEndXOfput","GLEndY","lineEndYOfput","lineErrorAdjDownOf","GLErrorAdjDown","lineErrorAdjDownOfput","lineErrorAdjUpOf","GLErrorAdjUp","lineErrorAdjUpOfput","lineErrorOf","GLError","lineErrorOfput","GLXDirection","lineXDirectionOfput","GLXIncrement","lineXIncrementOfput","lineYDirectionOfput","GLYDirection","loadAndSubdivideBezierFromviatoisWide","point1","point2","point3","wideFlag","bz1","bz2","index1","index2","subdivideToBeMonotoninX","subdivideBezierFrom","loadArrayPolygonnPointsfilllineWidthlineFill","nPoints","lineFill","y0","y1","loadPointfrom","point2Get","transformPoints","loadWideLinefromtolineFillleftFillrightFill","loadArrayShapenSegmentsfilllineWidthlineFill","pointOop","segs","x2","y2","point3Get","loadWideBezierlineFillleftFillrightFilln","loadArrayTransformFromintolength","transformOop","destPtr","loadBeziersegmentleftFillrightFilloffset","leftFillIndex","rightFillIndex","yOffset","loadBitBltFrom","bbObj","loadBitmapFillcolormaptilefromalongnormalxIndex","formOop","cmOop","xIndex","bmBits","bmBitsSize","ppw","loadFillOrientationfromalongnormalwidthheight","bitsLen","bitsOop","objectIndexOf","formArray","loadColorTransformFrom","okay","loadTransformFromintolength","loadCompressedSegmentfromshortleftFillrightFilllineWidthlineColor","segmentIndex","pointsShort","leftFill","rightFill","loadCompressedShapesegmentsleftFillsrightFillslineWidthslineFillsfillIndexListpointShort","leftLength","leftRun","leftValue","lineFillLength","lineFillRun","lineFillValue","rightLength","rightRun","rightValue","widthLength","widthRun","widthValue","transformWidth","loadEdgeStateFrom","edgeOop","ETBalloonEdgeDataSize","ETXValueIndex","ETYValueIndex","ETZValueIndex","ETLinesIndex","loadEdgeTransformFrom","fillWidth","fillHeight","dirX","dirY","dsLength2","dsY","dtLength2","dtY","nrmX","nrmY","transformPoint","loadFormsFrom","arrayOop","loadGradientFillfromalongnormalisRadial","rampOop","loadLinefromtooffsetleftFillrightFill","p1","p2","yDir","loadOvallineFillleftFillrightFill","cx","cy","loadOvalSegmentwhcxcy","seg","pointArray","loadPolygonnPointsfilllineWidthlineFillpointsShort","isShort","loadRectanglelineFillleftFillrightFill","point4Get","loadRenderingState","failCode","fillOop","PrimErrBadNumArgs","quickLoadEngineFrom","PrimErrBadArgument","loadSpanBufferFrom","BESpanIndex","engine","BEBitBltIndex","BEFormsIndex","GEFEdgeDataTooSmall","FTBalloonFillDataSize","GEFFillDataTooSmall","GEStateWaitingForEdge","GEStateWaitingForFill","GEStateWaitingChange","GEFWrongState","GEFFormLoadFailed","GEFBitBltLoadFailed","loadShapenSegmentsfilllineWidthlineFillpointsShort","spanOop","GEFClassMismatch","spanSizePut","loadWordTransformFromintolength","wide","wideBezierFillOfput","wideBezierExtentOfput","wbStackClear","wideLineFillOfput","wideLineExtentOfput","srcPtr","loadWorkBufferFrom","wbOop","GEFWorkBufferIsInteger","GWMinimalSize","GEFWorkBufferTooSmall","workBufferPut","magicNumberGet","GWMagicNumber","GEFWorkBufferBadMagic","wbSizeGet","GEFWorkBufferWrongSize","objStartGet","GWHeaderSize","GEFWorkBufferStartWrong","objUsedGet","GEFWorkTooBig","GEFWorkBufferIsPointers","GWMagicIndex","magicNumberPut","moduleUnloaded","aModuleName","strcmp","moveAETEntryFromedgex","xValue","wbTopGet","stopBecauseOf","GErrorNoMoreSpace","needsFlush","needsFlushGet","GWNeedsFlush","needsFlushPut","GWObjStart","objStartPut","GWObjUsed","objUsedPut","GEObjectType","GEObjectIndex","GEObjectLength","GEPrimitiveTypeMask","GWPoint1","GWPoint2","GWPoint3","GWPoint4","postDisplayAction","statePut","primitiveAbortProcessing","failureCode","storeEngineStateInto","primitiveAddActiveEdgeEntry","doProfileStats","geProfileTime","ioMicroMSecs","quickLoadEngineFromrequiredState","GEFEngineStopped","GEStateAddingFromGET","GWCountAddAETEntry","GWTimeAddAETEntry","primitiveAddBezier","endOop","startOop","viaOop","GEStateUnlocked","GEFEntityLoadFailed","GEFWrongFill","primitiveAddBezierShape","pointsIsArray","segSize","primitiveAddBitmapFill","dirOop","nrmOop","originOop","GEFBadPoint","primitiveAddCompressedShape","GEFEntityCheckFailed","primitiveAddGradientFill","primitiveAddLine","primitiveAddOval","borderIndex","borderWidth","primitiveAddPolygon","primitiveAddRect","primitiveChangedActiveEdgeEntry","GEStateUpdateEdges","GWCountChangeAETEntry","GWTimeChangeAETEntry","primitiveCopyBuffer","buf1","buf2","GEFSizeMismatch","GWBufferTop","GWSize","primitiveDisplaySpanBuffer","GEStateBlitBuffer","GWCountDisplaySpan","GWTimeDisplaySpan","primitiveDoProfileStats","newValue","oldValue","primitiveFinishedProcessing","finished","GWCountFinishTest","GWTimeFinishTest","primitiveGetAALevel","primitiveGetBezierStats","statOop","GWBezierMonotonSubdivisions","GWBezierHeightSubdivisions","GWBezierOverflowSubdivisions","GWBezierLineConversions","primitiveGetClipRect","rectOop","topRemappableOop","primitiveGetCounts","GWCountInitializing","GWCountNextGETEntry","GWCountNextFillEntry","GWCountMergeFill","GWCountNextAETEntry","primitiveGetDepth","primitiveGetFailureReason","GEFEngineIsInteger","BEBalloonEngineSize","GEFEngineTooSmall","BEWorkBufferIndex","stopReasonGet","GEFEngineIsWords","primitiveGetOffset","primitiveGetTimes","GWTimeInitializing","GWTimeNextGETEntry","GWTimeNextFillEntry","GWTimeMergeFill","GWTimeNextAETEntry","primitiveInitializeBuffer","wbSizePut","wbTopPut","GEPrimitiveFill","stopReasonPut","resetGraphicsEngineStats","primitiveInitializeProcessing","primitiveMergeFillFrom","FTIndexIndex","FTMinXIndex","FTMaxXIndex","GEStateScanningAET","primitiveNeedsFlush","needFlush","primitiveNeedsFlushPut","primitiveNextActiveEdgeEntry","hasEdge","quickLoadEngineFromrequiredStateor","storeEdgeStateFrominto","primitiveNextFillEntry","hasFill","storeFillStateInto","primitiveNextGlobalEdgeEntry","GEFWrongEdge","primitiveRegisterExternalEdge","initialY","initialZ","GEBaseEdgeSize","primitiveRegisterExternalFill","GEBaseFillSize","primitiveRenderImage","proceedRenderingScanline","storeRenderingState","proceedRenderingImage","primitiveRenderScanline","primitiveSetAALevel","level","primitiveSetBitBltPlugin","needReload","newPluginName","primitiveSetClipRect","primitiveSetColorTransform","primitiveSetDepth","primitiveSetEdgeTransform","primitiveSetOffset","external","GErrorGETEntry","GErrorFillEntry","GErrorAETEntry","engineOop","GEFAlreadyFailed","requiredState","GErrorBadState","alternativeState","topDepth","quickSortGlobalEdgeTablefromto","again","before","dij","dj","ij","k","tmp","tt","newDelta","returnWideBezierFill","dispatchReturnValue","wideBezierFillOf","dispatchedValue","returnWideBezierWidth","wideBezierWidthOf","returnWideLineFill","wideLineFillOf","returnWideLineWidth","runArray","showFilldepthrightX","GWSpanEndAA","GWSpanEnd","GWSpanSize","GWSpanStart","GWState","stepToFirstBezierInat","fwDDx","fwDDy","fwDx","fwDy","fwX1","fwX2","fwY1","fwY2","maxSteps","scaledStepSize","squaredStepSize","updateData","GBUpdateDX","GBUpdateDY","GBUpdateDDX","GBUpdateDDY","stepToNextBezierInat","stepToFirstLineInat","errorAdjUp","widthX","xInc","stepToNextLineInat","stepToFirstWideBezierInat","nLines","wideBezierEntryOfput","wideBezierExitOfput","stepToNextWideBezierInat","stepToFirstWideLineInat","wideLineEntryOfput","wideLineExitOfput","stepToNextWideLineInat","stepToNextBezierForwardat","minY","wideBezierEntryOf","wideBezierExitOf","stopReason","GWStopReason","ETIndexIndex","FTYValueIndex","storeStopStateIntoEdgefill","subdivideBezier","otherIndex","base","doTestX","base2","subdivideToBeMonotonInY","subdivideToBeMonotonInX","denom","dx1","dx2","dy1","dy2","toggleFilldepthrightX","hidden","alphaScale","GErrorNeedFlush","point","transformPointinto","srcPoint","dstPoint","transformPointXyinto","dstWidth","dstWidth2","GBWideEntry","GBWideExit","GBWideExtent","GBWideFill","GBWideUpdateData","GBWideWidth","GLWideEntry","GLWideExit","GLWideExtent","GLWideFill","GLWideWidth","SHIFT","OLDrgbDiffwith","sourceWord","destinationWord","pixMask","destDepth","maskTable","bitCount","partitionedSubfromnBitsnPartitions","OLDtallyIntoMapwith","mapIndex","shiftWord","cmFlags","ColorMapPresent","ColorMapIndexedPart","cmMask","destPPW","tallyMapAtput","tallyMapAt","rgbMapfromto","cmBitsPerColor","addWordwith","alphaBlendwith","unAlpha","blendRB","blendAG","alpha","alphaBlendConstwith","alphaBlendConstwithpaintMode","paintMode","rgbMask","pixBlend","sourceShifted","sourcePixVal","destPixVal","bitsPerColor","blend","destShifted","maskShifted","sourceAlpha","destMask","alphaBlendScaledwith","rb","ag","alphaPaintConstwith","alphaSourceBlendBits16","ditherBase","ditherThreshold","srcAlpha","dstMask","destWord","dstY","ditherIndex","bbH","sy","dy","dx","destMSB","mask1","sourcePitch","sx","destPitch","bbW","ditherMatrix4x4","sourceBits","dither32To16threshold","dstLongAtputmask","destBits","alphaSourceBlendBits32","alphaSourceBlendBits8","mappingTable","mapperFlags","default8To32Table","ColorMapNewStyle","mask2","AllOnes","mapPixelflags","bitAndwith","bitAndInvertwith","bitInvertAndwith","bitInvertAndInvertwith","bitInvertDestinationwith","bitInvertOrwith","bitInvertOrInvertwith","bitInvertSourcewith","bitInvertXorwith","bitOrwith","bitOrInvertwith","bitXorwith","checkSourceOverlap","sourceForm","destForm","vDir","hDir","destIndex","destDelta","clearWordwith","clipRange","destX","clipX","sourceX","clipWidth","destY","clipY","sourceY","clipHeight","noSource","sourceWidth","sourceHeight","copyBits","affectedL","affectedR","affectedT","affectedB","lockSurfaces","copyBitsLockedAndClipped","unlockSurfaces","showDisplayBits","copyBitsRule41Test","tryCopyingBitsQuickly","combinationRule","performCopyLoop","ungammaLookupTableOop","gammaLookupTableOop","componentAlphaModeAlpha","componentAlphaModeColor","gammaLookupTable","ungammaLookupTable","copyLoop","mergeWord","skewWord","skewMask","halftoneWord","unskew","mergeFnwith","hInc","prevWord","thisWord","notSkewMask","opTable","skew","noHalftone","halftoneHeight","halftoneAt","preload","sourceIndex","sourceDelta","copyLoopNoSource","copyLoopPixMap","srcShiftInc","dstShiftLeft","sourcePixMask","nSourceIncs","startBits","dstShift","destPixMask","dstShiftInc","endBits","nPix","scrStartBits","sourcePPW","sourceDepth","sourceMSB","srcBitShift","dstBitShift","pickSourcePixelsflagssrcMaskdestMasksrcShiftIncdstShiftInc","deltaFromtonSteps","FixedPt1","destMaskAndPointerInit","pixPerM1","destinationWordwith","srcWord","ditherValue","addThreshold","dither8Lookup","drawLoopXY","xDelta","yDelta","P","affT","px","affR","affL","py","affB","BBDestXIndex","bitBltOop","BBDestYIndex","srcValue","dstValue","expensiveDither32To16threshold","pv","threshold","out","ditherThresholds16","ditherValues16","fetchIntOrFloatofObject","fieldIndex","objectPointer","floatValue","fieldOop","fetchIntOrFloatofObjectifNil","defaultValue","fixAlphawith","halftoneBase","ignoreSourceOrHalftone","formPointer","initBBOpTable","sourceWordwith","subWordwith","rgbAddwith","rgbSubwith","pixPaintwith","pixMaskwith","rgbMaxwith","rgbMinwith","rgbMinInvertwith","rgbDiffwith","tallyIntoMapwith","rgbMulwith","pixSwapwith","pixClearwith","rgbComponentAlphawith","initDither8Lookup","isIdentityMapwith","shifts","masks","RedIndex","GreenIndex","BlueIndex","AlphaIndex","loadBitBltDestForm","destBitsSize","FormBitsIndex","destWidth","FormWidthIndex","destHeight","FormHeightIndex","FormDepthIndex","queryDestSurface","loadBitBltFromwarping","aBool","isWarping","BBRuleIndex","OpTableSize","BBSourceFormIndex","halftoneForm","BBHalftoneFormIndex","BBDestFormIndex","BBWidthIndex","BBHeightIndex","loadBitBltSourceForm","loadColorMap","setupColorMasks","BBSourceXIndex","BBSourceYIndex","loadHalftoneForm","BBClipXIndex","BBClipYIndex","BBClipWidthIndex","BBClipHeightIndex","sourceBitsSize","querySourceSurface","oldStyle","cmShiftTable","cmMaskTable","cmLookupTable","BBColorMapIndex","loadColorMapShiftOrMaskFrom","ColorMapFixedPart","mapOop","halftoneBits","loadSurfacePlugin","querySurfaceFn","lockSurfaceFn","unlockSurfaceFn","loadWarpBltFrom","destHandle","sourceHandle","fn","hasSurfaceLock","sourcePixel","rgbMapPixelflags","partitionedANDtonBitsnPartitions","nBits","nParts","partitionedAddtonBitscomponentMaskcarryOverflowMask","componentMask","carryOverflowMask","w2","carryOverflow","sum","w1","partitionedMaxwithnBitsnPartitions","partitionedMinwithnBitsnPartitions","partitionedMulwithnBitsnPartitions","dMask","product","sMask","partitionedRgbComponentAlphadestnBitsnPartitions","rgbMap16To32","rgbComponentAlpha32with","sourceSkewAndPointerInit","nPixels","srcMask","sourcePix","destPix","pickWarpPixelAtXy","xx","yy","warpAlignShift","warpBitShiftTable","warpAlignMask","warpSrcMask","lowMask","highMask","primitiveCopyBits","primitiveDisplayString","charIndex","sourcePtr","stopIndex","xTable","maxGlyph","quickBlt","glyphIndex","glyphMap","kernDelta","sourceString","primitiveDrawLoop","primitivePixelValueAt","pixel","bitmap","ppW","stride","bitsSize","xVal","yVal","_return_value","primitiveWarpBits","warpBits","d","rgbComponentAlpha16","rgbComponentAlpha32","srcColor","aG","aA","aR","aB","answer","s","rgbComponentAlpha8","rgbMap32To32","nBitsIn","nBitsOut","srcPix","wordToInvert","targetBits","setupColorMasksFromto","srcBits","deltaBits","dxLowBits","sxLowBits","dWid","pixVal","destLocked","ns","warpLoop","nSteps","deltaP43y","deltaP43x","pBy","pAy","pBx","sourceMapOop","pAx","deltaP12y","deltaP12x","smoothingCount","BBWarpBase","warpLoopSetup","warpPickSourcePixelsxDeltahyDeltahxDeltavyDeltavdstShiftIncflags","warpPickSmoothPixelsxDeltahyDeltahxDeltavyDeltavsourceMapsmoothingdstShiftInc","warpSrcShift","xDeltah","yDeltah","xDeltav","yDeltav","sourceMap","xdh","ydh","xdv","ydv","checkedFloatPtrOf","checkedWordPtrOf","loadFFTFrom","fftOop","nu","fftSize","sinTableSize","sinTable","permTableSize","permTable","realDataSize","realData","imagDataSize","imagData","permuteData","scaleData","forward","transformData","realN","transformForward","fftScale","fftSize2","fftSize4","ii","imagT","imagU","ip","lev","lev1","realT","realU","theta","primitiveAddFloatArray","argPtr","rcvrPtr","primitiveAddScalar","primitiveAt","floatPtr","primitiveAtPut","primitiveDivFloatArray","primitiveDivScalar","inverse","primitiveDotProduct","primitiveEqual","primitiveHashArray","primitiveLength","primitiveMulFloatArray","primitiveMulScalar","primitiveNormalize","len","primitiveSubFloatArray","primitiveSubScalar","primitiveSum","cSquaredDistanceFromto","aPoint","bPoint","aPointX","bPointX","xDiff","aPointY","bPointY","yDiff","cSubstAngleFactorFromto","startDegreeNumber","endDegreeNumber","absDiff","majorNO","minorNO","primSameClassAbsoluteStrokeDistanceMyPoints_otherPoints_myVectors_otherVectors_mySquaredLengths_otherSquaredLengths_myAngles_otherAngles_maxSizeAndReferenceFlag_rowBase_rowInsertRemove_rowInsertRemoveCount","otherAngles","otherSquaredLengthsSize","forReference","jM1","iM1","jM1T2","insert","otherVectors","otherVectorsSize","otherSquaredLengths","rowBaseSize","myPoints","jLimiT","mySquaredLengths","additionalMultiInsertRemoveCost","otherPoints","otherPointsSize","myVectors","rowInsertRemoveCount","rowBase","maxDist","iM1T2","insertRemove","myVectorsSize","subst","maxSize","removeBase","substBase","myAngles","insertRemoveCount","rowInsertRemove","insertBase","myPointsOop","otherPointsOop","myVectorsOop","otherVectorsOop","mySquaredLengthsOop","otherSquaredLengthsOop","myAnglesOop","otherAnglesOop","maxSizeAndRefFlag","rowBaseOop","rowInsertRemoveOop","rowInsertRemoveCountOop","primVersionNO","cbColorComponentFrom","colorComponentfrom","cbComponent","colorComponentBlocksfrom","cbBlocks","aColorComponent","MinComponentSize","CurrentXIndex","CurrentYIndex","HScaleIndex","VScaleIndex","BlockWidthIndex","MCUWidthIndex","PriorDCValueIndex","blocks","blockOop","MCUBlockIndex","MaxMCUBlocks","DCTSize2","colorConvertGrayscaleMCU","yComponent","jpegBitsSize","nextSampleY","residuals","MaxSample","ditherMask","jpegBits","colorConvertMCU","blue","cb","cr","green","red","crComponent","nextSampleCb","SampleOffset","nextSampleCr","FIXn1n40200","FIXn0n34414","FIXn0n71414","FIXn1n77200","crColorComponentFrom","crBlocks","decodeBlockIntocomponent","anArray","zeroCount","jpegDecodeValueFromsize","dcTable","dcTableSize","getBits","scaleAndSignExtendinFieldWidth","acTable","acTableSize","jpegNaturalOrder","fillBuffer","jsBitCount","jsReadLimit","jsPosition","jsCollection","jsBitBuffer","requestedBits","idctBlockIntqt","qt","anACTerm","dcval","row","t0","t1","t10","t11","t12","t13","t2","t3","z1","z2","z3","z4","z5","ws","DCTSize","FIXn0n541196100","FIXn1n847759065","FIXn0n765366865","FIXn1n175875602","FIXn0n298631336","FIXn2n053119869","FIXn3n072711026","FIXn1n501321110","FIXn0n899976223","FIXn2n562915447","FIXn1n961570560","FIXn0n390180644","table","tableSize","bitsNeeded","tableIndex","MaxBits","loadJPEGStreamFrom","streamOop","blockIndex","curX","sample","yBlocks","primitiveColorConvertGrayscaleMCU","stInit","yColorComponentFrom","primitiveColorConvertMCU","primitiveDecodeMCU","storeJPEGStreamOn","primitiveIdctInt","aNumber","degreesFromXy","tanVal","degreesToRadians","degrees","deg","headingRadians","q","drawTurtlesInArray","bitsIndex","colorArray","colorOop","destOop","visible","visibleArray","visibleOop","xArray","xOop","yArray","yOop","getHeadingArrayInto","heading","headingArray","headingOop","resultArray","resultOop","getScalarHeading","radiansToDegrees","kedamaRandomSeed","randA","randM","randQ","randR","kedamaRandom2","range","hi","lo","kedamaSetRandomSeed","seed","makeMask","dOrigin","dataBits","dataSize","mOrigin","maskBits","maskSize","shiftAmount","makeMaskLog","maxFirst","maxLog","maxOop","makeTurtlesMap","whoArray","whoOop","primPixelAtXY","ret","xPos","yPos","primPixelAtXYPut","primPixelsAtXY","bitsHeight","bitsWidth","destWords","destWordsOop","xArrayOop","yArrayOop","primScalarForward","bottomEdgeMode","leftEdgeMode","newX","newY","rightEdgeMode","topEdgeMode","cos","scalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode","scalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode","primSetPixelsAtXY","intValue","isValueInt","valueOop","wordsValue","primTurtlesForward","isValVector","valArray","valOop","primUpHill","maxVal","maxValX","maxValY","rowOffset","sniffRange","tH","tX","tY","thisVal","turtleX","turtleY","primitiveAddArrays","argOop","floatsArg","floatsRcvr","floatsResult","isArgWords","isRcvrWords","rcvrOop","wordsArg","wordsRcvr","wordsResult","floatArg","intArg","isArgInt","primitiveDivArrays","primitiveMulArrays","primitiveSubArrays","radians","randomIntoFloatArray","factor","floatArray","floatArrayOop","randomIntoIntegerArray","integerArray","integerArrayOop","randomRange","scalarGetAngleTo","fromX","fromY","toX","toY","scalarGetDistanceTo","setHeadingArrayFrom","setScalarHeading","shutdownModule","turtleScalarSetX","turtleScalarSetY","yIndex","turtlesSetX","turtlesSetY","vectorGetAngleTo","isVector","pX","pXOop","pY","pYOop","ppx","ppy","vectorGetDistanceTo","zoomBitmap","dstSize","dummy","sHeight","sOrigin","sWidth","srcOrigin","srcSize","xFactor","yFactor","floatsValue","fv","isValueWordArray","pArray","pArrayOop","pOop","primitiveAndByteArray","length1","otherArray","otherOop","rcvrArray","primitiveEQArrays","bytesResult","primitiveEQScalar","primitiveGEArrays","primitiveGEScalar","primitiveGTArrays","primitiveGTScalar","primitiveLEArrays","primitiveLEScalar","primitiveLTArrays","primitiveLTScalar","primitiveNEArrays","primitiveNEScalar","primitiveNotByteArray","primitiveOrByteArray","primitivePredicateAtAllPutBoolean","predicates","predicatesOop","values","valuesOop","primitivePredicateAtAllPutColor","primitivePredicateAtAllPutNumber","primitivePredicateAtAllPutObject","primitivePredicateReplaceBytes","predicatesSize","repOop","repStart","replacement","replacementSize","valuesSize","primitivePredicateReplaceWords","floatReplacement","floatValues","rIsFloat","vIsFloat","primitiveRemArrays","floatRcvr","floatResult","wordArg","wordRcvr","wordResult","primitiveRemScalar","isWordVector","wordValArray","addAmplitudeDiplophonia","periodCount","frame","Diplophonia","addFlutter","asin","bsin","csin","deltaF0","timeCount","samplesCount","samplingRate","PI","Flutter","F0","addFrequencyDiplophonia","Ro","addJitter","nextRandom","Jitter","addShimmer","Shimmer","antiResonatorfrequencybandwidth","freq","bw","resonatorAput","resonatorBput","resonatorCput","antiResonatorvalue","aFloat","resonatorA","resonatorB","resonatorP1","resonatorC","resonatorP2","resonatorP2put","resonatorP1put","cascadeBranch","cascade","Rnz","resonatorvalue","Rnpc","Rtz","Rtpc","R8c","R7c","R6c","R5c","R4c","R3c","R2c","R1c","checkedShortPtrOf","glottalSource","nopen","nper","a1","a2","c1","pitchSynchronousReset","linearFromdB","loadFrom","klattOop","resonators","nmod","glast","vlast","nlast","samplesPerFrame","normalizeGlottalPulse","ingore","s0","s1","s2","parallelFrictionBranch","R2fp","R3fp","R4fp","R5fp","R6fp","parallelVoicedBranch","R1vp","R2vp","R3vp","R4vp","Rnpp","Rtpp","voicedPitchSynchronousReset","primitiveSynthesizeFrameIntoStartingAt","aKlattFrame","bufferOop","synthesizeFrameintostartingAt","saveTo","quphicosphisinphirphid","u","phi","cosphi","sinphi","rphid","expuphi","resonatorfrequencybandwidth","resonatorfrequencybandwidthgain","gain","rorark","roNumber","raNumber","rkNumber","gamma","gammapwr","ra","rho","rk","ro","te","zeroQphicosphisinphirphid","origKlattOop","a1Oop","a2Oop","b1Oop","c1Oop","glastOop","nlastOop","pitchOop","vlastOop","x1Oop","x2Oop","setCurrentFrame","ampF1V","ampF2F","ampF2V","ampF3F","ampF3V","ampF4F","ampF4V","ampF5F","ampF6F","ampFNV","ampFTV","Anv","Atv","A1v","A2v","A3v","A4v","A2f","A3f","A4f","A5f","A6f","F6","B6","F5","B5","F4","B4","F3","B3","F2","B2","F1","B1","Fnp","Bnp","Ftp","Btp","Fnz","Bnz","Ftz","Btz","B2f","B3f","B4f","B5f","B6f","ampGain","aspiration","aspirationNoise","bypass","friction","frictionNoise","glotout","noise","parGlotout","parVoicing","turbulence","voice","voicing","Voicing","Turbulence","Friction","Aspiration","Bypass","Gain","Rout","Ra","Rk","qa","qb","qc","qzero","ua","ub","uc","Epsilon","anyBitOfBytesfromto","aBytesOop","stopArg","lastByteIx","digit","magnitude","leftShift","rightShift","firstByteIx","ix","highBitOfBytes","digitOfBytesat","bytesgrowTo","aBytesObject","newLen","oldLen","copyLen","newBytes","cDigitCopyFromtolen","bytesOrIntgrowTo","sq_class","cCopyIntValtoBytes","pByte","ixLimiT","cDigitLengthOfCSI","cDigitOfCSIat","cDigitAddlenwithleninto","pByteShort","shortLen","pByteLong","longLen","pByteRes","accum","cDigitComparewithlen","pFirst","pSecond","firstDigit","secondDigit","pFrom","pTo","cDigitDivlenremlenquolen","pDiv","divLen","pRem","remLen","pQuo","quoLen","dnh","r3","mul","cond","dl","ql","r1r2","dh","cDigitHighBitlen","lastDigit","realLength","cHighBit","csi","cDigitLshiftfromlentolen","lenFrom","lenTo","digitShift","carry","bitShift","rshift","cDigitReplacefromtowithstartingAt","cDigitMontgomerylentimeslenmodulolenmInvModBinto","pBytesFirst","firstLen","pBytesSecond","secondLen","pBytesThird","thirdLen","mInv","pBytesRes","lastByte","limit3","limit2","limit1","cDigitMultiplylenwithleninto","ab","limitLong","limitShort","cDigitOpshortlenlongleninto","opIndex","andOpIndex","orOpIndex","xorOpIndex","cDigitRshiftfromlentolen","fromLen","toLen","cDigitSublenwithleninto","pByteSmall","smallLen","pByteLarge","largeLen","z","uint","bitNo","createLargeFromSmallInteger","anOop","res","digitLshift","highBit","digitRshiftlookfirst","newOop","oldDigitLen","newByteLen","newBitLen","oldBitLen","digitAddLargewith","firstInteger","secondInteger","over","shortInt","resClass","newSum","longInt","digitBitLogicwithopIndex","opIx","shortLarge","firstLarge","secondLarge","longLarge","normalizePositive","digitCompareLargewith","digitDivLargewithnegative","neg","resultClass","rem","quo","unsafeByteOfat","digitLength","digitMontgomerytimesmodulomInvModB","thirdLarge","prod","digitMultiplyLargewithnegative","normalize","digitSubLargewith","smallerLen","larger","smaller","resLen","largerLen","firstNeg","normalizeNegative","isNormalized","sLen","minVal","aLargeInteger","aLargeNegativeInteger","aLargePositiveInteger","primAnyBitFromTo","large","primAsLargeInteger","primCheckIfCModuleExists","_primDigitBitShift","aLarge","primDigitAdd","primDigitAddWith","primDigitBitAnd","primDigitBitLogicWithOp","primDigitBitOr","primDigitBitShift","primDigitBitShiftMagnitude","primDigitBitXor","primDigitCompare","firstVal","secondVal","primDigitCompareWith","primDigitDivNegative","firstAsLargeInteger","secondAsLargeInteger","primDigitDivWithNegative","primDigitMultiplyNegative","primDigitMultiplyWithNegative","primDigitSubtract","primDigitSubtractWith","primGetModuleName","strPtr","strLen","strOop","strlen","primMontgomeryTimesModulo","secondOperandInteger","thirdModuloInteger","smallInverseInteger","primNormalize","primNormalizeNegative","primNormalizePositive","bytesOop","pointer","loadArgumentMatrix","matrix","loadArgumentPoint","isInt","m23ArgX","m23ArgY","matrix2x3ComposeMatrixwithinto","m1","m2","m3","a11","a12","a13","a21","a22","a23","matrix2x3InvertPoint","det","detX","detY","m23ResultX","m23ResultY","matrix2x3TransformPoint","okayIntValue","primitiveComposeMatrix","primitiveInvertPoint","roundAndStoreResultPoint","primitiveInvertRectInto","cornerX","cornerY","dstOop","maxX","maxY","minX","originX","originY","srcOop","roundAndStoreResultRectx0y0x1y1","primitiveIsIdentity","primitiveIsPureTranslation","primitiveTransformPoint","primitiveTransformRectInto","nItemsToPop","cornerOop","encodeBytesOfinat","ba","encodeIntinat","primitiveCompareString","string1","string2","order","c2","len1","len2","primitiveCompressToByteArray","bm","eqBytes","lowByte","primitiveConvert8BitSigned","aByteArray","aSoundBuffer","primitiveDecompressFromByteArray","pastEnd","primitiveFindFirstInString","aString","inclusionMap","stringSize","primitiveFindSubstring","matchTable","primitiveIndexOfAsciiInString","primitiveStringHash","speciesHash","byteArraySize","low","primitiveTranslateStringWithTable","bitmapatputHsv","hue","saturation","brightness","hF","hI","outPix","checkedUnsignedIntPtrOf","hueFromRGBminmax","span","interpolateandfrac","pix1","pix2","frac2","frac1","interpolatedFromxywidthheight","xFixed","yFixed","bottomPix","topPix","xFrac","yFrac","primitiveBlur","bTotal","dX","dY","gTotal","in_","inOop","outOop","pix","rTotal","primitiveBrightnessShift","primitiveCondenseSound","_src","_dst","primitiveDoubleSize","baseIndex","dstX","inH","inW","outH","outW","primitiveExtractChannel","rightFlag","primitiveFisheye","ang","centerX","centerY","power","scaledPower","atan2","primitiveHalfSizeAverage","dstH","dstW","primitiveHalfSizeDiagonal","primitiveHueShift","primitiveInterpolate","primitiveSaturationShift","primitiveScale","inX","inY","outX","outY","p3","p4","tWeight","w3","w4","xIncr","yIncr","primitiveWaterRipples1","aArOop","aArray","allPix","bArOop","bArray","blops","newLoc","ripply","random","primitiveWhirl","cosa","radius","radiusSquared","scaleX","scaleY","sina","whirlRadians","primitiveApplyReverb","delayedLeft","delayedRight","sliceIndex","tapGain","tapIndex","bufferIndex","leftBuffer","rightBuffer","tapCount","tapDelays","tapGains","primitiveMixFMSound","leftVol","rightVol","doingFM","lastIndex","normalizedModulation","scaledIndex","scaledIndexIncr","scaledOffsetIndex","scaledOffsetIndexIncr","scaledVol","scaledVolIncr","scaledVolLimit","scaledWaveTableSize","waveTable","primitiveMixLoopedSampledSound","compositeLeftVol","compositeRightVol","isInStereo","leftVal","nextSampleIndex","rightVal","lastSample","leftSamples","loopEnd","releaseCount","scaledLoopLength","LoopIndexFractionMask","LoopIndexScaleFactor","primitiveMixPluckedSound","average","scaledNextIndex","scaledThisIndex","ring","scaledIndexLimit","ScaleFactor","primitiveMixSampledSound","outIndex","overflow","indexHighBits","samplesSize","scaledIncrement","ScaledIndexOverflow","primitiveDiffuseFromToWidthHeightDelta","area","rowStart","primitiveEvaporateRate","patchVar","patchVarOop","rate","primitiveMapFromToWidthHeightPatchSizeRgbFlagsShift","patchSize","rgbFlags","rgbMult","comparewithmin","here","matchPos","minLength","zipCollection","DeflateMaxMatch","deflateBlockchainLengthgoodMatch","chainLength","goodMatch","flushNeeded","hasMatch","hereLength","hereMatch","matchResult","newLength","newMatch","zipBlockPos","zipLiteralCount","zipLiteralSize","findMatchlastLengthlastMatchchainLengthgoodMatch","DeflateMinMatch","insertStringAt","encodeMatchdistance","encodeLiteral","determineSizeOfReadStream","readStreamInstSize","determineSizeOfWriteStream","writeStreamInstSize","lit","zipLiterals","zipDistances","zipLiteralFreq","shouldFlush","literal","zipMatchLengthCodes","zipDistanceCodes","zipDistanceFreq","zipMatchCount","lastMatch","maxChainLength","bestLength","zipHashHead","updateHashAt","DeflateMaxDistance","zipPosition","zipHashTail","DeflateWindowMask","prevEntry","zipHashValue","loadDeflateStreamFrom","zipCollectionSize","zipReadLimit","DeflateHashTableSize","DeflateWindowSize","DeflateMaxLiteralCodes","DeflateMaxDistanceCodes","loadZipEncoderFrom","zipBitBuf","zipBitPos","nextZipBitsput","tablePtr","zipDistTable","zipDistTableSize","zipLitTable","zipLitTableSize","zipState","zipSourcePos","zipSourceLimit","zipSource","zipDecompressBlock","primitiveUpdateAdler32","adler32","bytePtr","collection","crc","zipCrcTable","distStream","distTree","litStream","litTree","sendBlockwithwithwith","literalStream","distanceStream","distArray","distBitLengths","distBlCount","distCodes","litArray","litBlCount","litLimit","litPos","llBitLengths","llCodes","zipExtraLengthBits","zipBaseLength","zipExtraDistanceBits","zipBaseDistance","nLits","updateHash","nextValue","DeflateHashMask","zipDecodeValueFromsize","zipNextBits","oldBitPos","oldBits","oldPos","StateNoMoreData","_keyStr","_f","compressToBase64","input","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","compress","NaN","isNaN","charAt","decompressFromBase64","output_","ol","decompress","current","uncompressed","context_dictionary","context_dictionaryToCreate","context_c","context_wc","context_w","context_enlargeIn","context_dictSize","context_numBits","context_data_string","context_data_val","context_data_position","resb","maxpower","dictionary","enlargeIn","numBits","exports"],"mappings":"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,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,cAGhG,YACI/O,eAAgB,SAAS6C,EAAM1B,GAG3B,OADAlhC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AAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WACpF,WAAY,WAAY,WAAY,WAAY,WAAY,WA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I,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC1D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5D,GAAI,GAAI,GAAI,GAAI,GAA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","sourcesContent":["/*\n * Copyright (c) 2013-2016 Bert Freudenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n\"use strict\"; \n\n//////////////////////////////////////////////////////////////////////////////\n// these functions fake the Lively module and class system\n// just enough so the loading of vm.js succeeds\n//////////////////////////////////////////////////////////////////////////////\n\nwindow.module = function(dottedPath) {\n if (dottedPath === \"\") return window;\n var path = dottedPath.split(\".\"),\n name = path.pop(),\n parent = module(path.join(\".\")),\n self = parent[name];\n if (!self) parent[name] = self = {\n loaded: false,\n pending: [],\n requires: function(req) {\n return {\n toRun: function(code) {\n function load() {\n code();\n self.loaded = true;\n self.pending.forEach(function(f){f();});\n }\n if (req && !module(req).loaded) {\n module(req).pending.push(load);\n } else {\n load();\n }\n }\n };\n },\n };\n return self;\n};\n\nObject.extend = function(obj /* + more args */ ) {\n // skip arg 0, copy properties of other args to obj\n for (var i = 1; i < arguments.length; i++)\n if (typeof arguments[i] == 'object')\n for (var name in arguments[i])\n obj[name] = arguments[i][name];\n};\n\nFunction.prototype.subclass = function(classPath /* + more args */ ) {\n // create subclass\n var subclass = function() {\n if (this.initialize) this.initialize.apply(this, arguments);\n return this;\n };\n // set up prototype\n var protoclass = function() { };\n protoclass.prototype = this.prototype;\n subclass.prototype = new protoclass();\n // skip arg 0, copy properties of other args to prototype\n for (var i = 1; i < arguments.length; i++)\n Object.extend(subclass.prototype, arguments[i]);\n // add class to module\n var modulePath = classPath.split(\".\"),\n className = modulePath.pop();\n module(modulePath.join('.'))[className] = subclass;\n return subclass;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n// load vm, plugins, and other libraries\n//////////////////////////////////////////////////////////////////////////////\n\n(function(){\n var scripts = document.getElementsByTagName(\"script\"),\n squeakjs = scripts[scripts.length - 1],\n vmDir = squeakjs.src.replace(/[^\\/]*$/, \"\");\n if (squeakjs.src.match(/squeak\\.min\\.js$/)) return;\n [ \"vm.js\",\n \"jit.js\",\n \"plugins/ADPCMCodecPlugin.js\",\n \"plugins/B2DPlugin.js\",\n \"plugins/BitBltPlugin.js\",\n \"plugins/FFTPlugin.js\",\n \"plugins/FloatArrayPlugin.js\",\n \"plugins/GeniePlugin.js\",\n \"plugins/JPEGReaderPlugin.js\",\n \"plugins/KedamaPlugin.js\",\n \"plugins/KedamaPlugin2.js\",\n \"plugins/Klatt.js\",\n \"plugins/LargeIntegers.js\",\n \"plugins/Matrix2x3Plugin.js\",\n \"plugins/MiscPrimitivePlugin.js\",\n \"plugins/ScratchPlugin.js\",\n \"plugins/SoundGenerationPlugin.js\",\n \"plugins/StarSqueakPlugin.js\",\n \"plugins/ZipPlugin.js\",\n \"lib/lz-string.js\",\n ].forEach(function(filename) {\n var script = document.createElement('script');\n script.setAttribute(\"type\",\"text/javascript\");\n script.setAttribute(\"src\", vmDir + filename);\n document.getElementsByTagName(\"head\")[0].appendChild(script);\n });\n})();\n\nmodule(\"SqueakJS\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\n// if in private mode set localStorage to a regular dict\nvar localStorage = window.localStorage;\ntry {\n localStorage[\"squeak-foo:\"] = \"bar\";\n if (localStorage[\"squeak-foo:\"] !== \"bar\") throw Error();\n delete localStorage[\"squeak-foo:\"];\n} catch(e) {\n localStorage = {};\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// display & event setup\n//////////////////////////////////////////////////////////////////////////////\n\nfunction setupFullscreen(display, canvas, options) {\n // Fullscreen can only be enabled in an event handler. So we check the\n // fullscreen flag on every mouse down/up and keyboard event.\n var box = canvas.parentElement,\n fullscreenEvent = \"fullscreenchange\",\n fullscreenElement = \"fullscreenElement\",\n fullscreenEnabled = \"fullscreenEnabled\";\n\n if (!box.requestFullscreen) {\n [ // Fullscreen support is still very browser-dependent\n {req: box.webkitRequestFullscreen, exit: document.webkitExitFullscreen,\n evt: \"webkitfullscreenchange\", elem: \"webkitFullscreenElement\", enable: \"webkitFullscreenEnabled\"},\n {req: box.mozRequestFullScreen, exit: document.mozCancelFullScreen,\n evt: \"mozfullscreenchange\", elem: \"mozFullScreenElement\", enable: \"mozFullScreenEnabled\"},\n {req: box.msRequestFullscreen, exit: document.msExitFullscreen,\n evt: \"MSFullscreenChange\", elem: \"msFullscreenElement\", enable: \"msFullscreenEnabled\"},\n ].forEach(function(browser) {\n if (browser.req) {\n box.requestFullscreen = browser.req;\n document.exitFullscreen = browser.exit;\n fullscreenEvent = browser.evt;\n fullscreenElement = browser.elem;\n fullscreenEnabled = browser.enable;\n }\n });\n }\n\n // If the user canceled fullscreen, turn off the fullscreen flag so\n // we don't try to enable it again in the next event\n function fullscreenChange(fullscreen) {\n display.fullscreen = fullscreen;\n box.style.background = fullscreen ? 'black' : '';\n if (options.header) options.header.style.display = fullscreen ? 'none' : '';\n if (options.footer) options.footer.style.display = fullscreen ? 'none' : '';\n if (options.fullscreenCheckbox) options.fullscreenCheckbox.checked = fullscreen;\n setTimeout(window.onresize, 0);\n }\n \n var checkFullscreen;\n \n if (box.requestFullscreen) {\n document.addEventListener(fullscreenEvent, function(){fullscreenChange(box == document[fullscreenElement]);});\n checkFullscreen = function() {\n if (document[fullscreenEnabled] && (box == document[fullscreenElement]) != display.fullscreen) {\n if (display.fullscreen) box.requestFullscreen();\n else document.exitFullscreen();\n }\n };\n } else {\n var isFullscreen = false;\n checkFullscreen = function() {\n if ((options.header || options.footer) && isFullscreen != display.fullscreen) {\n isFullscreen = display.fullscreen;\n fullscreenChange(isFullscreen);\n }\n };\n }\n\n if (options.fullscreenCheckbox) options.fullscreenCheckbox.onclick = function() {\n display.fullscreen = options.fullscreenCheckbox.checked;\n checkFullscreen();\n };\n\n return checkFullscreen;\n}\n\nfunction setupSwapButtons(options) {\n if (options.swapCheckbox) {\n var imageName = localStorage[\"squeakImageName\"] || \"default\",\n settings = JSON.parse(localStorage[\"squeakSettings:\" + imageName] || \"{}\");\n if (\"swapButtons\" in settings) options.swapButtons = settings.swapButtons;\n options.swapCheckbox.checked = options.swapButtons;\n options.swapCheckbox.onclick = function() {\n options.swapButtons = options.swapCheckbox.checked;\n settings[\"swapButtons\"] = options.swapButtons;\n localStorage[\"squeakSettings:\" + imageName] = JSON.stringify(settings);\n };\n }\n}\n\nfunction recordModifiers(evt, display) {\n var shiftPressed = evt.shiftKey,\n ctrlPressed = evt.ctrlKey && !evt.altKey,\n cmdPressed = evt.metaKey || (evt.altKey && !evt.ctrlKey),\n modifiers =\n (shiftPressed ? Squeak.Keyboard_Shift : 0) +\n (ctrlPressed ? Squeak.Keyboard_Ctrl : 0) +\n (cmdPressed ? Squeak.Keyboard_Cmd : 0);\n display.buttons = (display.buttons & ~Squeak.Keyboard_All) | modifiers;\n return modifiers;\n}\n\nvar canUseMouseOffset = navigator.userAgent.match(\"AppleWebKit/\");\n\nfunction updateMousePos(evt, canvas, display) {\n var evtX = canUseMouseOffset ? evt.offsetX : evt.layerX,\n evtY = canUseMouseOffset ? evt.offsetY : evt.layerY;\n display.cursorCanvas.style.left = (evtX + canvas.offsetLeft + display.cursorOffsetX) + \"px\";\n display.cursorCanvas.style.top = (evtY + canvas.offsetTop + display.cursorOffsetY) + \"px\";\n var x = (evtX * canvas.width / canvas.offsetWidth) | 0,\n y = (evtY * canvas.height / canvas.offsetHeight) | 0;\n // clamp to display size\n display.mouseX = Math.max(0, Math.min(display.width, x));\n display.mouseY = Math.max(0, Math.min(display.height, y));\n}\n\nfunction recordMouseEvent(what, evt, canvas, display, eventQueue, options) {\n updateMousePos(evt, canvas, display);\n if (!display.vm) return;\n var buttons = display.buttons & Squeak.Mouse_All;\n switch (what) {\n case 'mousedown':\n switch (evt.button || 0) {\n case 0: buttons = Squeak.Mouse_Red; break; // left\n case 1: buttons = Squeak.Mouse_Yellow; break; // middle\n case 2: buttons = Squeak.Mouse_Blue; break; // right\n }\n if (options.swapButtons)\n if (buttons == Squeak.Mouse_Yellow) buttons = Squeak.Mouse_Blue;\n else if (buttons == Squeak.Mouse_Blue) buttons = Squeak.Mouse_Yellow;\n break;\n case 'mousemove':\n break; // nothing more to do\n case 'mouseup':\n buttons = 0;\n break;\n }\n display.buttons = buttons | recordModifiers(evt, display);\n if (eventQueue) {\n eventQueue.push([\n Squeak.EventTypeMouse,\n evt.timeStamp, // converted to Squeak time in makeSqueakEvent()\n display.mouseX,\n display.mouseY,\n display.buttons & Squeak.Mouse_All,\n display.buttons >> 3,\n ]);\n if (display.signalInputEvent)\n display.signalInputEvent();\n }\n display.idle = 0;\n if (what == 'mouseup') {\n if (display.runFor) display.runFor(100); // maybe we catch the fullscreen flag change\n } else {\n if (display.runNow) display.runNow(); // don't wait for timeout to run\n }\n}\n\nfunction recordKeyboardEvent(key, timestamp, display, eventQueue) {\n if (!display.vm) return;\n var code = (display.buttons >> 3) << 8 | key;\n if (code === display.vm.interruptKeycode) {\n display.vm.interruptPending = true;\n } else if (eventQueue) {\n eventQueue.push([\n Squeak.EventTypeKeyboard,\n timestamp, // converted to Squeak time in makeSqueakEvent()\n key, // MacRoman\n Squeak.EventKeyChar,\n display.buttons >> 3,\n key, // Unicode\n ]);\n if (display.signalInputEvent)\n display.signalInputEvent();\n } else {\n // no event queue, queue keys the old-fashioned way\n display.keys.push(code);\n }\n display.idle = 0;\n if (display.runNow) display.runNow(); // don't wait for timeout to run\n}\n\nfunction recordDragDropEvent(type, evt, canvas, display, eventQueue) {\n if (!display.vm || !eventQueue) return;\n updateMousePos(evt, canvas, display);\n eventQueue.push([\n Squeak.EventTypeDragDropFiles,\n evt.timeStamp, // converted to Squeak time in makeSqueakEvent()\n type,\n display.mouseX,\n display.mouseY,\n display.buttons >> 3,\n display.droppedFiles.length,\n ]);\n if (display.signalInputEvent)\n display.signalInputEvent();\n}\n\nfunction fakeCmdOrCtrlKey(key, timestamp, display, eventQueue) {\n // set both Cmd and Ctrl bit, because we don't know what the image wants\n display.buttons &= ~Squeak.Keyboard_All; // remove all modifiers\n display.buttons |= Squeak.Keyboard_Cmd | Squeak.Keyboard_Ctrl;\n display.keys = []; // flush other keys\n recordKeyboardEvent(key, timestamp, display, eventQueue);\n}\n\nfunction makeSqueakEvent(evt, sqEvtBuf, sqTimeOffset) {\n sqEvtBuf[0] = evt[0];\n sqEvtBuf[1] = (evt[1] - sqTimeOffset) & Squeak.MillisecondClockMask;\n for (var i = 2; i < evt.length; i++)\n sqEvtBuf[i] = evt[i];\n}\n\nfunction createSqueakDisplay(canvas, options) {\n options = options || {};\n if (options.fullscreen) {\n document.body.style.margin = 0;\n document.body.style.backgroundColor = 'black';\n document.ontouchmove = function(evt) { evt.preventDefault(); };\n if (options.header) options.header.style.display = 'none';\n if (options.footer) options.footer.style.display = 'none';\n }\n var display = {\n context: canvas.getContext(\"2d\"),\n fullscreen: false,\n width: 0, // if 0, VM uses canvas.width\n height: 0, // if 0, VM uses canvas.height\n mouseX: 0,\n mouseY: 0,\n buttons: 0,\n keys: [],\n clipboardString: '',\n clipboardStringChanged: false,\n cursorCanvas: document.createElement(\"canvas\"),\n cursorOffsetX: 0,\n cursorOffsetY: 0,\n droppedFiles: [],\n signalInputEvent: null, // function set by VM\n // additional functions added below\n };\n setupSwapButtons(options);\n if (options.pixelated) {\n canvas.classList.add(\"pixelated\");\n display.cursorCanvas.classList.add(\"pixelated\");\n }\n\n var eventQueue = null;\n display.reset = function() {\n eventQueue = null;\n display.signalInputEvent = null;\n display.lastTick = 0;\n display.getNextEvent = function(firstEvtBuf, firstOffset) {\n // might be called from VM to get queued event\n eventQueue = []; // create queue on first call\n eventQueue.push = function(evt) {\n eventQueue.offset = Date.now() - evt[1]; // get epoch from first event\n delete eventQueue.push; // use original push from now on\n eventQueue.push(evt);\n };\n display.getNextEvent = function(evtBuf, timeOffset) {\n var evt = eventQueue.shift();\n if (evt) makeSqueakEvent(evt, evtBuf, timeOffset - eventQueue.offset);\n else evtBuf[0] = Squeak.EventTypeNone;\n };\n display.getNextEvent(firstEvtBuf, firstOffset);\n };\n };\n display.reset();\n\n var checkFullscreen = setupFullscreen(display, canvas, options);\n display.fullscreenRequest = function(fullscreen, thenDo) {\n // called from primitive to change fullscreen mode\n if (display.fullscreen != fullscreen) {\n display.fullscreen = fullscreen;\n display.resizeTodo = thenDo; // called after resizing\n display.resizeTodoTimeout = setTimeout(display.resizeDone, 1000);\n checkFullscreen();\n } else thenDo();\n };\n display.resizeDone = function() {\n clearTimeout(display.resizeTodoTimeout);\n var todo = display.resizeTodo;\n if (todo) {\n display.resizeTodo = null;\n todo();\n }\n };\n display.clear = function() {\n canvas.width = canvas.width;\n };\n display.showBanner = function(msg, style) {\n style = style || {};\n var ctx = display.context;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = style.color || \"#F90\";\n ctx.font = style.font || 'bold 48px sans-serif';\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(msg, canvas.width / 2, canvas.height / 2);\n };\n display.showProgress = function(value, style) {\n style = style || {};\n var ctx = display.context,\n w = (canvas.width / 3) | 0,\n h = 24,\n x = canvas.width * 0.5 - w / 2,\n y = canvas.height * 0.5 + 2 * h;\n ctx.fillStyle = style.background || \"#000\";\n ctx.fillRect(x, y, w, h);\n ctx.lineWidth = 2;\n ctx.strokeStyle = style.color || \"#F90\";\n ctx.strokeRect(x, y, w, h);\n ctx.fillStyle = style.color || \"#F90\";\n ctx.fillRect(x, y, w * value, h);\n };\n display.executeClipboardPaste = function(text, timestamp) {\n if (!display.vm) return true;\n try {\n display.clipboardString = text;\n // simulate paste event for Squeak\n fakeCmdOrCtrlKey('v'.charCodeAt(0), timestamp, display, eventQueue);\n } catch(err) {\n console.error(\"paste error \" + err);\n }\n };\n display.executeClipboardCopy = function(key, timestamp) {\n if (!display.vm) return true;\n // simulate copy event for Squeak so it places its text in clipboard\n display.clipboardStringChanged = false;\n fakeCmdOrCtrlKey((key || 'c').charCodeAt(0), timestamp, display, eventQueue);\n var start = Date.now();\n // now interpret until Squeak has copied to the clipboard\n while (!display.clipboardStringChanged && Date.now() - start < 500)\n display.vm.interpret(20);\n if (!display.clipboardStringChanged) return;\n // got it, now copy to the system clipboard\n try {\n return display.clipboardString;\n } catch(err) {\n console.error(\"copy error \" + err);\n }\n };\n canvas.onmousedown = function(evt) {\n checkFullscreen();\n recordMouseEvent('mousedown', evt, canvas, display, eventQueue, options);\n evt.preventDefault();\n return false;\n };\n canvas.onmouseup = function(evt) {\n recordMouseEvent('mouseup', evt, canvas, display, eventQueue, options);\n checkFullscreen();\n evt.preventDefault();\n };\n canvas.onmousemove = function(evt) {\n recordMouseEvent('mousemove', evt, canvas, display, eventQueue, options);\n evt.preventDefault();\n };\n canvas.oncontextmenu = function() {\n return false;\n };\n // touch event handling\n var touch = {\n state: 'idle',\n button: 0,\n x: 0,\n y: 0,\n dist: 0,\n down: {},\n };\n function touchToMouse(evt) {\n if (evt.touches.length) {\n // average all touch positions\n touch.x = touch.y = 0;\n for (var i = 0; i < evt.touches.length; i++) {\n touch.x += evt.touches[i].pageX / evt.touches.length;\n touch.y += evt.touches[i].pageY / evt.touches.length;\n }\n }\n return {\n timeStamp: evt.timeStamp,\n button: touch.button,\n offsetX: touch.x - canvas.offsetLeft,\n offsetY: touch.y - canvas.offsetTop,\n };\n }\n function dd(ax, ay, bx, by) {var x = ax - bx, y = ay - by; return Math.sqrt(x*x + y*y);}\n function dist(a, b) {return dd(a.pageX, a.pageY, b.pageX, b.pageY);}\n function dent(n, l, t, u) { return n < l ? n + t - l : n > u ? n + t - u : t; }\n function adjustDisplay(l, t, w, h) {\n var cursorCanvas = display.cursorCanvas,\n scale = w / canvas.width;\n canvas.style.left = (l|0) + \"px\";\n canvas.style.top = (t|0) + \"px\";\n canvas.style.width = (w|0) + \"px\";\n canvas.style.height = (h|0) + \"px\";\n cursorCanvas.style.left = (l + display.cursorOffsetX + display.mouseX * scale|0) + \"px\";\n cursorCanvas.style.top = (t + display.cursorOffsetY + display.mouseY * scale|0) + \"px\";\n cursorCanvas.style.width = (cursorCanvas.width * scale|0) + \"px\";\n cursorCanvas.style.height = (cursorCanvas.height * scale|0) + \"px\";\n if (!options.pixelated) {\n if (scale >= 3) {\n canvas.classList.add(\"pixelated\");\n display.cursorCanvas.classList.add(\"pixelated\");\n } else {\n canvas.classList.remove(\"pixelated\");\n display.cursorCanvas.classList.remove(\"pixelated\");\n }\n }\n }\n // zooming/panning with two fingers\n var maxZoom = 5;\n function zoomStart(evt) {\n touch.dist = dist(evt.touches[0], evt.touches[1]);\n touch.down.x = touch.x;\n touch.down.y = touch.y;\n touch.down.dist = touch.dist;\n touch.down.left = canvas.offsetLeft;\n touch.down.top = canvas.offsetTop;\n touch.down.width = canvas.offsetWidth;\n touch.down.height = canvas.offsetHeight;\n // store original canvas bounds\n if (!touch.orig) touch.orig = {\n left: touch.down.left,\n top: touch.down.top,\n right: touch.down.left + touch.down.width,\n bottom: touch.down.top + touch.down.height,\n width: touch.down.width,\n height: touch.down.height,\n };\n }\n function zoomMove(evt) {\n if (evt.touches.length < 2) return;\n touch.dist = dist(evt.touches[0], evt.touches[1]);\n var minScale = touch.orig.width / touch.down.width,\n //nowScale = dent(touch.dist / touch.down.dist, 0.8, 1, 1.5),\n nowScale = touch.dist / touch.down.dist,\n scale = Math.min(Math.max(nowScale, minScale * 0.95), minScale * maxZoom),\n w = touch.down.width * scale,\n h = touch.orig.height * w / touch.orig.width,\n l = touch.down.left - (touch.down.x - touch.down.left) * (scale - 1) + (touch.x - touch.down.x),\n t = touch.down.top - (touch.down.y - touch.down.top) * (scale - 1) + (touch.y - touch.down.y);\n // allow to rubber-band by 20px for feedback\n l = Math.max(Math.min(l, touch.orig.left + 20), touch.orig.right - w - 20);\n t = Math.max(Math.min(t, touch.orig.top + 20), touch.orig.bottom - h - 20);\n adjustDisplay(l, t, w, h);\n }\n function zoomEnd(evt) {\n var l = canvas.offsetLeft,\n t = canvas.offsetTop,\n w = canvas.offsetWidth,\n h = canvas.offsetHeight;\n w = Math.min(Math.max(w, touch.orig.width), touch.orig.width * maxZoom);\n h = touch.orig.height * w / touch.orig.width;\n l = Math.max(Math.min(l, touch.orig.left), touch.orig.right - w);\n t = Math.max(Math.min(t, touch.orig.top), touch.orig.bottom - h);\n adjustDisplay(l, t, w, h);\n }\n // State machine to distinguish between 1st/2nd mouse button and zoom/pan:\n // * if moved, or no 2nd finger within 100ms of 1st down, start mousing\n // * if fingers moved significantly within 200ms of 2nd down, start zooming\n // * if touch ended within this time, generate click (down+up)\n // * otherwise, start mousing with 2nd button\n // When mousing, always generate a move event before down event so that\n // mouseover eventhandlers in image work better \n canvas.ontouchstart = function(evt) {\n evt.preventDefault();\n var e = touchToMouse(evt);\n for (var i = 0; i < evt.changedTouches.length; i++) {\n switch (touch.state) {\n case 'idle':\n touch.state = 'got1stFinger';\n touch.first = e;\n setTimeout(function(){\n if (touch.state !== 'got1stFinger') return;\n touch.state = 'mousing';\n touch.button = e.button = 0;\n recordMouseEvent('mousemove', e, canvas, display, eventQueue, options);\n recordMouseEvent('mousedown', e, canvas, display, eventQueue, options);\n }, 100);\n break;\n case 'got1stFinger':\n touch.state = 'got2ndFinger';\n zoomStart(evt);\n setTimeout(function(){\n if (touch.state !== 'got2ndFinger') return;\n var didMove = Math.abs(touch.down.dist - touch.dist) > 10 ||\n dd(touch.down.x, touch.down.y, touch.x, touch.y) > 10;\n if (didMove) {\n touch.state = 'zooming';\n } else {\n touch.state = 'mousing';\n touch.button = e.button = 2;\n recordMouseEvent('mousemove', e, canvas, display, eventQueue, options);\n recordMouseEvent('mousedown', e, canvas, display, eventQueue, options);\n }\n }, 200);\n break;\n }\n }\n };\n canvas.ontouchmove = function(evt) {\n evt.preventDefault();\n var e = touchToMouse(evt);\n switch (touch.state) {\n case 'got1stFinger': \n touch.state = 'mousing';\n touch.button = e.button = 0;\n recordMouseEvent('mousemove', e, canvas, display, eventQueue, options);\n recordMouseEvent('mousedown', e, canvas, display, eventQueue, options);\n break;\n case 'mousing':\n recordMouseEvent('mousemove', e, canvas, display, eventQueue, options);\n return;\n case 'got2ndFinger':\n if (evt.touches.length > 1)\n touch.dist = dist(evt.touches[0], evt.touches[1]);\n return;\n case 'zooming':\n zoomMove(evt);\n return;\n }\n };\n canvas.ontouchend = function(evt) {\n evt.preventDefault();\n checkFullscreen();\n var e = touchToMouse(evt);\n for (var i = 0; i < evt.changedTouches.length; i++) {\n switch (touch.state) {\n case 'mousing':\n if (evt.touches.length > 0) break;\n touch.state = 'idle';\n recordMouseEvent('mouseup', e, canvas, display, eventQueue, options);\n return;\n case 'got1stFinger': \n touch.state = 'idle';\n touch.button = e.button = 0;\n recordMouseEvent('mousemove', e, canvas, display, eventQueue, options);\n recordMouseEvent('mousedown', e, canvas, display, eventQueue, options);\n recordMouseEvent('mouseup', e, canvas, display, eventQueue, options);\n return;\n case 'got2ndFinger':\n touch.state = 'mousing';\n touch.button = e.button = 2;\n recordMouseEvent('mousemove', e, canvas, display, eventQueue, options);\n recordMouseEvent('mousedown', e, canvas, display, eventQueue, options);\n break;\n case 'zooming':\n if (evt.touches.length > 0) break;\n touch.state = 'idle';\n zoomEnd(evt);\n return;\n }\n }\n };\n canvas.ontouchcancel = function(evt) {\n canvas.ontouchend(evt);\n };\n // cursorCanvas shows Squeak cursor\n display.cursorCanvas.style.display = \"block\";\n display.cursorCanvas.style.position = \"absolute\";\n display.cursorCanvas.style.cursor = \"none\";\n display.cursorCanvas.style.background = \"transparent\";\n display.cursorCanvas.style.pointerEvents = \"none\";\n canvas.parentElement.appendChild(display.cursorCanvas);\n canvas.style.cursor = \"none\";\n // keyboard stuff\n document.onkeypress = function(evt) {\n if (!display.vm) return true;\n // check for ctrl-x/c/v/r\n if (/[CXVR]/.test(String.fromCharCode(evt.charCode + 64)))\n return true; // let browser handle cut/copy/paste/reload\n recordModifiers(evt, display);\n recordKeyboardEvent(evt.charCode, evt.timeStamp, display, eventQueue);\n evt.preventDefault();\n };\n document.onkeydown = function(evt) {\n checkFullscreen();\n if (!display.vm) return true;\n recordModifiers(evt, display);\n var squeakCode = ({\n 8: 8, // Backspace\n 9: 9, // Tab\n 13: 13, // Return\n 27: 27, // Escape\n 33: 11, // PageUp\n 34: 12, // PageDown\n 35: 4, // End\n 36: 1, // Home\n 37: 28, // Left\n 38: 30, // Up\n 39: 29, // Right\n 40: 31, // Down\n 45: 5, // Insert\n 46: 127, // Delete\n })[evt.keyCode];\n if (squeakCode) { // special key pressed\n recordKeyboardEvent(squeakCode, evt.timeStamp, display, eventQueue);\n return evt.preventDefault();\n }\n if ((evt.metaKey || (evt.altKey && !evt.ctrlKey))) {\n var key = evt.key; // only supported in FireFox, others have keyIdentifier\n if (!key && evt.keyIdentifier && evt.keyIdentifier.slice(0,2) == 'U+')\n key = String.fromCharCode(parseInt(evt.keyIdentifier.slice(2), 16));\n if (key && key.length == 1) {\n if (/[CXVR]/i.test(key))\n return true; // let browser handle cut/copy/paste/reload\n var code = key.charCodeAt(0);\n if (/[A-Z]/.test(key) && !evt.shiftKey) code += 32; // make lower-case\n recordKeyboardEvent(code, evt.timeStamp, display, eventQueue);\n return evt.preventDefault();\n }\n }\n };\n document.onkeyup = function(evt) {\n if (!display.vm) return true;\n recordModifiers(evt, display);\n };\n document.oncopy = function(evt, key) {\n var text = display.executeClipboardCopy(key, evt.timeStamp);\n if (typeof text === 'string') {\n evt.clipboardData.setData(\"Text\", text);\n }\n evt.preventDefault();\n };\n document.oncut = function(evt) {\n if (!display.vm) return true;\n document.oncopy(evt, 'x');\n };\n document.onpaste = function(evt) {\n var text = evt.clipboardData.getData('Text');\n display.executeClipboardPaste(text, evt.timeStamp);\n evt.preventDefault();\n };\n // do not use addEventListener, we want to replace any previous drop handler\n function dragEventHasFiles(evt) {\n for (var i = 0; i < evt.dataTransfer.types.length; i++)\n if (evt.dataTransfer.types[i] == 'Files') return true;\n return false;\n }\n document.ondragover = function(evt) {\n evt.preventDefault();\n if (!dragEventHasFiles(evt)) {\n evt.dataTransfer.dropEffect = 'none';\n } else {\n evt.dataTransfer.dropEffect = 'copy';\n recordDragDropEvent(Squeak.EventDragMove, evt, canvas, display, eventQueue);\n }\n };\n document.ondragenter = function(evt) {\n if (!dragEventHasFiles(evt)) return;\n recordDragDropEvent(Squeak.EventDragEnter, evt, canvas, display, eventQueue);\n };\n document.ondragleave = function(evt) {\n if (!dragEventHasFiles(evt)) return;\n recordDragDropEvent(Squeak.EventDragLeave, evt, canvas, display, eventQueue);\n };\n document.ondrop = function(evt) {\n evt.preventDefault();\n if (!dragEventHasFiles(evt)) return false;\n var files = [].slice.call(evt.dataTransfer.files),\n loaded = [],\n image, imageName = null;\n display.droppedFiles = [];\n files.forEach(function(f) {\n display.droppedFiles.push(f.name);\n var reader = new FileReader();\n reader.onload = function () {\n var buffer = this.result;\n Squeak.filePut(f.name, buffer);\n loaded.push(f.name);\n if (!image && /.*image$/.test(f.name) && (!display.vm || confirm(\"Run \" + f.name + \" now?\\n(cancel to use as file)\"))) {\n image = buffer;\n imageName = f.name;\n }\n if (loaded.length == files.length) { \n if (image) {\n SqueakJS.appName = imageName.slice(0, -6);\n SqueakJS.runImage(image, imageName, display, options);\n } else {\n recordDragDropEvent(Squeak.EventDragDrop, evt, canvas, display, eventQueue);\n }\n }\n };\n reader.readAsArrayBuffer(f);\n });\n return false;\n };\n window.onresize = function() {\n if (touch.orig) return; // manually resized\n // call resizeDone only if window size didn't change for 300ms\n var debounceWidth = window.innerWidth,\n debounceHeight = window.innerHeight;\n setTimeout(function() {\n if (debounceWidth == window.innerWidth && debounceHeight == window.innerHeight)\n display.resizeDone();\n }, 300);\n // if no fancy layout, don't bother\n if ((!options.header || !options.footer) && !options.fullscreen) {\n display.width = canvas.width;\n display.height = canvas.height;\n return;\n }\n // CSS won't let us do what we want so we will layout the canvas ourselves.\n var fullscreen = options.fullscreen || display.fullscreen,\n x = 0,\n y = fullscreen ? 0 : options.header.offsetTop + options.header.offsetHeight,\n w = window.innerWidth,\n h = fullscreen ? window.innerHeight : Math.max(100, options.footer.offsetTop - y),\n paddingX = 0, // padding outside canvas\n paddingY = 0;\n // above are the default values for laying out the canvas\n if (!options.fixedWidth) { // set canvas resolution\n display.width = w;\n display.height = h;\n } else { // fixed resolution and aspect ratio\n display.width = options.fixedWidth;\n display.height = options.fixedHeight;\n var wantRatio = display.width / display.height,\n haveRatio = w / h;\n if (haveRatio > wantRatio) {\n paddingX = w - Math.floor(h * wantRatio);\n } else {\n paddingY = h - Math.floor(w / wantRatio);\n }\n }\n // set size and position\n canvas.style.left = (x + Math.floor(paddingX / 2)) + \"px\";\n canvas.style.top = (y + Math.floor(paddingY / 2)) + \"px\";\n canvas.style.width = (w - paddingX) + \"px\";\n canvas.style.height = (h - paddingY) + \"px\";\n // set resolution\n if (canvas.width != display.width || canvas.height != display.height) {\n var preserveScreen = options.fixedWidth || !display.resizeTodo, // preserve unless changing fullscreen\n imgData = preserveScreen && display.context.getImageData(0, 0, canvas.width, canvas.height);\n canvas.width = display.width;\n canvas.height = display.height;\n if (imgData) display.context.putImageData(imgData, 0, 0);\n }\n // set cursor scale\n if (options.fixedWidth) {\n var cursorCanvas = display.cursorCanvas,\n scale = canvas.offsetWidth / canvas.width;\n cursorCanvas.style.width = (cursorCanvas.width * scale) + \"px\";\n cursorCanvas.style.height = (cursorCanvas.height * scale) + \"px\";\n }\n };\n window.onresize();\n return display;\n}\n\nfunction setupSpinner(vm, options) {\n var spinner = options.spinner;\n if (!spinner) return null;\n spinner.onmousedown = function(evt) {\n if (confirm(SqueakJS.appName + \" is busy. Interrupt?\"))\n vm.interruptPending = true;\n };\n return spinner.style;\n}\n\nvar spinnerAngle = 0,\n becameBusy = 0;\nfunction updateSpinner(spinner, idleMS, vm, display) {\n var busy = idleMS === 0,\n animating = vm.lastTick - display.lastTick < 500;\n if (!busy || animating) {\n spinner.display = \"none\";\n becameBusy = 0;\n } else {\n if (becameBusy === 0) {\n becameBusy = vm.lastTick;\n } else if (vm.lastTick - becameBusy > 1000) {\n spinner.display = \"block\";\n spinnerAngle = (spinnerAngle + 30) % 360;\n spinner.webkitTransform = spinner.transform = \"rotate(\" + spinnerAngle + \"deg)\";\n }\n }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// main loop\n//////////////////////////////////////////////////////////////////////////////\n\nvar loop; // holds timeout for main loop\n\nSqueakJS.runImage = function(buffer, name, display, options) {\n window.onbeforeunload = function(evt) {\n var msg = SqueakJS.appName + \" is still running\"; \n evt.returnValue = msg;\n return msg;\n };\n window.clearTimeout(loop);\n display.reset();\n display.clear();\n display.showBanner(\"Loading \" + SqueakJS.appName);\n display.showProgress(0);\n var self = this;\n window.setTimeout(function() {\n var image = new Squeak.Image(name);\n image.readFromBuffer(buffer, function() {\n display.quitFlag = false;\n var vm = new Squeak.Interpreter(image, display);\n SqueakJS.vm = vm;\n localStorage[\"squeakImageName\"] = name;\n setupSwapButtons(options);\n display.clear();\n display.showBanner(\"Starting \" + SqueakJS.appName);\n var spinner = setupSpinner(vm, options);\n function run() {\n try {\n if (display.quitFlag) self.onQuit(vm, display, options);\n else vm.interpret(50, function(ms) {\n if (ms == \"sleep\") ms = 200;\n if (spinner) updateSpinner(spinner, ms, vm, display);\n loop = window.setTimeout(run, ms);\n });\n } catch(error) {\n console.error(error);\n alert(error);\n }\n }\n display.runNow = function() {\n window.clearTimeout(loop);\n run();\n };\n display.runFor = function(milliseconds) {\n var stoptime = Date.now() + milliseconds;\n do {\n display.runNow();\n } while (Date.now() < stoptime);\n };\n run();\n },\n function readProgress(value) {display.showProgress(value);});\n }, 0);\n};\n\nfunction processOptions(options) {\n var search = window.location.hash.slice(1),\n args = search && search.split(\"&\");\n if (args) for (var i = 0; i < args.length; i++) {\n var keyAndVal = args[i].split(\"=\"),\n key = keyAndVal[0],\n val = true;\n if (keyAndVal.length > 1) {\n val = decodeURIComponent(keyAndVal.slice(1).join(\"=\"));\n if (val.match(/^(true|false|null|[0-9\"[{].*)$/))\n try { val = JSON.parse(val); } catch(e) {\n if (val[0] === \"[\") val = val.slice(1,-1).split(\",\"); // handle string arrays\n // if not JSON use string itself\n }\n }\n options[key] = val;\n }\n var root = Squeak.splitFilePath(options.root || \"/\").fullname;\n Squeak.dirCreate(root, true);\n if (!/\\/$/.test(root)) root += \"/\";\n options.root = root;\n if (options.url && options.files && !options.image)\n options.image = options.url + \"/\" + options.files[0];\n}\n\nfunction fetchTemplates(options) {\n if (options.templates) {\n if (options.templates.constructor === Array) {\n var templates = {};\n options.templates.forEach(function(path){ templates[path] = path; });\n options.templates = templates;\n }\n for (var path in options.templates)\n Squeak.fetchTemplateDir(path[0] == \"/\" ? path : options.root + path, options.templates[path]);\n }\n}\n\nSqueakJS.runSqueak = function(imageUrl, canvas, options) {\n processOptions(options);\n if (options.image) imageUrl = options.image;\n else options.image = imageUrl;\n if (imageUrl.match(/^http:/) && location.protocol.match(/^https/)) {\n location.protocol = 'http';\n return;\n }\n SqueakJS.options = options;\n SqueakJS.appName = options.appName || imageUrl.replace(/.*\\//, \"\").replace(/\\.image$/, \"\");\n Squeak.fsck();\n fetchTemplates(options);\n var display = createSqueakDisplay(canvas, options),\n imageName = Squeak.splitFilePath(imageUrl).basename,\n imageData = null,\n baseUrl = imageUrl.replace(/[^\\/]*$/, \"\"),\n files = [{url: imageUrl, name: imageName}];\n if (options.files) {\n options.files.forEach(function(f) { if (f !== imageName) files.push({url: baseUrl + f, name: f}); });\n }\n if (options.document) {\n var docName = Squeak.splitFilePath(options.document).basename;\n files.push({url: options.document, name: docName, forceDownload: options.forceDownload !== false});\n display.documentName = options.root + docName;\n }\n function getNextFile(whenAllDone) {\n if (files.length === 0) return whenAllDone(imageData);\n var file = files.shift(),\n forceDownload = options.forceDownload || file.forceDownload;\n if (!forceDownload && Squeak.fileExists(options.root + file.name)) {\n if (file.name == imageName) {\n Squeak.fileGet(options.root + file.name, function(data) {\n imageData = data;\n getNextFile(whenAllDone);\n }, function onError() {\n Squeak.fileDelete(options.root + file.name);\n files.unshift(file);\n getNextFile(whenAllDone);\n });\n } else getNextFile(whenAllDone);\n return;\n }\n display.showBanner(\"Downloading \" + file.name);\n var rq = new XMLHttpRequest();\n rq.open('GET', file.url);\n rq.responseType = 'arraybuffer';\n rq.onprogress = function(e) {\n if (e.lengthComputable) display.showProgress(e.loaded / e.total);\n };\n rq.onload = function(e) {\n if (this.status == 200) {\n if (file.name == imageName) {imageData = this.response;}\n Squeak.filePut(options.root + file.name, this.response, function() {\n getNextFile(whenAllDone);\n });\n }\n else this.onerror(this.statusText);\n };\n rq.onerror = function(e) {\n console.warn('Retrying with CORS proxy: ' + file.url);\n var proxy = options.proxy || 'https://crossorigin.me/',\n retry = new XMLHttpRequest();\n retry.open('GET', proxy + file.url);\n retry.responseType = rq.responseType;\n retry.onprogress = rq.onprogress;\n retry.onload = rq.onload;\n retry.onerror = function() {alert(\"Failed to download:\\n\" + file.url)};\n retry.send();\n };\n rq.send();\n }\n getNextFile(function whenAllDone(imageData) {\n SqueakJS.runImage(imageData, options.root + imageName, display, options);\n });\n return display;\n};\n\nSqueakJS.quitSqueak = function() {\n SqueakJS.vm.quitFlag = true;\n};\n\nSqueakJS.onQuit = function(vm, display, options) {\n window.onbeforeunload = null;\n display.vm = null;\n if (options.spinner) options.spinner.style.display = \"none\";\n if (options.onQuit) options.onQuit(vm, display, options);\n else display.showBanner(SqueakJS.appName + \" stopped.\");\n};\n\n}); // end module\n\n//////////////////////////////////////////////////////////////////////////////\n// browser stuff\n//////////////////////////////////////////////////////////////////////////////\n\nif (window.applicationCache) {\n applicationCache.addEventListener('updateready', function() {\n // use original appName from options\n var appName = window.SqueakJS && SqueakJS.options && SqueakJS.options.appName || \"SqueakJS\";\n if (confirm(appName + ' has been updated. Restart now?')) {\n window.onbeforeunload = null;\n window.location.reload();\n }\n });\n}\n","module('users.bert.SqueakJS.vm').requires().toRun(function() {\n\"use strict\"; \n/*\n * Copyright (c) 2013-2016 Bert Freudenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n// shorter name for convenience\nwindow.Squeak = users.bert.SqueakJS.vm;\n\n// if in private mode set localStorage to a regular dict\nvar localStorage = window.localStorage;\ntry {\n localStorage[\"squeak-foo:\"] = \"bar\";\n if (localStorage[\"squeak-foo:\"] !== \"bar\") throw Error();\n delete localStorage[\"squeak-foo:\"];\n} catch(e) {\n console.warn(\"localStorage not available, faking\");\n localStorage = {};\n}\n\nObject.extend(Squeak,\n\"version\", {\n // system attributes\n vmVersion: \"SqueakJS 0.8.2\",\n vmBuild: \"unknown\", // replace at runtime by last-modified?\n vmPath: \"/\",\n vmFile: \"vm.js\",\n platformName: \"Web\",\n platformSubtype: \"unknown\",\n osVersion: navigator.userAgent, // might want to parse\n windowSystem: \"HTML\",\n},\n\"object header\", {\n // object headers\n HeaderTypeMask: 3,\n HeaderTypeSizeAndClass: 0, //3-word header\n HeaderTypeClass: 1, //2-word header\n HeaderTypeFree: 2, //free block\n HeaderTypeShort: 3, //1-word header\n},\n\"special objects\", {\n // Indices into SpecialObjects array\n splOb_NilObject: 0,\n splOb_FalseObject: 1,\n splOb_TrueObject: 2,\n splOb_SchedulerAssociation: 3,\n splOb_ClassBitmap: 4,\n splOb_ClassInteger: 5,\n splOb_ClassString: 6,\n splOb_ClassArray: 7,\n splOb_SmalltalkDictionary: 8,\n splOb_ClassFloat: 9,\n splOb_ClassMethodContext: 10,\n splOb_ClassBlockContext: 11,\n splOb_ClassPoint: 12,\n splOb_ClassLargePositiveInteger: 13,\n splOb_TheDisplay: 14,\n splOb_ClassMessage: 15,\n splOb_ClassCompiledMethod: 16,\n splOb_TheLowSpaceSemaphore: 17,\n splOb_ClassSemaphore: 18,\n splOb_ClassCharacter: 19,\n splOb_SelectorDoesNotUnderstand: 20,\n splOb_SelectorCannotReturn: 21,\n splOb_TheInputSemaphore: 22,\n splOb_SpecialSelectors: 23,\n splOb_CharacterTable: 24,\n splOb_SelectorMustBeBoolean: 25,\n splOb_ClassByteArray: 26,\n splOb_ClassProcess: 27,\n splOb_CompactClasses: 28,\n splOb_TheTimerSemaphore: 29,\n splOb_TheInterruptSemaphore: 30,\n splOb_FloatProto: 31,\n splOb_SelectorCannotInterpret: 34,\n splOb_MethodContextProto: 35,\n splOb_ClassBlockClosure: 36,\n splOb_BlockContextProto: 37,\n splOb_ExternalObjectsArray: 38,\n splOb_ClassPseudoContext: 39,\n splOb_ClassTranslatedMethod: 40,\n splOb_TheFinalizationSemaphore: 41,\n splOb_ClassLargeNegativeInteger: 42,\n splOb_ClassExternalAddress: 43,\n splOb_ClassExternalStructure: 44,\n splOb_ClassExternalData: 45,\n splOb_ClassExternalFunction: 46,\n splOb_ClassExternalLibrary: 47,\n splOb_SelectorAboutToReturn: 48,\n splOb_SelectorRunWithIn: 49,\n splOb_SelectorAttemptToAssign: 50,\n splOb_PrimErrTableIndex: 51,\n splOb_ClassAlien: 52,\n splOb_InvokeCallbackSelector: 53,\n splOb_ClassUnsafeAlien: 54,\n splOb_ClassWeakFinalizer: 55,\n},\n\"known classes\", {\n // Class layout:\n Class_superclass: 0,\n Class_mdict: 1,\n Class_format: 2,\n Class_instVars: null, // 3 or 4 depending on image, see instVarNames()\n Class_name: 6,\n // Context layout:\n Context_sender: 0,\n Context_instructionPointer: 1,\n Context_stackPointer: 2,\n Context_method: 3,\n Context_closure: 4,\n Context_receiver: 5,\n Context_tempFrameStart: 6,\n Context_smallFrameSize: 17,\n Context_largeFrameSize: 57,\n BlockContext_caller: 0,\n BlockContext_argumentCount: 3,\n BlockContext_initialIP: 4,\n BlockContext_home: 5,\n // Closure layout:\n Closure_outerContext: 0,\n Closure_startpc: 1,\n Closure_numArgs: 2,\n Closure_firstCopiedValue: 3,\n // Stream layout:\n Stream_array: 0,\n Stream_position: 1,\n Stream_limit: 2,\n //ProcessorScheduler layout:\n ProcSched_processLists: 0,\n ProcSched_activeProcess: 1,\n //Link layout:\n Link_nextLink: 0,\n //LinkedList layout:\n LinkedList_firstLink: 0,\n LinkedList_lastLink: 1,\n //Semaphore layout:\n Semaphore_excessSignals: 2,\n //Process layout:\n Proc_suspendedContext: 1,\n Proc_priority: 2,\n Proc_myList: 3,\n // Association layout:\n Assn_key: 0,\n Assn_value: 1,\n // MethodDict layout:\n MethodDict_array: 1,\n MethodDict_selectorStart: 2,\n // Message layout\n Message_selector: 0,\n Message_arguments: 1,\n Message_lookupClass: 2,\n // Point layout:\n Point_x: 0,\n Point_y: 1,\n // LargeInteger layout:\n LargeInteger_bytes: 0,\n LargeInteger_neg: 1,\n // BitBlt layout:\n BitBlt_dest: 0,\n BitBlt_source: 1,\n BitBlt_halftone: 2,\n BitBlt_combinationRule: 3,\n BitBlt_destX: 4,\n BitBlt_destY: 5,\n BitBlt_width: 6,\n BitBlt_height: 7,\n BitBlt_sourceX: 8,\n BitBlt_sourceY: 9,\n BitBlt_clipX: 10,\n BitBlt_clipY: 11,\n BitBlt_clipW: 12,\n BitBlt_clipH: 13,\n BitBlt_colorMap: 14,\n BitBlt_warpBase: 15,\n // Form layout:\n Form_bits: 0,\n Form_width: 1,\n Form_height: 2,\n Form_depth: 3,\n Form_offset: 4,\n // WeakFinalizationList layout:\n WeakFinalizationList_first: 0,\n // WeakFinalizerItem layout:\n WeakFinalizerItem_list: 0,\n WeakFinalizerItem_next: 1,\n},\n\"events\", {\n Mouse_Blue: 1,\n Mouse_Yellow: 2,\n Mouse_Red: 4,\n Keyboard_Shift: 8,\n Keyboard_Ctrl: 16,\n Keyboard_Alt: 32,\n Keyboard_Cmd: 64,\n Mouse_All: 1 + 2 + 4,\n Keyboard_All: 8 + 16 + 32 + 64,\n EventTypeNone: 0,\n EventTypeMouse: 1,\n EventTypeKeyboard: 2,\n EventTypeDragDropFiles: 3,\n EventKeyChar: 0,\n EventKeyDown: 1,\n EventKeyUp: 2,\n EventDragEnter: 1,\n EventDragMove: 2,\n EventDragLeave: 3,\n EventDragDrop: 4,\n},\n\"constants\", {\n MinSmallInt: -0x40000000,\n MaxSmallInt: 0x3FFFFFFF,\n NonSmallInt: -0x50000000, // non-small and neg (so non pos32 too)\n MillisecondClockMask: 0x1FFFFFFF,\n},\n\"modules\", {\n // don't clobber registered modules\n externalModules: Squeak.externalModules || {},\n registerExternalModule: function(name, module) {\n this.externalModules[name] = module;\n },\n},\n\"files\", {\n fsck: function(whenDone, dir, files, stats) {\n dir = dir || \"\";\n stats = stats || {dirs: 0, files: 0, bytes: 0, deleted: 0};\n if (!files) {\n // find existing files\n files = {};\n for (var key in localStorage) {\n var match = key.match(/squeak-file(\\.lz)?:(.*)$/);\n if (match) {files[match[2]] = true};\n }\n if (typeof indexedDB !== \"undefined\") {\n return this.dbTransaction(\"readonly\", \"fsck cursor\", function(fileStore) {\n var cursorReq = fileStore.openCursor();\n cursorReq.onsuccess = function(e) {\n var cursor = e.target.result;\n if (cursor) {\n files[cursor.key] = true;\n cursor.continue();\n } else { // done\n Squeak.fsck(whenDone, dir, files, stats);\n }\n }\n cursorReq.onerror = function(e) {\n console.error(\"fsck failed\");\n }\n });\n }\n }\n // check directories\n var entries = Squeak.dirList(dir);\n for (var name in entries) {\n var path = dir + \"/\" + name,\n isDir = entries[name][3];\n if (isDir) {\n var exists = \"squeak:\" + path in localStorage;\n if (exists) {\n Squeak.fsck(null, path, files, stats);\n stats.dirs++;\n } else {\n console.log(\"Deleting stale directory \" + path);\n Squeak.dirDelete(path);\n stats.deleted++;\n }\n } else {\n if (!files[path]) {\n console.log(\"Deleting stale file entry \" + path);\n Squeak.fileDelete(path, true);\n stats.deleted++;\n } else {\n files[path] = false; // mark as visited\n stats.files++;\n stats.bytes += entries[name][4];\n }\n }\n }\n // check orphaned files\n if (dir === \"\") {\n console.log(\"squeak fsck: \" + stats.dirs + \" directories, \" + stats.files + \" files, \" + (stats.bytes/1000000).toFixed(1) + \" MBytes\");\n var orphaned = [],\n total = 0;\n for (var path in files) {\n total++;\n if (files[path]) orphaned.push(path); // not marked visited\n }\n if (orphaned.length > 0) {\n for (var i = 0; i < orphaned.length; i++) {\n console.log(\"Deleting orphaned file \" + orphaned[i]);\n delete localStorage[\"squeak-file:\" + orphaned[i]];\n delete localStorage[\"squeak-file.lz:\" + orphaned[i]];\n stats.deleted++;\n }\n if (typeof indexedDB !== \"undefined\") {\n this.dbTransaction(\"readwrite\", \"fsck delete\", function(fileStore) {\n for (var i = 0; i < orphaned.length; i++) {\n fileStore.delete(orphaned[i]);\n };\n });\n }\n }\n if (whenDone) whenDone(stats);\n }\n },\n dbTransaction: function(mode, description, transactionFunc, completionFunc) {\n // File contents is stored in the IndexedDB named \"squeak\" in object store \"files\"\n // and directory entries in localStorage with prefix \"squeak:\"\n function fakeTransaction() {\n transactionFunc(Squeak.dbFake());\n if (completionFunc) completionFunc();\n }\n \n if (typeof indexedDB == \"undefined\") {\n return fakeTransaction();\n }\n\n function startTransaction() {\n var trans = SqueakDB.transaction(\"files\", mode),\n fileStore = trans.objectStore(\"files\");\n trans.oncomplete = function(e) { if (completionFunc) completionFunc(); }\n trans.onerror = function(e) { console.error(e.target.error.name + \": \" + description) }\n trans.onabort = function(e) {\n console.error(e.target.error.name + \": aborting \" + description);\n // fall back to local/memory storage\n transactionFunc(Squeak.dbFake());\n if (completionFunc) completionFunc();\n }\n transactionFunc(fileStore);\n };\n\n // if database connection already opened, just do transaction\n if (window.SqueakDB) return startTransaction();\n\n // otherwise, open SqueakDB first\n var openReq = indexedDB.open(\"squeak\");\n \n // UIWebView implements the interface but only returns null\n // https://stackoverflow.com/questions/27415998/indexeddb-open-returns-null-on-safari-ios-8-1-1-and-halts-execution-on-cordova\n if (!openReq) {\n return fakeTransaction();\n }\n\n openReq.onsuccess = function(e) {\n console.log(\"Opened files database.\");\n window.SqueakDB = this.result;\n SqueakDB.onversionchange = function(e) {\n delete window.SqueakDB;\n this.close();\n };\n SqueakDB.onerror = function(e) {\n console.error(\"Error accessing database: \" + e.target.error.name);\n };\n startTransaction();\n };\n openReq.onupgradeneeded = function (e) {\n // run only first time, or when version changed\n console.log(\"Creating files database\");\n var db = e.target.result;\n db.createObjectStore(\"files\");\n };\n openReq.onerror = function(e) {\n console.error(e.target.error.name + \": cannot open files database\");\n console.warn(\"Falling back to local storage\");\n fakeTransaction();\n };\n openReq.onblocked = function(e) {\n // If some other tab is loaded with the database, then it needs to be closed\n // before we can proceed upgrading the database.\n console.log(\"Database upgrade needed, but was blocked.\");\n console.warn(\"Falling back to local storage\");\n fakeTransaction();\n };\n },\n dbFake: function() {\n // indexedDB is not supported by this browser, fake it using localStorage\n // since localStorage space is severly limited, use LZString if loaded\n // see https://github.com/pieroxy/lz-string\n if (typeof SqueakDBFake == \"undefined\") {\n if (typeof indexedDB == \"undefined\")\n console.warn(\"IndexedDB not supported by this browser, using localStorage\");\n window.SqueakDBFake = {\n bigFiles: {},\n bigFileThreshold: 100000,\n get: function(filename) {\n var buffer = SqueakDBFake.bigFiles[filename];\n if (!buffer) {\n var string = localStorage[\"squeak-file:\" + filename];\n if (!string) {\n var compressed = localStorage[\"squeak-file.lz:\" + filename];\n if (compressed) {\n if (typeof LZString == \"object\") {\n string = LZString.decompressFromUTF16(compressed);\n } else {\n console.error(\"LZString not loaded: cannot decompress \" + filename);\n }\n }\n }\n if (string) {\n var bytes = new Uint8Array(string.length);\n for (var i = 0; i < bytes.length; i++)\n bytes[i] = string.charCodeAt(i) & 0xFF;\n buffer = bytes.buffer;\n }\n }\n var req = {result: buffer};\n setTimeout(function(){\n if (req.onsuccess) req.onsuccess({target: req});\n }, 0);\n return req;\n },\n put: function(buffer, filename) {\n if (buffer.byteLength > SqueakDBFake.bigFileThreshold) {\n if (!SqueakDBFake.bigFiles[filename])\n console.log(\"File \" + filename + \" (\" + buffer.byteLength + \" bytes) too large, storing in memory only\");\n SqueakDBFake.bigFiles[filename] = buffer;\n } else {\n var string = Squeak.bytesAsString(new Uint8Array(buffer));\n if (typeof LZString == \"object\") {\n var compressed = LZString.compressToUTF16(string);\n localStorage[\"squeak-file.lz:\" + filename] = compressed;\n delete localStorage[\"squeak-file:\" + filename];\n } else {\n localStorage[\"squeak-file:\" + filename] = string;\n }\n }\n var req = {};\n setTimeout(function(){if (req.onsuccess) req.onsuccess()}, 0);\n return req;\n },\n delete: function(filename) {\n delete localStorage[\"squeak-file:\" + filename];\n delete localStorage[\"squeak-file.lz:\" + filename];\n delete SqueakDBFake.bigFiles[filename];\n var req = {};\n setTimeout(function(){if (req.onsuccess) req.onsuccess()}, 0);\n return req;\n },\n openCursor: function() {\n var req = {};\n setTimeout(function(){if (req.onsuccess) req.onsuccess({target: req})}, 0);\n return req;\n },\n }\n }\n return SqueakDBFake;\n },\n fileGet: function(filepath, thenDo, errorDo) {\n if (!errorDo) errorDo = function(err) { console.log(err) };\n var path = this.splitFilePath(filepath);\n if (!path.basename) return errorDo(\"Invalid path: \" + filepath);\n // if we have been writing to memory, return that version\n if (window.SqueakDBFake && SqueakDBFake.bigFiles[path.fullname])\n return thenDo(SqueakDBFake.bigFiles[path.fullname]);\n this.dbTransaction(\"readonly\", \"get \" + filepath, function(fileStore) {\n var getReq = fileStore.get(path.fullname);\n getReq.onerror = function(e) { errorDo(e.target.error.name) };\n getReq.onsuccess = function(e) {\n if (this.result !== undefined) return thenDo(this.result);\n // might be a template\n Squeak.fetchTemplateFile(path.fullname,\n function gotTemplate(template) {thenDo(template)},\n function noTemplate() {\n // if no indexedDB then we have checked fake db already\n if (typeof indexedDB == \"undefined\") return errorDo(\"file not found: \" + path.fullname);\n // fall back on fake db, may be file is there\n var fakeReq = Squeak.dbFake().get(path.fullname);\n fakeReq.onerror = function(e) { errorDo(\"file not found: \" + path.fullname) };\n fakeReq.onsuccess = function(e) { thenDo(this.result); }\n });\n };\n });\n },\n filePut: function(filepath, contents, optSuccess) {\n // store file, return dir entry if successful\n var path = this.splitFilePath(filepath); if (!path.basename) return null;\n var directory = this.dirList(path.dirname); if (!directory) return null;\n // get or create entry\n var entry = directory[path.basename],\n now = this.totalSeconds();\n if (!entry) { // new file\n entry = [/*name*/ path.basename, /*ctime*/ now, /*mtime*/ 0, /*dir*/ false, /*size*/ 0];\n directory[path.basename] = entry;\n } else if (entry[3]) // is a directory\n return null;\n // update directory entry\n entry[2] = now; // modification time\n entry[4] = contents.byteLength || contents.length || 0;\n localStorage[\"squeak:\" + path.dirname] = JSON.stringify(directory);\n // put file contents (async)\n this.dbTransaction(\"readwrite\", \"put \" + filepath,\n function(fileStore) {\n fileStore.put(contents, path.fullname);\n },\n function transactionComplete() {\n if (optSuccess) optSuccess();\n });\n return entry;\n },\n fileDelete: function(filepath, entryOnly) {\n var path = this.splitFilePath(filepath); if (!path.basename) return false;\n var directory = this.dirList(path.dirname); if (!directory) return false;\n var entry = directory[path.basename]; if (!entry || entry[3]) return false; // not found or is a directory\n // delete entry from directory\n delete directory[path.basename];\n localStorage[\"squeak:\" + path.dirname] = JSON.stringify(directory);\n if (entryOnly) return true;\n // delete file contents (async)\n this.dbTransaction(\"readwrite\", \"delete \" + filepath, function(fileStore) {\n fileStore.delete(path.fullname);\n });\n return true;\n },\n fileRename: function(from, to) {\n var oldpath = this.splitFilePath(from); if (!oldpath.basename) return false;\n var newpath = this.splitFilePath(to); if (!newpath.basename) return false;\n var olddir = this.dirList(oldpath.dirname); if (!olddir) return false;\n var entry = olddir[oldpath.basename]; if (!entry || entry[3]) return false; // not found or is a directory\n var samedir = oldpath.dirname == newpath.dirname;\n var newdir = samedir ? olddir : this.dirList(newpath.dirname); if (!newdir) return false;\n if (newdir[newpath.basename]) return false; // exists already\n delete olddir[oldpath.basename]; // delete old entry\n entry[0] = newpath.basename; // rename entry\n newdir[newpath.basename] = entry; // add new entry\n localStorage[\"squeak:\" + newpath.dirname] = JSON.stringify(newdir);\n if (!samedir) localStorage[\"squeak:\" + oldpath.dirname] = JSON.stringify(olddir);\n // move file contents (async)\n this.fileGet(oldpath.fullname,\n function success(contents) {\n this.dbTransaction(\"readwrite\", \"rename \" + oldpath.fullname + \" to \" + newpath.fullname, function(fileStore) {\n fileStore.delete(oldpath.fullname);\n fileStore.put(contents, newpath.fullname);\n });\n }.bind(this),\n function error(msg) {\n console.log(\"File rename failed: \" + msg);\n }.bind(this));\n return true;\n },\n fileExists: function(filepath) {\n var path = this.splitFilePath(filepath); if (!path.basename) return false;\n var directory = this.dirList(path.dirname); if (!directory) return false;\n var entry = directory[path.basename]; if (!entry || entry[3]) return false; // not found or is a directory\n return true;\n },\n dirCreate: function(dirpath, withParents) {\n var path = this.splitFilePath(dirpath); if (!path.basename) return false;\n if (withParents && !localStorage[\"squeak:\" + path.dirname]) Squeak.dirCreate(path.dirname, true);\n var directory = this.dirList(path.dirname); if (!directory) return false;\n if (directory[path.basename]) return false;\n var now = this.totalSeconds(),\n entry = [/*name*/ path.basename, /*ctime*/ now, /*mtime*/ now, /*dir*/ true, /*size*/ 0];\n directory[path.basename] = entry;\n localStorage[\"squeak:\" + path.fullname] = JSON.stringify({});\n localStorage[\"squeak:\" + path.dirname] = JSON.stringify(directory);\n return true;\n },\n dirDelete: function(dirpath) {\n var path = this.splitFilePath(dirpath); if (!path.basename) return false;\n var directory = this.dirList(path.dirname); if (!directory) return false;\n if (!directory[path.basename]) return false;\n var children = this.dirList(path.fullname);\n if (!children) return false;\n for (var child in children) return false; // not empty\n // delete from parent\n delete directory[path.basename];\n localStorage[\"squeak:\" + path.dirname] = JSON.stringify(directory);\n // delete itself\n delete localStorage[\"squeak:\" + path.fullname];\n return true;\n },\n dirList: function(dirpath, includeTemplates) {\n // return directory entries or null\n var path = this.splitFilePath(dirpath),\n localEntries = localStorage[\"squeak:\" + path.fullname],\n template = includeTemplates && localStorage[\"squeak-template:\" + path.fullname];\n function addEntries(dir, entries) {\n for (var key in entries) {\n if (entries.hasOwnProperty(key)) {\n var entry = entries[key];\n dir[entry[0]] = entry;\n }\n }\n }\n if (localEntries || template) {\n // local entries override templates\n var dir = {};\n if (template) addEntries(dir, JSON.parse(template).entries);\n if (localEntries) addEntries(dir, JSON.parse(localEntries));\n return dir;\n }\n if (path.fullname == \"/\") return {};\n return null;\n },\n splitFilePath: function(filepath) {\n if (filepath[0] !== '/') filepath = '/' + filepath;\n filepath = filepath.replace(/\\/\\//ig, '/'); // replace double-slashes\n var matches = filepath.match(/(.*)\\/(.*)/),\n dirname = matches[1].length ? matches[1] : '/',\n basename = matches[2].length ? matches[2] : null;\n return {fullname: filepath, dirname: dirname, basename: basename};\n },\n flushFile: function(file) {\n if (file.modified) {\n var buffer = file.contents.buffer;\n if (buffer.byteLength !== file.size) {\n buffer = new ArrayBuffer(file.size);\n (new Uint8Array(buffer)).set(file.contents.subarray(0, file.size));\n }\n Squeak.filePut(file.name, buffer);\n // if (/SqueakDebug.log/.test(file.name)) {\n // var chars = Squeak.bytesAsString(new Uint8Array(buffer));\n // console.warn(chars.replace(/\\r/g, '\\n'));\n // }\n file.modified = false;\n }\n },\n flushAllFiles: function() {\n if (typeof SqueakFiles == 'undefined') return;\n for (var name in SqueakFiles)\n this.flushFile(SqueakFiles[name]);\n },\n closeAllFiles: function() {\n // close the files held open in memory\n Squeak.flushAllFiles();\n delete window.SqueakFiles;\n },\n fetchTemplateDir: function(path, url) {\n // Called on app startup. Fetch url/sqindex.json and\n // cache all subdirectory entries in localStorage.\n // File contents is only fetched on demand\n path = Squeak.splitFilePath(path).fullname;\n function ensureTemplateParent(template) {\n var path = Squeak.splitFilePath(template);\n if (path.dirname !== \"/\") ensureTemplateParent(path.dirname);\n var template = JSON.parse(localStorage[\"squeak-template:\" + path.dirname] || '{\"entries\": {}}');\n if (!template.entries[path.basename]) {\n var now = Squeak.totalSeconds();\n template.entries[path.basename] = [path.basename, now, now, true, 0];\n localStorage[\"squeak-template:\" + path.dirname] = JSON.stringify(template);\n }\n }\n function checkSubTemplates(path, url) {\n var template = JSON.parse(localStorage[\"squeak-template:\" + path]);\n for (var key in template.entries) {\n var entry = template.entries[key];\n if (entry[3]) Squeak.fetchTemplateDir(path + \"/\" + entry[0], url + \"/\" + entry[0]);\n };\n }\n if (localStorage[\"squeak-template:\" + path]) {\n checkSubTemplates(path, url);\n } else {\n var index = url + \"/sqindex.json\";\n var rq = new XMLHttpRequest();\n rq.open('GET', index, true);\n rq.onload = function(e) {\n if (rq.status == 200) {\n console.log(\"adding template \" + path);\n ensureTemplateParent(path);\n var entries = JSON.parse(rq.response),\n template = {url: url, entries: {}};\n for (var key in entries) {\n var entry = entries[key];\n template.entries[entry[0]] = entry;\n }\n localStorage[\"squeak-template:\" + path] = JSON.stringify(template);\n checkSubTemplates(path, url);\n }\n else rq.onerror(rq.statusText);\n };\n rq.onerror = function(e) {\n console.log(\"cannot load template index \" + index);\n }\n rq.send();\n }\n },\n fetchTemplateFile: function(path, ifFound, ifNotFound) {\n path = Squeak.splitFilePath(path);\n var template = localStorage[\"squeak-template:\" + path.dirname];\n if (!template) return ifNotFound();\n var url = JSON.parse(template).url;\n if (!url) return ifNotFound();\n url += \"/\" + path.basename;\n var rq = new XMLHttpRequest();\n rq.open(\"get\", url, true);\n rq.responseType = \"arraybuffer\";\n rq.timeout = 30000;\n rq.onreadystatechange = function() {\n if (this.readyState != this.DONE) return;\n if (this.status == 200) {\n var buffer = this.response;\n console.log(\"Got \" + buffer.byteLength + \" bytes from \" + url);\n Squeak.dirCreate(path.dirname, true);\n Squeak.filePut(path.fullname, buffer);\n ifFound(buffer);\n } else {\n alert(\"Download failed (\" + this.status + \") \" + url);\n ifNotFound();\n }\n }\n console.log(\"Fetching \" + url);\n rq.send();\n },\n},\n\"audio\", {\n startAudioOut: function() {\n if (!this.audioOutContext) {\n var ctxProto = window.AudioContext || window.webkitAudioContext\n || window.mozAudioContext || window.msAudioContext;\n this.audioOutContext = ctxProto && new ctxProto();\n }\n return this.audioOutContext;\n },\n startAudioIn: function(thenDo, errorDo) {\n if (this.audioInContext) {\n this.audioInSource.disconnect();\n return thenDo(this.audioInContext, this.audioInSource);\n }\n navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia\n || navigator.mozGetUserMedia || navigator.msGetUserMedia;\n if (!navigator.getUserMedia) return errorDo(\"test: audio input not supported\");\n navigator.getUserMedia({audio: true, toString: function() {return \"audio\"}},\n function onSuccess(stream) {\n var ctxProto = window.AudioContext || window.webkitAudioContext\n || window.mozAudioContext || window.msAudioContext;\n this.audioInContext = ctxProto && new ctxProto();\n this.audioInSource = this.audioInContext.createMediaStreamSource(stream);\n thenDo(this.audioInContext, this.audioInSource);\n },\n function onError() {\n errorDo(\"cannot access microphone\");\n });\n },\n stopAudio: function() {\n if (this.audioInSource)\n this.audioInSource.disconnect();\n },\n},\n\"time\", {\n Epoch: Date.UTC(1901,0,1) + (new Date()).getTimezoneOffset()*60000, // local timezone\n EpochUTC: Date.UTC(1901,0,1),\n totalSeconds: function() {\n // seconds since 1901-01-01, local time\n return Math.floor((Date.now() - Squeak.Epoch) / 1000);\n },\n},\n\"utils\", {\n bytesAsString: function(bytes) {\n var chars = [];\n for (var i = 0; i < bytes.length; i++)\n chars.push(String.fromCharCode(bytes[i]));\n return chars.join('');\n },\n});\n\n\nObject.subclass('Squeak.Image',\n'about', {\n about: function() {\n /*\n Object Format\n =============\n Each Squeak object is a Squeak.Object instance, only SmallIntegers are JS numbers.\n Instance variables/fields reference other objects directly via the \"pointers\" property.\n {\n sqClass: reference to class object\n format: format integer as in Squeak oop header\n hash: identity hash integer\n pointers: (optional) Array referencing inst vars + indexable fields\n words: (optional) Array of numbers (words)\n bytes: (optional) Array of numbers (bytes)\n float: (optional) float value if this is a Float object\n isNil: (optional) true if this is the nil object\n isTrue: (optional) true if this is the true object\n isFalse: (optional) true if this is the false object\n isFloat: (optional) true if this is a Float object\n isFloatClass: (optional) true if this is the Float class\n isCompact: (optional) true if this is a compact class\n oop: identifies this object in a snapshot (assigned on GC, new space object oops are negative)\n mark: boolean (used only during GC, otherwise false)\n nextObject: linked list of objects in old space (new space objects do not have this yet)\n }\n\n Object Table\n ============\n There is no actual object table. Instead, objects in old space are a linked list.\n New objects are only referenced by other objects' pointers, and thus can be garbage-collected\n at any time by the Javascript GC.\n\n Weak references are only finalized during a full GC.\n\n */\n }\n},\n'initializing', {\n initialize: function(name) {\n this.totalMemory = 100000000;\n this.name = name;\n this.gcCount = 0;\n this.gcTenured = 0;\n this.gcMilliseconds = 0;\n this.allocationCount = 0;\n this.oldSpaceCount = 0;\n this.newSpaceCount = 0;\n this.hasNewInstances = {};\n },\n readFromBuffer: function(arraybuffer, thenDo, progressDo) {\n console.log('squeak: reading ' + this.name + ' (' + arraybuffer.byteLength + ' bytes)');\n this.startupTime = Date.now();\n var data = new DataView(arraybuffer),\n littleEndian = false,\n pos = 0;\n var readWord = function() {\n var int = data.getUint32(pos, littleEndian);\n pos += 4;\n return int;\n };\n var readBits = function(nWords, format) {\n if (format < 5) { // pointers (do endian conversion)\n var oops = [];\n while (oops.length < nWords)\n oops.push(readWord());\n return oops;\n } else { // words (no endian conversion yet)\n var bits = new Uint32Array(arraybuffer, pos, nWords);\n pos += nWords*4;\n return bits;\n }\n };\n // read version and determine endianness\n var versions = [6501, 6502, 6504, 6505, 68000, 68002, 68003],\n version = 0,\n fileHeaderSize = 0;\n while (true) { // try all four endianness + header combos\n littleEndian = !littleEndian;\n pos = fileHeaderSize;\n version = readWord();\n if (versions.indexOf(version) >= 0) break;\n if (!littleEndian) fileHeaderSize += 512;\n if (fileHeaderSize > 512) throw Error(\"bad image version\");\n };\n this.version = version;\n var nativeFloats = [6505, 68003].indexOf(version) >= 0;\n this.hasClosures = [6504, 6505, 68002, 68003].indexOf(version) >= 0;\n if (version >= 68000) throw Error(\"64 bit images not supported yet\");\n // parse image header\n var imageHeaderSize = readWord();\n var objectMemorySize = readWord(); //first unused location in heap\n var oldBaseAddr = readWord(); //object memory base address of image\n var specialObjectsOopInt = readWord(); //oop of array of special oops\n this.lastHash = readWord(); //Should be loaded from, and saved to the image header\n var savedWindowSize = readWord();\n var fullScreenFlag = readWord();\n var extraVMMemory = readWord();\n pos += imageHeaderSize - (9 * 4); //skip to end of header\n // read objects\n var prevObj;\n var oopMap = {};\n var headerSize = fileHeaderSize + imageHeaderSize;\n while (pos < headerSize + objectMemorySize) {\n var nWords = 0;\n var classInt = 0;\n var header = readWord();\n switch (header & Squeak.HeaderTypeMask) {\n case Squeak.HeaderTypeSizeAndClass:\n nWords = header >> 2;\n classInt = readWord();\n header = readWord();\n break;\n case Squeak.HeaderTypeClass:\n classInt = header - Squeak.HeaderTypeClass;\n header = readWord();\n nWords = (header >> 2) & 63;\n break;\n case Squeak.HeaderTypeShort:\n nWords = (header >> 2) & 63;\n classInt = (header >> 12) & 31; //compact class index\n //Note classInt<32 implies compact class index\n break;\n case Squeak.HeaderTypeFree:\n throw Error(\"Unexpected free block\");\n }\n nWords--; //length includes base header which we have already read\n var oop = pos - 4 - headerSize, //0-rel byte oop of this object (base header)\n format = (header>>8) & 15,\n hash = (header>>17) & 4095,\n bits = readBits(nWords, format);\n\n var object = new Squeak.Object();\n object.initFromImage(oop, classInt, format, hash, bits);\n if (classInt < 32) object.hash |= 0x10000000; // see fixCompactOops()\n if (prevObj) prevObj.nextObject = object;\n this.oldSpaceCount++;\n prevObj = object;\n //oopMap is from old oops to actual objects\n oopMap[oldBaseAddr + oop] = object;\n }\n this.firstOldObject = oopMap[oldBaseAddr+4];\n this.lastOldObject = object;\n this.oldSpaceBytes = objectMemorySize;\n \n if (true) {\n // For debugging: re-create all objects with properly named prototypes\n var cc = oopMap[oopMap[specialObjectsOopInt].bits[Squeak.splOb_CompactClasses]].bits;\n var renamedObj = null;\n object = this.firstOldObject;\n prevObj = null;\n while (object) {\n prevObj = renamedObj;\n renamedObj = object.renameFromImage(oopMap, cc);\n if (prevObj) prevObj.nextObject = renamedObj;\n oopMap[oldBaseAddr + object.oop] = renamedObj;\n object = object.nextObject;\n }\n this.firstOldObject = oopMap[oldBaseAddr+4];\n this.lastOldObject = renamedObj;\n }\n \n //create proper objects by mapping via oopMap\n var splObs = oopMap[specialObjectsOopInt];\n var compactClasses = oopMap[splObs.bits[Squeak.splOb_CompactClasses]].bits;\n var floatClass = oopMap[splObs.bits[Squeak.splOb_ClassFloat]];\n var obj = this.firstOldObject,\n done = 0,\n self = this;\n function mapSomeObjects() {\n if (obj) {\n var stop = done + (self.oldSpaceCount / 10 | 0); // do it in 10 chunks\n while (obj && done < stop) {\n obj.installFromImage(oopMap, compactClasses, floatClass, littleEndian, nativeFloats);\n obj = obj.nextObject;\n done++;\n }\n if (progressDo) progressDo(done / self.oldSpaceCount);\n return true; // do more\n } else { // done\n self.specialObjectsArray = splObs;\n self.decorateKnownObjects();\n self.fixCompiledMethods();\n self.fixCompactOops();\n return false; // don't do more\n }\n };\n function mapSomeObjectsAsync() {\n if (mapSomeObjects()) {\n window.setTimeout(mapSomeObjectsAsync, 0);\n } else {\n if (thenDo) thenDo();\n }\n };\n if (!progressDo) {\n while (mapSomeObjects()); // do it synchronously\n if (thenDo) thenDo();\n } else {\n window.setTimeout(mapSomeObjectsAsync, 0);\n }\n },\n decorateKnownObjects: function() {\n var splObjs = this.specialObjectsArray.pointers;\n splObjs[Squeak.splOb_NilObject].isNil = true;\n splObjs[Squeak.splOb_TrueObject].isTrue = true;\n splObjs[Squeak.splOb_FalseObject].isFalse = true;\n splObjs[Squeak.splOb_ClassFloat].isFloatClass = true;\n this.compactClasses = this.specialObjectsArray.pointers[Squeak.splOb_CompactClasses].pointers;\n for (var i = 0; i < this.compactClasses.length; i++)\n if (!this.compactClasses[i].isNil)\n this.compactClasses[i].isCompact = true;\n if (!Number.prototype.sqInstName)\n Object.defineProperty(Number.prototype, 'sqInstName', {\n enumerable: false,\n value: function() { return this.toString() }\n });\n },\n fixCompactOops: function() {\n // instances of compact classes might have been saved with a non-compact header\n // fix their oops here so validation succeeds later\n var obj = this.firstOldObject,\n adjust = 0;\n while (obj) {\n var hadCompactHeader = obj.hash > 0x0FFFFFFF,\n mightBeCompact = !!obj.sqClass.isCompact;\n if (hadCompactHeader !== mightBeCompact) {\n var isCompact = obj.snapshotSize().header === 0;\n if (hadCompactHeader !== isCompact) {\n adjust += isCompact ? -4 : 4;\n }\n }\n obj.hash &= 0x0FFFFFFF;\n obj.oop += adjust;\n obj = obj.nextObject;\n }\n this.oldSpaceBytes += adjust;\n },\n fixCompiledMethods: function() {\n // in the 6501 pre-release image, some CompiledMethods\n // do not have the proper class\n if (this.version >= 6502) return;\n var obj = this.firstOldObject,\n compiledMethodClass = this.specialObjectsArray.pointers[Squeak.splOb_ClassCompiledMethod];\n while (obj) {\n if (obj.format >= 12) obj.sqClass = compiledMethodClass;\n obj = obj.nextObject;\n }\n },\n},\n'garbage collection', {\n partialGC: function() {\n // no partial GC needed since new space uses the Javascript GC\n return this.totalMemory - this.oldSpaceBytes;\n },\n fullGC: function(reason) {\n // Collect garbage and return first tenured object (to support object enumeration)\n // Old space is a linked list of objects - each object has an \"nextObject\" reference.\n // New space objects do not have that pointer, they are garbage-collected by JavaScript.\n // But they have an allocation id so the survivors can be ordered on tenure.\n // The \"nextObject\" references are created by collecting all new objects,\n // sorting them by id, and then linking them into old space.\n\n this.vm.addMessage(\"fullGC: \" + reason);\n var start = Date.now();\n var newObjects = this.markReachableObjects();\n this.removeUnmarkedOldObjects();\n this.appendToOldObjects(newObjects);\n this.finalizeWeakReferences();\n this.allocationCount += this.newSpaceCount;\n this.newSpaceCount = 0;\n this.hasNewInstances = {};\n this.gcCount++;\n this.gcMilliseconds += Date.now() - start;\n return newObjects.length > 0 ? newObjects[0] : null;\n },\n markReachableObjects: function() {\n // Visit all reachable objects and mark them.\n // Return surviving new objects\n // Contexts are handled specially: they have garbage beyond the stack pointer\n // which must not be traced, and is cleared out here\n // In weak objects, only the inst vars are traced\n this.vm.storeContextRegisters(); // update active context\n var todo = [this.specialObjectsArray, this.vm.activeContext];\n var newObjects = [];\n while (todo.length > 0) {\n var object = todo.pop();\n if (object.mark) continue; // objects are added to todo more than once\n if (!object.nextObject && object !== this.lastOldObject) // it's a new object\n newObjects.push(object);\n object.mark = true; // mark it\n if (!object.sqClass.mark) // trace class if not marked\n todo.push(object.sqClass);\n var body = object.pointers;\n if (body) { // trace all unmarked pointers\n var n = body.length;\n if (this.vm.isContext(object)) { // contexts have garbage beyond SP\n n = object.contextSizeWithStack();\n for (var i = n; i < body.length; i++) // clean up that garbage\n body[i] = this.vm.nilObj;\n } else if (object.sqClass.isWeak()) { // do not trace the indexed part in weak arrays\n n = object.sqClass.classInstSize();\n }\n for (var i = 0; i < n; i++)\n if (typeof body[i] === \"object\" && !body[i].mark) // except SmallInts\n todo.push(body[i]);\n }\n }\n // sort by oop to preserve creation order\n return newObjects.sort(function(a,b){return b.oop - a.oop});\n },\n removeUnmarkedOldObjects: function() {\n // Unlink unmarked old objects from the nextObject linked list\n // Reset marks of remaining objects, and adjust their oops\n // Set this.lastOldObject to last old object\n var removedCount = 0,\n removedBytes = 0,\n obj = this.firstOldObject;\n obj.mark = false; // we know the first object (nil) was marked\n while (true) {\n var next = obj.nextObject;\n if (!next) {// we're done\n this.lastOldObject = obj;\n this.oldSpaceBytes -= removedBytes;\n this.oldSpaceCount -= removedCount;\n return;\n }\n // if marked, continue with next object\n if (next.mark) {\n obj = next;\n obj.mark = false; // unmark for next GC\n obj.oop -= removedBytes; // compact oops\n } else { // otherwise, remove it\n var corpse = next;\n obj.nextObject = corpse.nextObject; // drop from old-space list\n corpse.oop = -(++this.newSpaceCount); // move to new-space for finalizing \n removedBytes += corpse.totalBytes();\n removedCount++;\n //console.log(\"removing \" + removedCount + \" \" + removedBytes + \" \" + corpse.totalBytes() + \" \" + corpse.toString())\n }\n }\n },\n appendToOldObjects: function(newObjects) {\n // append new objects to linked list of old objects\n // and unmark them\n var oldObj = this.lastOldObject;\n //var oldBytes = this.oldSpaceBytes;\n for (var i = 0; i < newObjects.length; i++) {\n var newObj = newObjects[i];\n newObj.mark = false;\n this.oldSpaceBytes = newObj.setAddr(this.oldSpaceBytes); // add at end of memory\n oldObj.nextObject = newObj;\n oldObj = newObj;\n //console.log(\"tenuring \" + (i+1) + \" \" + (this.oldSpaceBytes - oldBytes) + \" \" + newObj.totalBytes() + \" \" + newObj.toString());\n }\n this.lastOldObject = oldObj;\n this.oldSpaceCount += newObjects.length;\n this.gcTenured += newObjects.length;\n },\n finalizeWeakReferences: function() {\n // nil out all weak fields that did not survive GC\n var weakObj = this.firstOldObject;\n while (weakObj) {\n if (weakObj.sqClass.isWeak()) {\n var pointers = weakObj.pointers || [],\n firstWeak = weakObj.sqClass.classInstSize(),\n finalized = false;\n for (var i = firstWeak; i < pointers.length; i++) {\n if (pointers[i].oop < 0) { // ref is not in old-space\n pointers[i] = this.vm.nilObj;\n finalized = true;\n }\n }\n if (finalized) {\n this.vm.pendingFinalizationSignals++;\n if (firstWeak >= 2) { // check if weak obj is a finalizer item\n var list = weakObj.pointers[Squeak.WeakFinalizerItem_list];\n if (list.sqClass == this.vm.specialObjects[Squeak.splOb_ClassWeakFinalizer]) {\n // add weak obj as first in the finalization list\n var items = list.pointers[Squeak.WeakFinalizationList_first];\n weakObj.pointers[Squeak.WeakFinalizerItem_next] = items;\n list.pointers[Squeak.WeakFinalizationList_first] = weakObj;\n }\n }\n }\n }\n weakObj = weakObj.nextObject;\n };\n if (this.vm.pendingFinalizationSignals > 0) {\n this.vm.forceInterruptCheck(); // run finalizer asap\n }\n },\n},\n'creating', {\n registerObject: function(obj) {\n // We don't actually register the object yet, because that would prevent\n // it from being garbage-collected by the Javascript collector\n obj.oop = -(++this.newSpaceCount); // temp oops are negative. Real oop assigned when surviving GC\n // Note this is also done in loadImageSegment()\n this.lastHash = (13849 + (27181 * this.lastHash)) & 0xFFFFFFFF;\n return this.lastHash & 0xFFF;\n },\n instantiateClass: function(aClass, indexableSize, filler) {\n var newObject = new (aClass.classInstProto()); // Squeak.Object\n var hash = this.registerObject(newObject);\n newObject.initInstanceOf(aClass, indexableSize, hash, filler);\n this.hasNewInstances[aClass.oop] = true; // need GC to find all instances\n return newObject;\n },\n clone: function(object) {\n var newObject = new (object.sqClass.classInstProto()); // Squeak.Object\n var hash = this.registerObject(newObject);\n newObject.initAsClone(object, hash);\n this.hasNewInstances[newObject.sqClass.oop] = true; // need GC to find all instances\n return newObject;\n },\n},\n'operations', {\n bulkBecome: function(fromArray, toArray, twoWay, copyHash) {\n if (!fromArray)\n return !toArray;\n var n = fromArray.length;\n if (n !== toArray.length)\n return false;\n // need to visit all objects, so ensure new objects have\n // nextObject pointers and permanent oops\n if (this.newSpaceCount > 0)\n this.fullGC(\"become\"); // does update context\n else\n this.vm.storeContextRegisters(); // still need to update active context\n // obj.oop used as dict key here is why we store them\n // rather than just calculating at image snapshot time\n var mutations = {};\n for (var i = 0; i < n; i++) {\n var obj = fromArray[i];\n if (!obj.sqClass) return false; //non-objects in from array\n if (mutations[obj.oop]) return false; //repeated oops in from array\n else mutations[obj.oop] = toArray[i];\n }\n if (twoWay) for (var i = 0; i < n; i++) {\n var obj = toArray[i];\n if (!obj.sqClass) return false; //non-objects in to array\n if (mutations[obj.oop]) return false; //repeated oops in to array\n else mutations[obj.oop] = fromArray[i];\n }\n // unless copyHash is false, make hash stay with the reference, not with the object\n if (copyHash) for (var i = 0; i < n; i++) {\n if (!toArray[i].sqClass) return false; //cannot change hash of non-objects\n var fromHash = fromArray[i].hash;\n fromArray[i].hash = toArray[i].hash;\n toArray[i].hash = fromHash;\n }\n // Now, for every object...\n var obj = this.firstOldObject;\n while (obj) {\n // mutate the class\n var mut = mutations[obj.sqClass.oop];\n if (mut) obj.sqClass = mut;\n // and mutate body pointers\n var body = obj.pointers;\n if (body) for (var j = 0; j < body.length; j++) {\n mut = mutations[body[j].oop];\n if (mut) body[j] = mut;\n }\n obj = obj.nextObject;\n }\n this.vm.flushMethodCacheAfterBecome(mutations);\n return true;\n },\n objectAfter: function(obj) {\n // if this was the last old object, tenure new objects and try again\n return obj.nextObject || (this.newSpaceCount > 0 && this.fullGC(\"nextObject\"));\n },\n someInstanceOf: function(clsObj) {\n var obj = this.firstOldObject;\n while (true) {\n if (obj.sqClass === clsObj)\n return obj;\n obj = obj.nextObject || this.nextObjectWithGCFor(clsObj);\n if (!obj) return null;\n }\n },\n nextInstanceAfter: function(obj) {\n var clsObj = obj.sqClass;\n while (true) {\n obj = obj.nextObject || this.nextObjectWithGCFor(clsObj);\n if (!obj) return null;\n if (obj.sqClass === clsObj)\n return obj;\n }\n },\n nextObjectWithGCFor: function(clsObj) {\n if (this.newSpaceCount === 0 || !this.hasNewInstances[clsObj.oop]) return null;\n return this.fullGC(\"instance of \" + clsObj.className());\n },\n writeToBuffer: function() {\n var headerSize = 64,\n data = new DataView(new ArrayBuffer(headerSize + this.oldSpaceBytes)),\n pos = 0;\n var writeWord = function(word) {\n data.setUint32(pos, word);\n pos += 4;\n };\n writeWord(this.formatVersion()); // magic number\n writeWord(headerSize);\n writeWord(this.oldSpaceBytes); // end of memory\n writeWord(this.firstOldObject.addr()); // base addr (0)\n writeWord(this.objectToOop(this.specialObjectsArray));\n writeWord(this.lastHash);\n writeWord((800 << 16) + 600); // window size\n while (pos < headerSize)\n writeWord(0);\n // objects\n var obj = this.firstOldObject,\n n = 0;\n while (obj) {\n pos = obj.writeTo(data, pos, this);\n obj = obj.nextObject;\n n++;\n }\n if (pos !== data.byteLength) throw Error(\"wrong image size\");\n if (n !== this.oldSpaceCount) throw Error(\"wrong object count\");\n return data.buffer;\n },\n objectToOop: function(obj) {\n // unsigned word for use in snapshot\n if (typeof obj === \"number\")\n return obj << 1 | 1; // add tag bit\n if (obj.oop < 0) throw Error(\"temporary oop\");\n return obj.oop;\n },\n bytesLeft: function() {\n return this.totalMemory - this.oldSpaceBytes;\n },\n formatVersion: function() {\n return this.hasClosures ? 6504 : 6502;\n },\n segmentVersion: function() {\n var dnu = this.specialObjectsArray.pointers[Squeak.splOb_SelectorDoesNotUnderstand],\n wholeWord = new Uint32Array(dnu.bytes.buffer, 0, 1);\n return this.formatVersion() | (wholeWord[0] & 0xFF000000);\n },\n loadImageSegment: function(segmentWordArray, outPointerArray) {\n // The C VM creates real objects from the segment in-place. We need to create\n // real objects, which we just put in new space.\n // The code below is almost the same as readFromBuffer() ... should unify\n var data = new DataView(segmentWordArray.words.buffer),\n littleEndian = false,\n nativeFloats = false,\n pos = 0;\n var readWord = function() {\n var int = data.getUint32(pos, littleEndian);\n pos += 4;\n return int;\n };\n var readBits = function(nWords, format) {\n if (format < 5) { // pointers (do endian conversion)\n var oops = [];\n while (oops.length < nWords)\n oops.push(readWord());\n return oops;\n } else { // words (no endian conversion yet)\n var bits = new Uint32Array(data.buffer, pos, nWords);\n pos += nWords * 4;\n return bits;\n }\n };\n // check version\n var version = readWord();\n if (version & 0xFFFF !== 6502) {\n littleEndian = true; pos = 0;\n version = readWord();\n if (version & 0xFFFF !== 6502) {\n console.error(\"image segment format not supported\");\n return null;\n }\n }\n // read objects\n var segment = [],\n oopMap = {};\n while (pos < data.byteLength) {\n var nWords = 0,\n classInt = 0,\n header = readWord();\n switch (header & Squeak.HeaderTypeMask) {\n case Squeak.HeaderTypeSizeAndClass:\n nWords = header >> 2;\n classInt = readWord();\n header = readWord();\n break;\n case Squeak.HeaderTypeClass:\n classInt = header - Squeak.HeaderTypeClass;\n header = readWord();\n nWords = (header >> 2) & 63;\n break;\n case Squeak.HeaderTypeShort:\n nWords = (header >> 2) & 63;\n classInt = (header >> 12) & 31; //compact class index\n //Note classInt<32 implies compact class index\n break;\n case Squeak.HeaderTypeFree:\n throw Error(\"Unexpected free block\");\n }\n nWords--; //length includes base header which we have already read\n var oop = pos, //0-rel byte oop of this object (base header)\n format = (header>>8) & 15,\n hash = (header>>17) & 4095,\n bits = readBits(nWords, format);\n\n var object = new Squeak.Object();\n object.initFromImage(oop, classInt, format, hash, bits);\n segment.push(object);\n oopMap[oop] = object;\n }\n // add outPointers to oopMap\n for (var i = 0; i < outPointerArray.pointers.length; i++)\n oopMap[0x80000004 + i * 4] = outPointerArray.pointers[i];\n // add compactClasses to oopMap\n var compactClasses = this.specialObjectsArray.pointers[Squeak.splOb_CompactClasses].pointers,\n fakeClsOop = 0, // make up a compact-classes array with oops, as if loading an image\n compactClassOops = compactClasses.map(function(cls) {\n oopMap[--fakeClsOop] = cls; return fakeClsOop; });\n // map objects using oopMap, and assign new oops\n var roots = oopMap[8] || oopMap[12] || oopMap[16], // might be 1/2/3 header words\n floatClass = this.specialObjectsArray.pointers[Squeak.splOb_ClassFloat];\n for (var i = 0; i < segment.length; i++) {\n var obj = segment[i];\n obj.installFromImage(oopMap, compactClassOops, floatClass, littleEndian, nativeFloats);\n obj.oop = -(++this.newSpaceCount); // make this a proper new-space object (see registerObject)\n this.hasNewInstances[obj.sqClass.oop] = true; // need GC to find all instances\n }\n // don't truncate segmentWordArray now like the C VM does. It does not seem to be\n // worth the trouble of adjusting the following oops\n return roots;\n },\n});\n\nObject.subclass('Squeak.Object',\n'initialization', {\n initInstanceOf: function(aClass, indexableSize, hash, nilObj) {\n this.sqClass = aClass;\n this.hash = hash;\n var instSpec = aClass.pointers[Squeak.Class_format],\n instSize = ((instSpec>>1) & 0x3F) + ((instSpec>>10) & 0xC0) - 1; //0-255\n this.format = (instSpec>>7) & 0xF; //This is the 0-15 code\n\n if (this.format < 8) {\n if (this.format != 6) {\n if (instSize + indexableSize > 0)\n this.pointers = this.fillArray(instSize + indexableSize, nilObj);\n } else // Words\n if (indexableSize > 0)\n if (aClass.isFloatClass) {\n this.isFloat = true;\n this.float = 0.0;\n } else\n this.words = new Uint32Array(indexableSize);\n } else // Bytes\n if (indexableSize > 0) {\n // this.format |= -indexableSize & 3; //deferred to writeTo()\n this.bytes = new Uint8Array(indexableSize); //Methods require further init of pointers\n }\n\n// Definition of Squeak's format code...\n//\n// Pointers only...\n// 0 no fields\n// 1 fixed fields only (all containing pointers)\n// 2 indexable fields only (all containing pointers)\n// 3 both fixed and indexable fields (all containing pointers)\n// 4 both fixed and indexable weak fields (all containing pointers).\n// 5 unused\n// Bits only...\n// 6 indexable word fields only (no pointers)\n// 7 unused\n// 8-11 indexable byte fields only (no pointers) (low 2 bits are low 2 bits of size)\n// Pointer and bits (CompiledMethods only)...\n// 12-15 compiled methods:\n// # of literal oops specified in method header,\n// followed by indexable bytes (same interpretation of low 2 bits as above)\n },\n initAsClone: function(original, hash) {\n this.sqClass = original.sqClass;\n this.hash = hash;\n this.format = original.format;\n if (original.isFloat) {\n this.isFloat = original.isFloat;\n this.float = original.float;\n } else {\n if (original.pointers) this.pointers = original.pointers.slice(0); // copy\n if (original.words) this.words = new Uint32Array(original.words); // copy\n if (original.bytes) this.bytes = new Uint8Array(original.bytes); // copy\n }\n },\n initFromImage: function(oop, cls, fmt, hsh, data) {\n // initial creation from Image, with unmapped data\n this.oop = oop;\n this.sqClass = cls;\n this.format = fmt;\n this.hash = hsh;\n this.bits = data;\n },\n classNameFromImage: function(oopMap) {\n var name = oopMap[this.bits[Squeak.Class_name]];\n if (name && name.format >= 8 && name.format < 12) {\n var bytes = name.decodeBytes(name.bits.length, name.bits, 0, name.format & 3);\n return Squeak.bytesAsString(bytes);\n }\n return \"Class\";\n },\n renameFromImage: function(oopMap, ccArray) {\n var classObj = this.sqClass < 32 ? oopMap[ccArray[this.sqClass-1]] : oopMap[this.sqClass];\n var instProto = classObj.instProto || classObj.classInstProto(classObj.classNameFromImage(oopMap));\n if (!instProto) return this;\n var renamedObj = new instProto; // Squeak.Object\n renamedObj.oop = this.oop;\n renamedObj.sqClass = this.sqClass;\n renamedObj.format = this.format;\n renamedObj.hash = this.hash;\n renamedObj.bits = this.bits;\n return renamedObj;\n },\n installFromImage: function(oopMap, ccArray, floatClass, littleEndian, nativeFloats) {\n //Install this object by decoding format, and rectifying pointers\n var ccInt = this.sqClass;\n // map compact classes\n if ((ccInt>0) && (ccInt<32))\n this.sqClass = oopMap[ccArray[ccInt-1]];\n else\n this.sqClass = oopMap[ccInt];\n var nWords = this.bits.length;\n if (this.format < 5) {\n //Formats 0...4 -- Pointer fields\n if (nWords > 0) {\n var oops = this.bits; // endian conversion was already done\n this.pointers = this.decodePointers(nWords, oops, oopMap);\n }\n } else if (this.format >= 12) {\n //Formats 12-15 -- CompiledMethods both pointers and bits\n var methodHeader = this.decodeWords(1, this.bits, littleEndian)[0],\n numLits = (methodHeader>>10) & 255,\n oops = this.decodeWords(numLits+1, this.bits, littleEndian);\n this.pointers = this.decodePointers(numLits+1, oops, oopMap); //header+lits\n this.bytes = this.decodeBytes(nWords-(numLits+1), this.bits, numLits+1, this.format & 3);\n } else if (this.format >= 8) {\n //Formats 8..11 -- ByteArrays (and ByteStrings)\n if (nWords > 0)\n this.bytes = this.decodeBytes(nWords, this.bits, 0, this.format & 3);\n } else if (this.sqClass == floatClass) {\n //These words are actually a Float\n this.isFloat = true;\n this.float = this.decodeFloat(this.bits, littleEndian, nativeFloats);\n if (this.float == 1.3797216632888e-310) {\n if (/noFloatDecodeWorkaround/.test(window.location.hash)) {\n // floatDecode workaround disabled\n } else {\n this.constructor.prototype.decodeFloat = this.decodeFloatDeoptimized;\n this.float = this.decodeFloat(this.bits, littleEndian, nativeFloats);\n if (this.float == 1.3797216632888e-310)\n throw Error(\"Cannot deoptimize decodeFloat\");\n }\n }\n } else {\n if (nWords > 0)\n this.words = this.decodeWords(nWords, this.bits, littleEndian);\n }\n delete this.bits;\n this.mark = false; // for GC\n },\n decodePointers: function(nWords, theBits, oopMap) {\n //Convert small ints and look up object pointers in oopMap\n var ptrs = new Array(nWords);\n for (var i = 0; i < nWords; i++) {\n var oop = theBits[i];\n if ((oop & 1) === 1) { // SmallInteger\n ptrs[i] = oop >> 1;\n } else { // Object\n ptrs[i] = oopMap[oop] || 42424242;\n // when loading a context from image segment, there is\n // garbage beyond its stack pointer, resulting in the oop\n // not being found in oopMap. We just fill in an arbitrary\n // SmallInteger - it's never accessed anyway\n }\n }\n return ptrs;\n },\n decodeWords: function(nWords, theBits, littleEndian) {\n var data = new DataView(theBits.buffer, theBits.byteOffset),\n words = new Uint32Array(nWords);\n for (var i = 0; i < nWords; i++)\n words[i] = data.getUint32(i*4, littleEndian);\n return words;\n },\n decodeBytes: function (nWords, theBits, wordOffset, fmtLowBits) {\n // Adjust size for low bits and make a copy\n var nBytes = (nWords * 4) - fmtLowBits,\n wordsAsBytes = new Uint8Array(theBits.buffer, theBits.byteOffset + wordOffset * 4, nBytes),\n bytes = new Uint8Array(nBytes);\n bytes.set(wordsAsBytes);\n return bytes;\n },\n decodeFloat: function(theBits, littleEndian, nativeFloats) {\n var data = new DataView(theBits.buffer, theBits.byteOffset);\n // it's either big endian ...\n if (!littleEndian) return data.getFloat64(0, false);\n // or real little endian\n if (nativeFloats) return data.getFloat64(0, true);\n // or little endian, but with swapped words\n var buffer = new ArrayBuffer(8),\n swapped = new DataView(buffer);\n swapped.setUint32(0, data.getUint32(4));\n swapped.setUint32(4, data.getUint32(0));\n return swapped.getFloat64(0, true);\n },\n decodeFloatDeoptimized: function(theBits, littleEndian, nativeFloats) {\n var data = new DataView(theBits.buffer, theBits.byteOffset);\n // it's either big endian ...\n if (!littleEndian) return data.getFloat64(0, false);\n // or real little endian\n if (nativeFloats) return data.getFloat64(0, true);\n // or little endian, but with swapped words\n var buffer = new ArrayBuffer(8),\n swapped = new DataView(buffer);\n // wrap in function to defeat Safari's optimizer, which always\n // answers 1.3797216632888e-310 if called more than 25000 times\n (function() {\n swapped.setUint32(0, data.getUint32(4));\n swapped.setUint32(4, data.getUint32(0));\n })();\n return swapped.getFloat64(0, true);\n },\n fillArray: function(length, filler) {\n for (var array = [], i = 0; i < length; i++)\n array[i] = filler;\n return array;\n },\n},\n'printing', {\n toString: function() {\n return this.sqInstName();\n },\n bytesAsString: function() {\n if (!this.bytes) return '';\n return Squeak.bytesAsString(this.bytes);\n },\n bytesAsNumberString: function(negative) {\n if (!this.bytes) return '';\n var hex = '0123456789ABCDEF',\n digits = [],\n value = 0;\n for (var i = this.bytes.length - 1; i >= 0; i--) {\n digits.push(hex[this.bytes[i] >> 4]);\n digits.push(hex[this.bytes[i] & 15]);\n value = value * 256 + this.bytes[i];\n }\n var sign = negative ? '-' : '',\n approx = value >= 9007199254740992 ? '≈' : '';\n return sign + '16r' + digits.join('') + ' (' + approx + sign + value + 'L)';\n },\n assnKeyAsString: function() {\n return this.pointers[Squeak.Assn_key].bytesAsString();\n },\n slotNameAt: function(index) {\n // one-based index\n var instSize = this.instSize();\n if (index <= instSize)\n return this.sqClass.allInstVarNames()[index - 1];\n else\n return (index - instSize).toString();\n },\n sqInstName: function() {\n if (this.isNil) return \"nil\";\n if (this.isTrue) return \"true\";\n if (this.isFalse) return \"false\";\n if (this.isFloat) {var str = this.float.toString(); if (!/\\./.test(str)) str += '.0'; return str; }\n var className = this.sqClass.className();\n if (/ /.test(className))\n return 'the ' + className;\n switch (className) {\n case 'String':\n case 'ByteString': return \"'\" + this.bytesAsString() + \"'\";\n case 'Symbol':\n case 'ByteSymbol': return \"#\" + this.bytesAsString();\n case 'Point': return this.pointers.join(\"@\");\n case 'Rectangle': return this.pointers.join(\" corner: \");\n case 'Association':\n case 'ReadOnlyVariableBinding': return this.pointers.join(\"->\");\n case 'LargePositiveInteger': return this.bytesAsNumberString(false);\n case 'LargeNegativeInteger': return this.bytesAsNumberString(true);\n case 'Character': return \"$\" + String.fromCharCode(this.pointers[0]) + \" (\" + this.pointers[0].toString() + \")\";\n }\n return /^[aeiou]/i.test(className) ? 'an ' + className : 'a ' + className;\n },\n},\n'accessing', {\n isWords: function() {\n return this.format === 6;\n },\n isBytes: function() {\n var fmt = this.format;\n return fmt >= 8 && fmt <= 11;\n },\n isWordsOrBytes: function() {\n var fmt = this.format;\n return fmt == 6 || (fmt >= 8 && fmt <= 11);\n },\n isPointers: function() {\n return this.format <= 4;\n },\n isMethod: function() {\n return this.format >= 12;\n },\n pointersSize: function() {\n return this.pointers ? this.pointers.length : 0;\n },\n bytesSize: function() {\n return this.bytes ? this.bytes.length : 0;\n },\n wordsSize: function() {\n return this.isFloat ? 2 : this.words ? this.words.length : 0;\n },\n instSize: function() {//same as class.classInstSize, but faster from format\n if (this.format>4 || this.format==2) return 0; //indexable fields only\n if (this.format<2) return this.pointersSize(); //indexable fields only\n return this.sqClass.classInstSize(); //0-255\n },\n floatData: function() {\n var buffer = new ArrayBuffer(8);\n var data = new DataView(buffer);\n data.setFloat64(0, this.float, false);\n //1st word is data.getUint32(0, false);\n //2nd word is data.getUint32(4, false);\n return data;\n },\n wordsAsFloat32Array: function() {\n return this.float32Array\n || (this.words && (this.float32Array = new Float32Array(this.words.buffer)));\n },\n wordsAsFloat64Array: function() {\n return this.float64Array\n || (this.words && (this.float64Array = new Float64Array(this.words.buffer)));\n },\n wordsAsInt32Array: function() {\n return this.int32Array\n || (this.words && (this.int32Array = new Int32Array(this.words.buffer)));\n },\n wordsAsInt16Array: function() {\n return this.int16Array\n || (this.words && (this.int16Array = new Int16Array(this.words.buffer)));\n },\n wordsAsUint16Array: function() {\n return this.uint16Array\n || (this.words && (this.uint16Array = new Uint16Array(this.words.buffer)));\n },\n wordsAsUint8Array: function() {\n return this.uint8Array\n || (this.words && (this.uint8Array = new Uint8Array(this.words.buffer)));\n },\n wordsOrBytes: function() {\n if (this.words) return this.words;\n if (this.uint32Array) return this.uint32Array;\n if (!this.bytes) return null;\n return this.uint32Array = new Uint32Array(this.bytes.buffer, 0, this.bytes.length >> 2);\n },\n setAddr: function(addr) {\n // Move this object to addr by setting its oop. Answer address after this object.\n // Used to assign an oop for the first time when tenuring this object during GC.\n // When compacting, the oop is adjusted directly, since header size does not change.\n var words = this.snapshotSize();\n this.oop = addr + words.header * 4;\n return addr + (words.header + words.body) * 4;\n },\n snapshotSize: function() {\n // words of extra object header and body this object would take up in image snapshot\n // body size includes one header word that is always present\n var nWords =\n this.isFloat ? 2 :\n this.words ? this.words.length :\n this.pointers ? this.pointers.length : 0;\n // methods have both pointers and bytes\n if (this.bytes) nWords += (this.bytes.length + 3) >> 2;\n nWords++; // one header word always present\n var extraHeader = nWords > 63 ? 2 : this.sqClass.isCompact ? 0 : 1;\n return {header: extraHeader, body: nWords};\n },\n addr: function() { // start addr of this object in a snapshot\n return this.oop - this.snapshotSize().header * 4;\n },\n totalBytes: function() {\n // size in bytes this object would take up in image snapshot\n var words = this.snapshotSize();\n return (words.header + words.body) * 4;\n },\n writeTo: function(data, pos, image) {\n // Write 1 to 3 header words encoding type, class, and size, then instance data\n if (this.bytes) this.format |= -this.bytes.length & 3;\n var beforePos = pos,\n size = this.snapshotSize(),\n formatAndHash = ((this.format & 15) << 8) | ((this.hash & 4095) << 17);\n // write header words first\n switch (size.header) {\n case 2:\n data.setUint32(pos, size.body << 2 | Squeak.HeaderTypeSizeAndClass); pos += 4;\n data.setUint32(pos, this.sqClass.oop | Squeak.HeaderTypeSizeAndClass); pos += 4;\n data.setUint32(pos, formatAndHash | Squeak.HeaderTypeSizeAndClass); pos += 4;\n break;\n case 1:\n data.setUint32(pos, this.sqClass.oop | Squeak.HeaderTypeClass); pos += 4;\n data.setUint32(pos, formatAndHash | size.body << 2 | Squeak.HeaderTypeClass); pos += 4;\n break;\n case 0:\n var classIndex = image.compactClasses.indexOf(this.sqClass) + 1;\n data.setUint32(pos, formatAndHash | classIndex << 12 | size.body << 2 | Squeak.HeaderTypeShort); pos += 4;\n }\n // now write body, if any\n if (this.isFloat) {\n data.setFloat64(pos, this.float); pos += 8;\n } else if (this.words) {\n for (var i = 0; i < this.words.length; i++) {\n data.setUint32(pos, this.words[i]); pos += 4;\n }\n } else if (this.pointers) {\n for (var i = 0; i < this.pointers.length; i++) {\n data.setUint32(pos, image.objectToOop(this.pointers[i])); pos += 4;\n }\n }\n // no \"else\" because CompiledMethods have both pointers and bytes\n if (this.bytes) {\n for (var i = 0; i < this.bytes.length; i++)\n data.setUint8(pos++, this.bytes[i]);\n // skip to next word\n pos += -this.bytes.length & 3;\n }\n // done\n if (pos !== beforePos + this.totalBytes()) throw Error(\"written size does not match\");\n return pos;\n },\n},\n'as class', {\n classInstSize: function() {\n // this is a class, answer number of named inst vars\n var format = this.pointers[Squeak.Class_format];\n return ((format >> 10) & 0xC0) + ((format >> 1) & 0x3F) - 1;\n },\n isWeak: function() {\n var format = this.pointers[Squeak.Class_format];\n return ((format >> 7) & 0xF) == 4;\n },\n instVarNames: function() {\n var index = this.pointers.length > 12 ? 4 :\n this.pointers.length > 9 ? 3 : 4; // index changed in newer images\n return (this.pointers[index].pointers || []).map(function(each) {\n return each.bytesAsString();\n });\n },\n allInstVarNames: function() {\n var superclass = this.superclass();\n if (superclass.isNil)\n return this.instVarNames();\n else\n return superclass.allInstVarNames().concat(this.instVarNames());\n },\n superclass: function() {\n return this.pointers[0];\n },\n className: function() {\n if (!this.pointers) return \"_NOTACLASS_\";\n var name = this.pointers[Squeak.Class_name];\n if (name && name.bytes) return name.bytesAsString();\n // must be meta class\n for (var clsIndex = 5; clsIndex <= 6; clsIndex++) {\n var cls = this.pointers[clsIndex];\n if (cls && cls.pointers) {\n name = cls.pointers[Squeak.Class_name];\n if (name && name.bytes) return name.bytesAsString() + \" class\";\n }\n }\n return \"_SOMECLASS_\";\n },\n classInstProto: function(className) {\n if (this.instProto) return this.instProto;\n var proto = Squeak.Object; // in case below fails\n try {\n if (!className) className = this.className();\n var safeName = className.replace(/[^A-Za-z0-9]/g,'_');\n if (safeName === \"UndefinedObject\") safeName = \"nil\";\n else if (safeName === \"True\") safeName = \"true_\";\n else if (safeName === \"False\") safeName = \"false_\";\n else safeName = ((/^[AEIOU]/.test(safeName)) ? 'an' : 'a') + safeName;\n // fail okay if no eval()\n proto = new Function(\"return function \" + safeName + \"() {};\")();\n proto.prototype = Squeak.Object.prototype;\n } catch(e) {}\n Object.defineProperty(this, 'instProto', { value: proto });\n return proto;\n },\n},\n'as method', {\n methodHeader: function() {\n return this.pointers[0];\n },\n methodNumLits: function() {\n return this.pointers.length - 1;\n },\n methodNumArgs: function() {\n return (this.methodHeader()>>24) & 0xF;\n },\n methodPrimitiveIndex: function() {\n var primBits = (this.methodHeader()) & 0x300001FF;\n if (primBits > 0x1FF)\n return (primBits & 0x1FF) + (primBits >> 19);\n else\n return primBits;\n },\n methodClassForSuper: function() {//assn found in last literal\n var assn = this.pointers[this.methodNumLits()];\n return assn.pointers[Squeak.Assn_value];\n },\n methodNeedsLargeFrame: function() {\n return (this.methodHeader() & 0x20000) > 0;\n },\n methodAddPointers: function(headerAndLits) {\n this.pointers = headerAndLits;\n },\n methodTempCount: function() {\n return (this.methodHeader()>>18) & 63;\n },\n methodGetLiteral: function(zeroBasedIndex) {\n return this.pointers[1+zeroBasedIndex]; // step over header\n },\n methodGetSelector: function(zeroBasedIndex) {\n return this.pointers[1+zeroBasedIndex]; // step over header\n },\n methodSetLiteral: function(zeroBasedIndex, value) {\n this.pointers[1+zeroBasedIndex] = value; // step over header\n },\n},\n'as context',\n{\n contextHome: function() {\n return this.contextIsBlock() ? this.pointers[Squeak.BlockContext_home] : this;\n },\n contextIsBlock: function() {\n return typeof this.pointers[Squeak.BlockContext_argumentCount] === 'number';\n },\n contextMethod: function() {\n return this.contextHome().pointers[Squeak.Context_method];\n },\n contextSender: function() {\n return this.pointers[Squeak.Context_sender];\n },\n contextSizeWithStack: function(vm) {\n // Actual context size is inst vars + stack size. Slots beyond that may contain garbage.\n // If passing in a VM, and this is the activeContext, use the VM's current value.\n if (vm && vm.activeContext === this)\n return vm.sp + 1;\n // following is same as decodeSqueakSP() but works without vm ref\n var sp = this.pointers[Squeak.Context_stackPointer];\n return Squeak.Context_tempFrameStart + (typeof sp === \"number\" ? sp : 0);\n },\n});\n\nObject.subclass('Squeak.Interpreter',\n'initialization', {\n initialize: function(image, display) {\n console.log('squeak: initializing interpreter ' + Squeak.vmVersion);\n this.Squeak = Squeak; // store locally to avoid dynamic lookup in Lively\n this.image = image;\n this.image.vm = this;\n this.primHandler = new Squeak.Primitives(this, display);\n this.loadImageState();\n this.hackImage();\n this.initVMState();\n this.loadInitialContext();\n this.initCompiler();\n console.log('squeak: ready');\n },\n loadImageState: function() {\n this.specialObjects = this.image.specialObjectsArray.pointers;\n this.specialSelectors = this.specialObjects[Squeak.splOb_SpecialSelectors].pointers;\n this.nilObj = this.specialObjects[Squeak.splOb_NilObject];\n this.falseObj = this.specialObjects[Squeak.splOb_FalseObject];\n this.trueObj = this.specialObjects[Squeak.splOb_TrueObject];\n this.hasClosures = this.image.hasClosures;\n this.globals = this.findGlobals();\n // hack for old image that does not support Unix files\n if (!this.hasClosures && !this.findMethod(\"UnixFileDirectory class>>pathNameDelimiter\"))\n this.primHandler.emulateMac = true;\n // pre-release image has inverted colors\n if (this.image.version == 6501)\n this.primHandler.reverseDisplay = true;\n },\n initVMState: function() {\n this.byteCodeCount = 0;\n this.sendCount = 0;\n this.interruptCheckCounter = 0;\n this.interruptCheckCounterFeedBackReset = 1000;\n this.interruptChecksEveryNms = 3;\n this.nextPollTick = 0;\n this.nextWakeupTick = 0;\n this.lastTick = 0;\n this.interruptKeycode = 2094; //\"cmd-.\"\n this.interruptPending = false;\n this.pendingFinalizationSignals = 0;\n this.freeContexts = this.nilObj;\n this.freeLargeContexts = this.nilObj;\n this.reclaimableContextCount = 0;\n this.nRecycledContexts = 0;\n this.nAllocatedContexts = 0;\n this.methodCacheSize = 1024;\n this.methodCacheMask = this.methodCacheSize - 1;\n this.methodCacheRandomish = 0;\n this.methodCache = [];\n for (var i = 0; i < this.methodCacheSize; i++)\n this.methodCache[i] = {lkupClass: null, selector: null, method: null, primIndex: 0, argCount: 0, mClass: null};\n this.breakOutOfInterpreter = false;\n this.breakOutTick = 0;\n this.breakOnMethod = null; // method to break on\n this.breakOnNewMethod = false;\n this.breakOnContextChanged = false;\n this.breakOnContextReturned = null; // context to break on\n this.messages = {};\n this.startupTime = Date.now(); // base for millisecond clock\n },\n loadInitialContext: function() {\n var schedAssn = this.specialObjects[Squeak.splOb_SchedulerAssociation];\n var sched = schedAssn.pointers[Squeak.Assn_value];\n var proc = sched.pointers[Squeak.ProcSched_activeProcess];\n this.activeContext = proc.pointers[Squeak.Proc_suspendedContext];\n this.fetchContextRegisters(this.activeContext);\n this.reclaimableContextCount = 0;\n },\n findGlobals: function() {\n var smalltalk = this.specialObjects[Squeak.splOb_SmalltalkDictionary],\n smalltalkClass = smalltalk.sqClass.className();\n if (smalltalkClass === \"Association\") {\n smalltalk = smalltalk.pointers[1];\n smalltalkClass = smalltalk.sqClass.className();\n }\n if (smalltalkClass === \"SystemDictionary\")\n return smalltalk.pointers[1].pointers;\n if (smalltalkClass === \"SmalltalkImage\") {\n var globals = smalltalk.pointers[0],\n globalsClass = globals.sqClass.className();\n if (globalsClass === \"SystemDictionary\")\n return globals.pointers[1].pointers;\n if (globalsClass === \"Environment\")\n return globals.pointers[2].pointers[1].pointers\n }\n throw Error(\"cannot find global dict\");\n },\n initCompiler: function() {\n if (!Squeak.Compiler)\n return console.warn(\"Squeak.Compiler not loaded, using interpreter only\");\n // some JS environments disallow creating functions at runtime (e.g. FireFox OS apps)\n try {\n if (new Function(\"return 42\")() !== 42)\n return console.warn(\"function constructor not working, disabling JIT\");\n } catch (e) {\n return console.warn(\"disabling JIT: \" + e);\n }\n // disable JIT on slow machines, which are likely memory-limited\n var kObjPerSec = this.image.oldSpaceCount / (this.startupTime - this.image.startupTime);\n if (kObjPerSec < 10)\n return console.warn(\"Slow machine detected (loaded \" + (kObjPerSec*1000|0) + \" objects/sec), using interpreter only\");\n // compiler might decide to not handle current image\n try {\n console.log(\"squeak: initializing JIT compiler\");\n this.compiler = new Squeak.Compiler(this);\n } catch(e) {\n console.warn(\"Compiler \" + e);\n }\n },\n hackImage: function() {\n // hack methods to make work for now\n var returnSelf = 256,\n returnTrue = 257,\n returnFalse = 258,\n returnNil = 259;\n [\n // Etoys fallback for missing translation files is hugely inefficient.\n // This speeds up opening a viewer by 10x (!)\n // Remove when we added translation files.\n //{method: \"String>>translated\", primitive: returnSelf},\n //{method: \"String>>translatedInAllDomains\", primitive: returnSelf},\n // Squeak: disable syntax highlighting for speed\n //{method: \"PluggableTextMorphPlus>>useDefaultStyler\", primitive: returnSelf},\n ].forEach(function(each) {\n var m = this.findMethod(each.method);\n if (m) {\n m.pointers[0] |= each.primitive;\n console.warn(\"Hacking \" + each.method);\n }\n }, this);\n },\n},\n'interpreting', {\n interpretOne: function(singleStep) {\n if (this.method.compiled) {\n if (singleStep) {\n if (!this.compiler.enableSingleStepping(this.method)) {\n this.method.compiled = null;\n return this.interpretOne(singleStep);\n }\n this.breakNow();\n }\n this.byteCodeCount += this.method.compiled(this);\n return;\n }\n var Squeak = this.Squeak; // avoid dynamic lookup of \"Squeak\" in Lively\n var b, b2;\n this.byteCodeCount++;\n b = this.nextByte();\n if (b < 128) // Chrome only optimized up to 128 cases\n switch (b) { /* The Main Bytecode Dispatch Loop */\n\n // load receiver variable\n case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\n case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F:\n this.push(this.receiver.pointers[b&0xF]); return;\n\n // load temporary variable\n case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:\n case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F:\n this.push(this.homeContext.pointers[Squeak.Context_tempFrameStart+(b&0xF)]); return;\n\n // loadLiteral\n case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:\n case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2E: case 0x2F:\n case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\n case 0x38: case 0x39: case 0x3A: case 0x3B: case 0x3C: case 0x3D: case 0x3E: case 0x3F:\n this.push(this.method.methodGetLiteral(b&0x1F)); return;\n\n // loadLiteralIndirect\n case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:\n case 0x48: case 0x49: case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4E: case 0x4F:\n case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:\n case 0x58: case 0x59: case 0x5A: case 0x5B: case 0x5C: case 0x5D: case 0x5E: case 0x5F:\n this.push((this.method.methodGetLiteral(b&0x1F)).pointers[Squeak.Assn_value]); return;\n\n // storeAndPop rcvr, temp\n case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67:\n this.receiver.pointers[b&7] = this.pop(); return;\n case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F:\n this.homeContext.pointers[Squeak.Context_tempFrameStart+(b&7)] = this.pop(); return;\n\n // Quick push\n case 0x70: this.push(this.receiver); return;\n case 0x71: this.push(this.trueObj); return;\n case 0x72: this.push(this.falseObj); return;\n case 0x73: this.push(this.nilObj); return;\n case 0x74: this.push(-1); return;\n case 0x75: this.push(0); return;\n case 0x76: this.push(1); return;\n case 0x77: this.push(2); return;\n\n // Quick return\n case 0x78: this.doReturn(this.receiver); return;\n case 0x79: this.doReturn(this.trueObj); return;\n case 0x7A: this.doReturn(this.falseObj); return;\n case 0x7B: this.doReturn(this.nilObj); return;\n case 0x7C: this.doReturn(this.pop()); return;\n case 0x7D: this.doReturn(this.pop(), this.activeContext.pointers[Squeak.BlockContext_caller]); return; // blockReturn\n case 0x7E: this.nono(); return;\n case 0x7F: this.nono(); return;\n } else switch (b) { // Chrome only optimized up to 128 cases\n // Sundry\n case 0x80: this.extendedPush(this.nextByte()); return;\n case 0x81: this.extendedStore(this.nextByte()); return;\n case 0x82: this.extendedStorePop(this.nextByte()); return;\n // singleExtendedSend\n case 0x83: b2 = this.nextByte(); this.send(this.method.methodGetSelector(b2&31), b2>>5, false); return;\n case 0x84: this.doubleExtendedDoAnything(this.nextByte()); return;\n // singleExtendedSendToSuper\n case 0x85: b2= this.nextByte(); this.send(this.method.methodGetSelector(b2&31), b2>>5, true); return;\n // secondExtendedSend\n case 0x86: b2= this.nextByte(); this.send(this.method.methodGetSelector(b2&63), b2>>6, false); return;\n case 0x87: this.pop(); return; // pop\n case 0x88: this.push(this.top()); return; // dup\n // thisContext\n case 0x89: this.push(this.exportThisContext()); return;\n\n // Closures\n case 0x8A: this.pushNewArray(this.nextByte()); // create new temp vector\n return;\n case 0x8B: this.nono(); return;\n case 0x8C: b2 = this.nextByte(); // remote push from temp vector\n this.push(this.homeContext.pointers[Squeak.Context_tempFrameStart+this.nextByte()].pointers[b2]);\n return;\n case 0x8D: b2 = this.nextByte(); // remote store into temp vector\n this.homeContext.pointers[Squeak.Context_tempFrameStart+this.nextByte()].pointers[b2] = this.top();\n return;\n case 0x8E: b2 = this.nextByte(); // remote store and pop into temp vector\n this.homeContext.pointers[Squeak.Context_tempFrameStart+this.nextByte()].pointers[b2] = this.pop();\n return;\n case 0x8F: this.pushClosureCopy(); return;\n\n // Short jmp\n case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:\n this.pc += (b&7)+1; return;\n // Short conditional jump on false\n case 0x98: case 0x99: case 0x9A: case 0x9B: case 0x9C: case 0x9D: case 0x9E: case 0x9F:\n this.jumpIfFalse((b&7)+1); return;\n // Long jump, forward and back\n case 0xA0: case 0xA1: case 0xA2: case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7:\n b2 = this.nextByte();\n this.pc += (((b&7)-4)*256 + b2);\n if ((b&7)<4) // check for process switch on backward jumps (loops)\n if (this.interruptCheckCounter-- <= 0) this.checkForInterrupts();\n return;\n // Long conditional jump on true\n case 0xA8: case 0xA9: case 0xAA: case 0xAB:\n this.jumpIfTrue((b&3)*256 + this.nextByte()); return;\n // Long conditional jump on false\n case 0xAC: case 0xAD: case 0xAE: case 0xAF:\n this.jumpIfFalse((b&3)*256 + this.nextByte()); return;\n\n // Arithmetic Ops... + - < > <= >= = ~= * / @ lshift: lxor: land: lor:\n case 0xB0: this.success = true; this.resultIsFloat = false;\n if(!this.pop2AndPushNumResult(this.stackIntOrFloat(1) + this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // PLUS +\n case 0xB1: this.success = true; this.resultIsFloat = false;\n if(!this.pop2AndPushNumResult(this.stackIntOrFloat(1) - this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // MINUS -\n case 0xB2: this.success = true;\n if(!this.pop2AndPushBoolResult(this.stackIntOrFloat(1) < this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // LESS <\n case 0xB3: this.success = true;\n if(!this.pop2AndPushBoolResult(this.stackIntOrFloat(1) > this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // GRTR >\n case 0xB4: this.success = true;\n if(!this.pop2AndPushBoolResult(this.stackIntOrFloat(1) <= this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // LEQ <=\n case 0xB5: this.success = true;\n if(!this.pop2AndPushBoolResult(this.stackIntOrFloat(1) >= this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // GEQ >=\n case 0xB6: this.success = true;\n if(!this.pop2AndPushBoolResult(this.stackIntOrFloat(1) === this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // EQU =\n case 0xB7: this.success = true;\n if(!this.pop2AndPushBoolResult(this.stackIntOrFloat(1) !== this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // NEQ ~=\n case 0xB8: this.success = true; this.resultIsFloat = false;\n if(!this.pop2AndPushNumResult(this.stackIntOrFloat(1) * this.stackIntOrFloat(0))) this.sendSpecial(b&0xF); return; // TIMES *\n case 0xB9: this.success = true;\n if(!this.pop2AndPushIntResult(this.quickDivide(this.stackInteger(1),this.stackInteger(0)))) this.sendSpecial(b&0xF); return; // Divide /\n case 0xBA: this.success = true;\n if(!this.pop2AndPushIntResult(this.mod(this.stackInteger(1),this.stackInteger(0)))) this.sendSpecial(b&0xF); return; // MOD \\\n case 0xBB: this.success = true;\n if(!this.primHandler.primitiveMakePoint(1, true)) this.sendSpecial(b&0xF); return; // MakePt int@int\n case 0xBC: this.success = true;\n if(!this.pop2AndPushIntResult(this.safeShift(this.stackInteger(1),this.stackInteger(0)))) this.sendSpecial(b&0xF); return; // bitShift:\n case 0xBD: this.success = true;\n if(!this.pop2AndPushIntResult(this.div(this.stackInteger(1),this.stackInteger(0)))) this.sendSpecial(b&0xF); return; // Divide //\n case 0xBE: this.success = true;\n if(!this.pop2AndPushIntResult(this.stackInteger(1) & this.stackInteger(0))) this.sendSpecial(b&0xF); return; // bitAnd:\n case 0xBF: this.success = true;\n if(!this.pop2AndPushIntResult(this.stackInteger(1) | this.stackInteger(0))) this.sendSpecial(b&0xF); return; // bitOr:\n\n // at:, at:put:, size, next, nextPut:, ...\n case 0xC0: case 0xC1: case 0xC2: case 0xC3: case 0xC4: case 0xC5: case 0xC6: case 0xC7:\n case 0xC8: case 0xC9: case 0xCA: case 0xCB: case 0xCC: case 0xCD: case 0xCE: case 0xCF:\n if (!this.primHandler.quickSendOther(this.receiver, b&0xF))\n this.sendSpecial((b&0xF)+16); return;\n\n // Send Literal Selector with 0, 1, and 2 args\n case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7:\n case 0xD8: case 0xD9: case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE: case 0xDF:\n this.send(this.method.methodGetSelector(b&0xF), 0, false); return;\n case 0xE0: case 0xE1: case 0xE2: case 0xE3: case 0xE4: case 0xE5: case 0xE6: case 0xE7:\n case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED: case 0xEE: case 0xEF:\n this.send(this.method.methodGetSelector(b&0xF), 1, false); return;\n case 0xF0: case 0xF1: case 0xF2: case 0xF3: case 0xF4: case 0xF5: case 0xF6: case 0xF7:\n case 0xF8: case 0xF9: case 0xFA: case 0xFB: case 0xFC: case 0xFD: case 0xFE: case 0xFF:\n this.send(this.method.methodGetSelector(b&0xF), 2, false); return;\n }\n throw Error(\"not a bytecode: \" + b);\n },\n interpret: function(forMilliseconds, thenDo) {\n // run for a couple milliseconds (but only until idle or break)\n // answer milliseconds to sleep (until next timer wakeup)\n // or 'break' if reached breakpoint\n // call thenDo with that result when done\n if (this.frozen) return 'frozen';\n this.isIdle = false;\n this.breakOutOfInterpreter = false;\n this.breakOutTick = this.primHandler.millisecondClockValue() + (forMilliseconds || 500);\n while (this.breakOutOfInterpreter === false)\n if (this.method.compiled) {\n this.byteCodeCount += this.method.compiled(this);\n } else {\n this.interpretOne();\n }\n // this is to allow 'freezing' the interpreter and restarting it asynchronously. See freeze()\n if (typeof this.breakOutOfInterpreter == \"function\")\n return this.breakOutOfInterpreter(thenDo);\n // normally, we answer regularly\n var result = this.breakOutOfInterpreter == 'break' ? 'break'\n : !this.isIdle ? 0\n : !this.nextWakeupTick ? 'sleep' // all processes waiting\n : Math.max(1, this.nextWakeupTick - this.primHandler.millisecondClockValue());\n if (thenDo) thenDo(result);\n return result;\n },\n goIdle: function() {\n // make sure we tend to pending delays\n var hadTimer = this.nextWakeupTick !== 0;\n this.forceInterruptCheck();\n this.checkForInterrupts();\n var hasTimer = this.nextWakeupTick !== 0;\n // go idle unless a timer just expired\n this.isIdle = hasTimer || !hadTimer;\n this.breakOut();\n },\n freeze: function(frozenDo) {\n // Stop the interpreter. Answer a function that can be\n // called to continue interpreting.\n // Optionally, frozenDo is called asynchronously when frozen\n var continueFunc;\n this.frozen = true;\n this.breakOutOfInterpreter = function(thenDo) {\n if (!thenDo) throw Error(\"need function to restart interpreter\");\n continueFunc = thenDo;\n return \"frozen\";\n }.bind(this);\n var unfreeze = function() {\n this.frozen = false;\n if (!continueFunc) throw Error(\"no continue function\");\n continueFunc(0); //continue without timeout\n }.bind(this);\n if (frozenDo) window.setTimeout(function(){frozenDo(unfreeze)}, 0);\n return unfreeze;\n },\n breakOut: function() {\n this.breakOutOfInterpreter = this.breakOutOfInterpreter || true; // do not overwrite break string\n },\n nextByte: function() {\n return this.methodBytes[this.pc++];\n },\n nono: function() {\n throw Error(\"Oh No!\");\n },\n forceInterruptCheck: function() {\n this.interruptCheckCounter = -1000;\n },\n checkForInterrupts: function() {\n //Check for interrupts at sends and backward jumps\n var now = this.primHandler.millisecondClockValue();\n if (now < this.lastTick) { // millisecond clock wrapped\n this.nextPollTick = now + (this.nextPollTick - this.lastTick);\n this.breakOutTick = now + (this.breakOutTick - this.lastTick);\n if (this.nextWakeupTick !== 0)\n this.nextWakeupTick = now + (this.nextWakeupTick - this.lastTick);\n }\n //Feedback logic attempts to keep interrupt response around 3ms...\n if (this.interruptCheckCounter > -100) { // only if not a forced check\n if ((now - this.lastTick) < this.interruptChecksEveryNms) { //wrapping is not a concern\n this.interruptCheckCounterFeedBackReset += 10;\n } else { // do a thousand sends even if we are too slow for 3ms\n if (this.interruptCheckCounterFeedBackReset <= 1000)\n this.interruptCheckCounterFeedBackReset = 1000;\n else\n this.interruptCheckCounterFeedBackReset -= 12;\n }\n }\n this.interruptCheckCounter = this.interruptCheckCounterFeedBackReset; //reset the interrupt check counter\n this.lastTick = now; //used to detect wraparound of millisecond clock\n // if(signalLowSpace) {\n // signalLowSpace= false; //reset flag\n // sema= getSpecialObject(Squeak.splOb_TheLowSpaceSemaphore);\n // if(sema != nilObj) synchronousSignal(sema); }\n // if(now >= nextPollTick) {\n // ioProcessEvents(); //sets interruptPending if interrupt key pressed\n // nextPollTick= now + 500; } //msecs to wait before next call to ioProcessEvents\"\n if (this.interruptPending) {\n this.interruptPending = false; //reset interrupt flag\n var sema = this.specialObjects[Squeak.splOb_TheInterruptSemaphore];\n if (!sema.isNil) this.primHandler.synchronousSignal(sema);\n }\n if ((this.nextWakeupTick !== 0) && (now >= this.nextWakeupTick)) {\n this.nextWakeupTick = 0; //reset timer interrupt\n var sema = this.specialObjects[Squeak.splOb_TheTimerSemaphore];\n if (!sema.isNil) this.primHandler.synchronousSignal(sema);\n }\n if (this.pendingFinalizationSignals > 0) { //signal any pending finalizations\n var sema = this.specialObjects[Squeak.splOb_TheFinalizationSemaphore];\n this.pendingFinalizationSignals = 0;\n if (!sema.isNil) this.primHandler.synchronousSignal(sema);\n }\n if (this.primHandler.semaphoresToSignal.length > 0)\n this.primHandler.signalExternalSemaphores(); // signal pending semaphores, if any\n // if this is a long-running do-it, compile it\n if (!this.method.compiled && this.compiler)\n this.compiler.compile(this.method);\n // have to return to web browser once in a while\n if (now >= this.breakOutTick)\n this.breakOut();\n },\n extendedPush: function(nextByte) {\n var lobits = nextByte & 63;\n switch (nextByte>>6) {\n case 0: this.push(this.receiver.pointers[lobits]);break;\n case 1: this.push(this.homeContext.pointers[Squeak.Context_tempFrameStart+lobits]); break;\n case 2: this.push(this.method.methodGetLiteral(lobits)); break;\n case 3: this.push(this.method.methodGetLiteral(lobits).pointers[Squeak.Assn_value]); break;\n }\n },\n extendedStore: function( nextByte) {\n var lobits = nextByte & 63;\n switch (nextByte>>6) {\n case 0: this.receiver.pointers[lobits] = this.top(); break;\n case 1: this.homeContext.pointers[Squeak.Context_tempFrameStart+lobits] = this.top(); break;\n case 2: this.nono(); break;\n case 3: this.method.methodGetLiteral(lobits).pointers[Squeak.Assn_value] = this.top(); break;\n }\n },\n extendedStorePop: function(nextByte) {\n var lobits = nextByte & 63;\n switch (nextByte>>6) {\n case 0: this.receiver.pointers[lobits] = this.pop(); break;\n case 1: this.homeContext.pointers[Squeak.Context_tempFrameStart+lobits] = this.pop(); break;\n case 2: this.nono(); break;\n case 3: this.method.methodGetLiteral(lobits).pointers[Squeak.Assn_value] = this.pop(); break;\n }\n },\n doubleExtendedDoAnything: function(byte2) {\n var byte3 = this.nextByte();\n switch (byte2>>5) {\n case 0: this.send(this.method.methodGetSelector(byte3), byte2&31, false); break;\n case 1: this.send(this.method.methodGetSelector(byte3), byte2&31, true); break;\n case 2: this.push(this.receiver.pointers[byte3]); break;\n case 3: this.push(this.method.methodGetLiteral(byte3)); break;\n case 4: this.push(this.method.methodGetLiteral(byte3).pointers[Squeak.Assn_value]); break;\n case 5: this.receiver.pointers[byte3] = this.top(); break;\n case 6: this.receiver.pointers[byte3] = this.pop(); break;\n case 7: this.method.methodGetLiteral(byte3).pointers[Squeak.Assn_value] = this.top(); break;\n }\n },\n jumpIfTrue: function(delta) {\n var top = this.pop();\n if (top.isTrue) {this.pc += delta; return;}\n if (top.isFalse) return;\n this.push(top); //Uh-oh it's not even a boolean (that we know of ;-). Restore stack...\n this.send(this.specialObjects[Squeak.splOb_SelectorMustBeBoolean], 0, false);\n },\n jumpIfFalse: function(delta) {\n var top = this.pop();\n if (top.isFalse) {this.pc += delta; return;}\n if (top.isTrue) return;\n this.push(top); //Uh-oh it's not even a boolean (that we know of ;-). Restore stack...\n this.send(this.specialObjects[Squeak.splOb_SelectorMustBeBoolean], 0, false);\n },\n sendSpecial: function(lobits) {\n this.send(this.specialSelectors[lobits*2],\n this.specialSelectors[(lobits*2)+1],\n false); //specialSelectors is {...sel,nArgs,sel,nArgs,...)\n },\n},\n'closures', {\n pushNewArray: function(nextByte) {\n var popValues = nextByte > 127,\n count = nextByte & 127,\n array = this.instantiateClass(this.specialObjects[Squeak.splOb_ClassArray], count);\n if (popValues) {\n for (var i = 0; i < count; i++)\n array.pointers[i] = this.stackValue(count - i - 1);\n this.popN(count);\n }\n this.push(array);\n },\n pushClosureCopy: function() {\n // The compiler has pushed the values to be copied, if any. Find numArgs and numCopied in the byte following.\n // Create a Closure with space for the copiedValues and pop numCopied values off the stack into the closure.\n // Set numArgs as specified, and set startpc to the pc following the block size and jump over that code.\n var numArgsNumCopied = this.nextByte(),\n numArgs = numArgsNumCopied & 0xF,\n numCopied = numArgsNumCopied >> 4,\n blockSizeHigh = this.nextByte(),\n blockSize = blockSizeHigh * 256 + this.nextByte(),\n initialPC = this.encodeSqueakPC(this.pc, this.method),\n closure = this.newClosure(numArgs, initialPC, numCopied);\n closure.pointers[Squeak.Closure_outerContext] = this.activeContext;\n this.reclaimableContextCount = 0; // The closure refers to thisContext so it can't be reclaimed\n if (numCopied > 0) {\n for (var i = 0; i < numCopied; i++)\n closure.pointers[Squeak.Closure_firstCopiedValue + i] = this.stackValue(numCopied - i - 1);\n this.popN(numCopied);\n }\n this.pc += blockSize;\n this.push(closure);\n },\n newClosure: function(numArgs, initialPC, numCopied) {\n var closure = this.instantiateClass(this.specialObjects[Squeak.splOb_ClassBlockClosure], numCopied);\n closure.pointers[Squeak.Closure_startpc] = initialPC;\n closure.pointers[Squeak.Closure_numArgs] = numArgs;\n return closure;\n },\n},\n'sending', {\n send: function(selector, argCount, doSuper) {\n var newRcvr = this.stackValue(argCount);\n var lookupClass = this.getClass(newRcvr);\n if (doSuper) {\n lookupClass = this.method.methodClassForSuper();\n lookupClass = lookupClass.pointers[Squeak.Class_superclass];\n }\n var entry = this.findSelectorInClass(selector, argCount, lookupClass);\n if (entry.primIndex) {\n //note details for verification of at/atput primitives\n this.verifyAtSelector = selector;\n this.verifyAtClass = lookupClass;\n }\n this.executeNewMethod(newRcvr, entry.method, entry.argCount, entry.primIndex, entry.mClass, selector);\n },\n sendAsPrimitiveFailure: function(rcvr, method, argCount) {\n this.executeNewMethod(rcvr, method, argCount, 0);\n },\n findSelectorInClass: function(selector, argCount, startingClass) {\n var cacheEntry = this.findMethodCacheEntry(selector, startingClass);\n if (cacheEntry.method) return cacheEntry; // Found it in the method cache\n var currentClass = startingClass;\n var mDict;\n while (!currentClass.isNil) {\n mDict = currentClass.pointers[Squeak.Class_mdict];\n if (mDict.isNil) {\n // MethodDict pointer is nil (hopefully due a swapped out stub)\n // -- send #cannotInterpret:\n var cantInterpSel = this.specialObjects[Squeak.splOb_SelectorCannotInterpret],\n cantInterpMsg = this.createActualMessage(selector, argCount, startingClass);\n this.popNandPush(argCount, cantInterpMsg);\n return this.findSelectorInClass(cantInterpSel, 1, currentClass.superclass());\n }\n var newMethod = this.lookupSelectorInDict(mDict, selector);\n if (!newMethod.isNil) {\n this.currentSelector = selector;\n this.currentLookupClass = startingClass;\n //if method is not actually a CompiledMethod, invoke primitiveInvokeObjectAsMethod (248) instead\n cacheEntry.method = newMethod;\n cacheEntry.primIndex = newMethod.isMethod() ? newMethod.methodPrimitiveIndex() : 248;\n cacheEntry.argCount = argCount;\n cacheEntry.mClass = currentClass;\n return cacheEntry;\n }\n currentClass = currentClass.superclass();\n }\n //Cound not find a normal message -- send #doesNotUnderstand:\n var dnuSel = this.specialObjects[Squeak.splOb_SelectorDoesNotUnderstand];\n if (selector === dnuSel) // Cannot find #doesNotUnderstand: -- unrecoverable error.\n throw Error(\"Recursive not understood error encountered\");\n var dnuMsg = this.createActualMessage(selector, argCount, startingClass); //The argument to doesNotUnderstand:\n this.popNandPush(argCount, dnuMsg);\n return this.findSelectorInClass(dnuSel, 1, startingClass);\n },\n lookupSelectorInDict: function(mDict, messageSelector) {\n //Returns a method or nilObject\n var dictSize = mDict.pointersSize();\n var mask = (dictSize - Squeak.MethodDict_selectorStart) - 1;\n var index = (mask & messageSelector.hash) + Squeak.MethodDict_selectorStart;\n // If there are no nils (should always be), then stop looping on second wrap.\n var hasWrapped = false;\n while (true) {\n var nextSelector = mDict.pointers[index];\n if (nextSelector === messageSelector) {\n var methArray = mDict.pointers[Squeak.MethodDict_array];\n return methArray.pointers[index - Squeak.MethodDict_selectorStart];\n }\n if (nextSelector.isNil) return this.nilObj;\n if (++index === dictSize) {\n if (hasWrapped) return this.nilObj;\n index = Squeak.MethodDict_selectorStart;\n hasWrapped = true;\n }\n }\n },\n executeNewMethod: function(newRcvr, newMethod, argumentCount, primitiveIndex, optClass, optSel) {\n this.sendCount++;\n if (newMethod === this.breakOnMethod) this.breakNow(\"executing method \" + this.printMethod(newMethod, optClass, optSel));\n if (this.logSends) console.log(this.sendCount + ' ' + this.printMethod(newMethod, optClass, optSel));\n if (this.breakOnContextChanged) {\n this.breakOnContextChanged = false;\n this.breakNow();\n }\n if (primitiveIndex > 0)\n if (this.tryPrimitive(primitiveIndex, argumentCount, newMethod))\n return; //Primitive succeeded -- end of story\n var newContext = this.allocateOrRecycleContext(newMethod.methodNeedsLargeFrame());\n var tempCount = newMethod.methodTempCount();\n var newPC = 0; // direct zero-based index into byte codes\n var newSP = Squeak.Context_tempFrameStart + tempCount - 1; // direct zero-based index into context pointers\n newContext.pointers[Squeak.Context_method] = newMethod;\n //Following store is in case we alloc without init; all other fields get stored\n newContext.pointers[Squeak.BlockContext_initialIP] = this.nilObj;\n newContext.pointers[Squeak.Context_sender] = this.activeContext;\n //Copy receiver and args to new context\n //Note this statement relies on the receiver slot being contiguous with args...\n this.arrayCopy(this.activeContext.pointers, this.sp-argumentCount, newContext.pointers, Squeak.Context_tempFrameStart-1, argumentCount+1);\n //...and fill the remaining temps with nil\n this.arrayFill(newContext.pointers, Squeak.Context_tempFrameStart+argumentCount, Squeak.Context_tempFrameStart+tempCount, this.nilObj);\n this.popN(argumentCount+1);\n this.reclaimableContextCount++;\n this.storeContextRegisters();\n /////// Woosh //////\n this.activeContext = newContext; //We're off and running...\n //Following are more efficient than fetchContextRegisters() in newActiveContext()\n this.homeContext = newContext;\n this.method = newMethod;\n this.methodBytes = newMethod.bytes;\n this.pc = newPC;\n this.sp = newSP;\n this.storeContextRegisters(); // not really necessary, I claim\n this.receiver = newContext.pointers[Squeak.Context_receiver];\n if (this.receiver !== newRcvr)\n throw Error(\"receivers don't match\");\n if (!newMethod.compiled && this.compiler)\n this.compiler.compile(newMethod, optClass, optSel);\n // check for process switch on full method activation\n if (this.interruptCheckCounter-- <= 0) this.checkForInterrupts();\n },\n doReturn: function(returnValue, targetContext) {\n // get sender from block home or closure's outerContext\n if (!targetContext) {\n var ctx = this.homeContext;\n if (this.hasClosures) {\n var closure;\n while (!(closure = ctx.pointers[Squeak.Context_closure]).isNil)\n ctx = closure.pointers[Squeak.Closure_outerContext];\n }\n targetContext = ctx.pointers[Squeak.Context_sender];\n }\n if (targetContext.isNil || targetContext.pointers[Squeak.Context_instructionPointer].isNil)\n return this.cannotReturn(returnValue);\n // search up stack for unwind\n var thisContext = this.activeContext.pointers[Squeak.Context_sender];\n while (thisContext !== targetContext) {\n if (thisContext.isNil)\n return this.cannotReturn(returnValue);\n if (this.isUnwindMarked(thisContext))\n return this.aboutToReturnThrough(returnValue, thisContext);\n thisContext = thisContext.pointers[Squeak.Context_sender];\n }\n // no unwind to worry about, just peel back the stack (usually just to sender)\n var nextContext;\n thisContext = this.activeContext;\n while (thisContext !== targetContext) {\n if (this.breakOnContextReturned === thisContext) {\n this.breakOnContextReturned = null;\n this.breakNow();\n }\n nextContext = thisContext.pointers[Squeak.Context_sender];\n thisContext.pointers[Squeak.Context_sender] = this.nilObj;\n thisContext.pointers[Squeak.Context_instructionPointer] = this.nilObj;\n if (this.reclaimableContextCount > 0) {\n this.reclaimableContextCount--;\n this.recycleIfPossible(thisContext);\n }\n thisContext = nextContext;\n }\n this.activeContext = thisContext;\n this.fetchContextRegisters(this.activeContext);\n this.push(returnValue);\n if (this.breakOnContextChanged) {\n this.breakOnContextChanged = false;\n this.breakNow();\n }\n },\n aboutToReturnThrough: function(resultObj, aContext) {\n this.push(this.exportThisContext());\n this.push(resultObj);\n this.push(aContext);\n var aboutToReturnSel = this.specialObjects[Squeak.splOb_SelectorAboutToReturn];\n this.send(aboutToReturnSel, 2);\n },\n cannotReturn: function(resultObj) {\n this.push(this.exportThisContext());\n this.push(resultObj);\n var cannotReturnSel = this.specialObjects[Squeak.splOb_SelectorCannotReturn];\n this.send(cannotReturnSel, 1);\n },\n tryPrimitive: function(primIndex, argCount, newMethod) {\n if ((primIndex > 255) && (primIndex < 520)) {\n if (primIndex >= 264) {//return instvars\n this.popNandPush(1, this.top().pointers[primIndex - 264]);\n return true;\n }\n switch (primIndex) {\n case 256: //return self\n return true;\n case 257: this.popNandPush(1, this.trueObj); //return true\n return true;\n case 258: this.popNandPush(1, this.falseObj); //return false\n return true;\n case 259: this.popNandPush(1, this.nilObj); //return nil\n return true;\n }\n this.popNandPush(1, primIndex - 261); //return -1...2\n return true;\n }\n var success = this.primHandler.doPrimitive(primIndex, argCount, newMethod);\n return success;\n },\n createActualMessage: function(selector, argCount, cls) {\n //Bundle up receiver, args and selector as a messageObject\n var message = this.instantiateClass(this.specialObjects[Squeak.splOb_ClassMessage], 0);\n var argArray = this.instantiateClass(this.specialObjects[Squeak.splOb_ClassArray], argCount);\n this.arrayCopy(this.activeContext.pointers, this.sp-argCount+1, argArray.pointers, 0, argCount); //copy args from stack\n message.pointers[Squeak.Message_selector] = selector;\n message.pointers[Squeak.Message_arguments] = argArray;\n if (message.pointers.length > Squeak.Message_lookupClass) //Early versions don't have lookupClass\n message.pointers[Squeak.Message_lookupClass] = cls;\n return message;\n },\n primitivePerform: function(argCount) {\n var selector = this.stackValue(argCount-1);\n var rcvr = this.stackValue(argCount);\n // NOTE: findNewMethodInClass may fail and be converted to #doesNotUnderstand:,\n // (Whoah) so we must slide args down on the stack now, so that would work\n var trueArgCount = argCount - 1;\n var selectorIndex = this.sp - trueArgCount;\n var stack = this.activeContext.pointers; // slide eveything down...\n this.arrayCopy(stack, selectorIndex+1, stack, selectorIndex, trueArgCount);\n this.sp--; // adjust sp accordingly\n var entry = this.findSelectorInClass(selector, trueArgCount, this.getClass(rcvr));\n this.executeNewMethod(rcvr, entry.method, entry.argCount, entry.primIndex, entry.mClass, selector);\n return true;\n },\n primitivePerformWithArgs: function(argCount, supered) {\n var rcvr = this.stackValue(argCount);\n var selector = this.stackValue(argCount - 1);\n var args = this.stackValue(argCount - 2);\n if (args.sqClass !== this.specialObjects[Squeak.splOb_ClassArray])\n return false;\n var lookupClass = supered ? this.stackValue(argCount - 3) : this.getClass(rcvr);\n if (supered) { // verify that lookupClass is in fact in superclass chain of receiver;\n var cls = this.getClass(rcvr);\n while (cls !== lookupClass) {\n cls = cls.pointers[Squeak.Class_superclass];\n if (cls.isNil) return false;\n }\n }\n var trueArgCount = args.pointersSize();\n var stack = this.activeContext.pointers;\n this.arrayCopy(args.pointers, 0, stack, this.sp - 1, trueArgCount);\n this.sp += trueArgCount - argCount; //pop selector and array then push args\n var entry = this.findSelectorInClass(selector, trueArgCount, lookupClass);\n this.executeNewMethod(rcvr, entry.method, entry.argCount, entry.primIndex, entry.mClass, selector);\n return true;\n },\n primitiveInvokeObjectAsMethod: function(argCount, method) {\n // invoked from VM if non-method found in lookup\n var orgArgs = this.instantiateClass(this.specialObjects[Squeak.splOb_ClassArray], argCount);\n for (var i = 0; i < argCount; i++)\n orgArgs.pointers[argCount - i - 1] = this.pop();\n var orgReceiver = this.pop(),\n orgSelector = this.currentSelector;\n // send run:with:in: to non-method object\n var runWithIn = this.specialObjects[Squeak.splOb_SelectorRunWithIn];\n this.push(method); // not actually a method\n this.push(orgSelector);\n this.push(orgArgs);\n this.push(orgReceiver);\n this.send(runWithIn, 3, false);\n return true;\n },\n findMethodCacheEntry: function(selector, lkupClass) {\n //Probe the cache, and return the matching entry if found\n //Otherwise return one that can be used (selector and class set) with method == null.\n //Initial probe is class xor selector, reprobe delta is selector\n //We do not try to optimize probe time -- all are equally 'fast' compared to lookup\n //Instead we randomize the reprobe so two or three very active conflicting entries\n //will not keep dislodging each other\n var entry;\n this.methodCacheRandomish = (this.methodCacheRandomish + 1) & 3;\n var firstProbe = (selector.hash ^ lkupClass.hash) & this.methodCacheMask;\n var probe = firstProbe;\n for (var i = 0; i < 4; i++) { // 4 reprobes for now\n entry = this.methodCache[probe];\n if (entry.selector === selector && entry.lkupClass === lkupClass) return entry;\n if (i === this.methodCacheRandomish) firstProbe = probe;\n probe = (probe + selector.hash) & this.methodCacheMask;\n }\n entry = this.methodCache[firstProbe];\n entry.lkupClass = lkupClass;\n entry.selector = selector;\n entry.method = null;\n return entry;\n },\n flushMethodCache: function() { //clear all cache entries (prim 89)\n for (var i = 0; i < this.methodCacheSize; i++) {\n this.methodCache[i].selector = null; // mark it free\n this.methodCache[i].method = null; // release the method\n }\n return true;\n },\n flushMethodCacheForSelector: function(selector) { //clear cache entries for selector (prim 119)\n for (var i = 0; i < this.methodCacheSize; i++)\n if (this.methodCache[i].selector === selector) {\n this.methodCache[i].selector = null; // mark it free\n this.methodCache[i].method = null; // release the method\n }\n return true;\n },\n flushMethodCacheForMethod: function(method) { //clear cache entries for method (prim 116)\n for (var i = 0; i < this.methodCacheSize; i++)\n if (this.methodCache[i].method === method) {\n this.methodCache[i].selector = null; // mark it free\n this.methodCache[i].method = null; // release the method\n }\n return true;\n },\n flushMethodCacheAfterBecome: function(mutations) {\n // could be selective by checking lkupClass, selector,\n // and method against mutations dict\n this.flushMethodCache();\n },\n},\n'contexts', {\n isUnwindMarked: function(ctx) {\n if (!this.isMethodContext(ctx)) return false;\n var method = ctx.pointers[Squeak.Context_method];\n return method.methodPrimitiveIndex() == 198;\n },\n newActiveContext: function(newContext) {\n // Note: this is inlined in executeNewMethod() and doReturn()\n this.storeContextRegisters();\n this.activeContext = newContext; //We're off and running...\n this.fetchContextRegisters(newContext);\n },\n exportThisContext: function() {\n this.storeContextRegisters();\n this.reclaimableContextCount = 0;\n return this.activeContext;\n },\n fetchContextRegisters: function(ctxt) {\n var meth = ctxt.pointers[Squeak.Context_method];\n if (this.isSmallInt(meth)) { //if the Method field is an integer, activeCntx is a block context\n this.homeContext = ctxt.pointers[Squeak.BlockContext_home];\n meth = this.homeContext.pointers[Squeak.Context_method];\n } else { //otherwise home==ctxt\n this.homeContext = ctxt;\n }\n this.receiver = this.homeContext.pointers[Squeak.Context_receiver];\n this.method = meth;\n this.methodBytes = meth.bytes;\n this.pc = this.decodeSqueakPC(ctxt.pointers[Squeak.Context_instructionPointer], meth);\n this.sp = this.decodeSqueakSP(ctxt.pointers[Squeak.Context_stackPointer]);\n },\n storeContextRegisters: function() {\n //Save pc, sp into activeContext object, prior to change of context\n // see fetchContextRegisters for symmetry\n // expects activeContext, pc, sp, and method state vars to still be valid\n this.activeContext.pointers[Squeak.Context_instructionPointer] = this.encodeSqueakPC(this.pc, this.method);\n this.activeContext.pointers[Squeak.Context_stackPointer] = this.encodeSqueakSP(this.sp);\n },\n encodeSqueakPC: function(intPC, method) {\n // Squeak pc is offset by header and literals\n // and 1 for z-rel addressing\n return intPC + method.pointers.length * 4 + 1;\n },\n decodeSqueakPC: function(squeakPC, method) {\n return squeakPC - method.pointers.length * 4 - 1;\n },\n encodeSqueakSP: function(intSP) {\n // sp is offset by tempFrameStart, -1 for z-rel addressing\n return intSP - (Squeak.Context_tempFrameStart - 1);\n },\n decodeSqueakSP: function(squeakSP) {\n return squeakSP + (Squeak.Context_tempFrameStart - 1);\n },\n recycleIfPossible: function(ctxt) {\n if (!this.isMethodContext(ctxt)) return;\n if (ctxt.pointersSize() === (Squeak.Context_tempFrameStart+Squeak.Context_smallFrameSize)) {\n // Recycle small contexts\n ctxt.pointers[0] = this.freeContexts;\n this.freeContexts = ctxt;\n } else { // Recycle large contexts\n if (ctxt.pointersSize() !== (Squeak.Context_tempFrameStart+Squeak.Context_largeFrameSize))\n return;\n ctxt.pointers[0] = this.freeLargeContexts;\n this.freeLargeContexts = ctxt;\n }\n },\n allocateOrRecycleContext: function(needsLarge) {\n //Return a recycled context or a newly allocated one if none is available for recycling.\"\n var freebie;\n if (needsLarge) {\n if (!this.freeLargeContexts.isNil) {\n freebie = this.freeLargeContexts;\n this.freeLargeContexts = freebie.pointers[0];\n this.nRecycledContexts++;\n return freebie;\n }\n this.nAllocatedContexts++;\n return this.instantiateClass(this.specialObjects[Squeak.splOb_ClassMethodContext], Squeak.Context_largeFrameSize);\n } else {\n if (!this.freeContexts.isNil) {\n freebie = this.freeContexts;\n this.freeContexts = freebie.pointers[0];\n this.nRecycledContexts++;\n return freebie;\n }\n this.nAllocatedContexts++;\n return this.instantiateClass(this.specialObjects[Squeak.splOb_ClassMethodContext], Squeak.Context_smallFrameSize);\n }\n },\n},\n'stack access', {\n pop: function() {\n //Note leaves garbage above SP. Cleaned out by fullGC.\n return this.activeContext.pointers[this.sp--];\n },\n popN: function(nToPop) {\n this.sp -= nToPop;\n },\n push: function(object) {\n this.activeContext.pointers[++this.sp] = object;\n },\n popNandPush: function(nToPop, object) {\n this.activeContext.pointers[this.sp -= nToPop - 1] = object;\n },\n top: function() {\n return this.activeContext.pointers[this.sp];\n },\n stackValue: function(depthIntoStack) {\n return this.activeContext.pointers[this.sp - depthIntoStack];\n },\n stackInteger: function(depthIntoStack) {\n return this.checkSmallInt(this.stackValue(depthIntoStack));\n },\n stackIntOrFloat: function(depthIntoStack) {\n var num = this.stackValue(depthIntoStack);\n // is it a SmallInt?\n if (typeof num === \"number\") return num;\n // is it a Float?\n if (num.isFloat) {\n this.resultIsFloat = true; // need to return result as Float\n return num.float;\n }\n // maybe a 32-bit LargeInt?\n var bytes = num.bytes;\n if (bytes && bytes.length == 4) {\n var value = 0;\n for (var i = 3; i >= 0; i--)\n value = value * 256 + bytes[i];\n if (num.sqClass === this.specialObjects[Squeak.splOb_ClassLargePositiveInteger])\n return value;\n if (num.sqClass === this.specialObjects[Squeak.splOb_ClassLargeNegativeInteger])\n return -value;\n }\n // none of the above\n this.success = false;\n return 0;\n },\n pop2AndPushIntResult: function(intResult) {// returns success boolean\n if (this.success && this.canBeSmallInt(intResult)) {\n this.popNandPush(2, intResult);\n return true;\n }\n return false;\n },\n pop2AndPushNumResult: function(numResult) {// returns success boolean\n if (this.success) {\n if (this.resultIsFloat) {\n this.popNandPush(2, this.primHandler.makeFloat(numResult));\n return true;\n }\n if (numResult >= Squeak.MinSmallInt && numResult <= Squeak.MaxSmallInt) {\n this.popNandPush(2, numResult);\n return true;\n }\n if (numResult >= -0xFFFFFFFF && numResult <= 0xFFFFFFFF) {\n var negative = numResult < 0,\n unsigned = negative ? -numResult : numResult,\n lgIntClass = negative ? Squeak.splOb_ClassLargeNegativeInteger : Squeak.splOb_ClassLargePositiveInteger,\n lgIntObj = this.instantiateClass(this.specialObjects[lgIntClass], 4),\n bytes = lgIntObj.bytes;\n bytes[0] = unsigned & 255;\n bytes[1] = unsigned>>8 & 255;\n bytes[2] = unsigned>>16 & 255;\n bytes[3] = unsigned>>24 & 255;\n this.popNandPush(2, lgIntObj);\n return true;\n }\n }\n return false;\n },\n pop2AndPushBoolResult: function(boolResult) {\n if (!this.success) return false;\n this.popNandPush(2, boolResult ? this.trueObj : this.falseObj);\n return true;\n },\n},\n'numbers', {\n getClass: function(obj) {\n if (this.isSmallInt(obj))\n return this.specialObjects[Squeak.splOb_ClassInteger];\n return obj.sqClass;\n },\n canBeSmallInt: function(anInt) {\n return (anInt >= Squeak.MinSmallInt) && (anInt <= Squeak.MaxSmallInt);\n },\n isSmallInt: function(object) {\n return typeof object === \"number\";\n },\n checkSmallInt: function(maybeSmallInt) { // returns an int and sets success\n if (typeof maybeSmallInt === \"number\")\n return maybeSmallInt;\n this.success = false;\n return 1;\n },\n quickDivide: function(rcvr, arg) { // must only handle exact case\n if (arg === 0) return Squeak.NonSmallInt; // fail if divide by zero\n var result = rcvr / arg | 0;\n if (result * arg === rcvr) return result;\n return Squeak.NonSmallInt; // fail if result is not exact\n },\n div: function(rcvr, arg) {\n if (arg === 0) return Squeak.NonSmallInt; // fail if divide by zero\n return Math.floor(rcvr/arg);\n },\n mod: function(rcvr, arg) {\n if (arg === 0) return Squeak.NonSmallInt; // fail if divide by zero\n return rcvr - Math.floor(rcvr/arg) * arg;\n },\n safeShift: function(smallInt, shiftCount) {\n // JS shifts only up to 31 bits\n if (shiftCount < 0) {\n if (shiftCount < -31) return smallInt < 0 ? -1 : 0;\n return smallInt >> -shiftCount; // OK to lose bits shifting right\n }\n if (shiftCount > 31) return smallInt == 0 ? 0 : Squeak.NonSmallInt;\n // check for lost bits by seeing if computation is reversible\n var shifted = smallInt << shiftCount;\n if ((shifted>>shiftCount) === smallInt) return shifted;\n return Squeak.NonSmallInt; //non-small result will cause failure\n },\n},\n'utils',\n{\n isContext: function(obj) {//either block or methodContext\n if (obj.sqClass === this.specialObjects[Squeak.splOb_ClassMethodContext]) return true;\n if (obj.sqClass === this.specialObjects[Squeak.splOb_ClassBlockContext]) return true;\n return false;\n },\n isMethodContext: function(obj) {\n return obj.sqClass === this.specialObjects[Squeak.splOb_ClassMethodContext];\n },\n isMethod: function(obj, index) {\n return obj.sqClass === this.specialObjects[Squeak.splOb_ClassCompiledMethod];\n },\n instantiateClass: function(aClass, indexableSize) {\n return this.image.instantiateClass(aClass, indexableSize, this.nilObj);\n },\n arrayFill: function(array, fromIndex, toIndex, value) {\n // assign value to range from fromIndex (inclusive) to toIndex (exclusive)\n for (var i = fromIndex; i < toIndex; i++)\n array[i] = value;\n },\n arrayCopy: function(src, srcPos, dest, destPos, length) {\n // copy length elements from src at srcPos to dest at destPos\n if (src === dest && srcPos < destPos)\n for (var i = length - 1; i >= 0; i--)\n dest[destPos + i] = src[srcPos + i];\n else\n for (var i = 0; i < length; i++)\n dest[destPos + i] = src[srcPos + i];\n },\n},\n'debugging', {\n addMessage: function(message) {\n return this.messages[message] ? ++this.messages[message] : this.messages[message] = 1;\n },\n warnOnce: function(message) {\n if (this.addMessage(message) == 1)\n console.warn(message);\n },\n printMethod: function(aMethod, optContext, optSel) {\n // return a 'class>>selector' description for the method\n if (optSel) return optContext.className() + '>>' + optSel.bytesAsString();\n // this is expensive, we have to search all classes\n if (!aMethod) aMethod = this.activeContext.contextMethod();\n var found;\n this.allMethodsDo(function(classObj, methodObj, selectorObj) {\n if (methodObj === aMethod)\n return found = classObj.className() + '>>' + selectorObj.bytesAsString();\n });\n if (found) return found;\n if (optContext) {\n var rcvr = optContext.pointers[Squeak.Context_receiver];\n return \"(\" + rcvr + \")>>?\";\n }\n return \"?>>?\";\n },\n allInstancesOf: function(classObj, callback) {\n if (typeof classObj === \"string\") classObj = this.globalNamed(classObj);\n var instances = [],\n inst = this.image.someInstanceOf(classObj);\n while (inst) {\n if (callback) callback(inst);\n else instances.push(inst);\n inst = this.image.nextInstanceAfter(inst);\n }\n return instances;\n },\n globalNamed: function(name) {\n return this.allGlobalsDo(function(nameObj, globalObj){\n if (nameObj.bytesAsString() === name) return globalObj;\n });\n },\n allGlobalsDo: function(callback) {\n // callback(globalNameObj, globalObj) should return true to break out of iteration\n var globals = this.globals;\n for (var i = 0; i < globals.length; i++) {\n var assn = globals[i];\n if (!assn.isNil) {\n var result = callback(assn.pointers[0], assn.pointers[1]);\n if (result) return result;\n }\n }\n },\n allMethodsDo: function(callback) {\n // callback(classObj, methodObj, selectorObj) should return true to break out of iteration\n var self = this;\n this.allGlobalsDo(function(globalNameObj, globalObj) {\n if (globalObj.pointers && globalObj.pointers.length >= 9) {\n var clsAndMeta = [globalObj, globalObj.sqClass];\n for (var c = 0; c < clsAndMeta.length; c++) {\n var cls = clsAndMeta[c];\n var mdict = cls.pointers[1];\n if (!mdict.pointers || !mdict.pointers[1]) continue;\n var methods = mdict.pointers[1].pointers;\n if (!methods) continue;\n var selectors = mdict.pointers;\n for (var j = 0; j < methods.length; j++) {\n if (callback.call(this, cls, methods[j], selectors[2+j]))\n return true;\n }\n }\n }\n });\n },\n printStack: function(ctx, limit) {\n // both args are optional\n if (typeof ctx == \"number\") {limit = ctx; ctx = null;}\n if (!ctx) ctx = this.activeContext;\n if (!limit) limit = 100;\n var contexts = [],\n hardLimit = Math.max(limit, 1000000);\n while (!ctx.isNil && hardLimit-- > 0) {\n contexts.push(ctx);\n ctx = ctx.pointers[Squeak.Context_sender];\n }\n var extra = 200;\n if (contexts.length > limit + extra) {\n if (!ctx.isNil) contexts.push('...'); // over hard limit\n contexts = contexts.slice(0, limit).concat(['...']).concat(contexts.slice(-extra));\n }\n var stack = [],\n i = contexts.length;\n while (i-- > 0) {\n var ctx = contexts[i];\n if (!ctx.pointers) {\n stack.push('...\\n');\n } else {\n var block = '',\n method = ctx.pointers[Squeak.Context_method];\n if (typeof method === 'number') { // it's a block context, fetch home\n method = ctx.pointers[Squeak.BlockContext_home].pointers[Squeak.Context_method];\n block = '[] in ';\n } else if (!ctx.pointers[Squeak.Context_closure].isNil) {\n block = '[] in '; // it's a closure activation\n }\n stack.push(block + this.printMethod(method, ctx) + '\\n');\n }\n }\n return stack.join('');\n },\n findMethod: function(classAndMethodString) {\n // classAndMethodString is 'Class>>method'\n var found,\n className = classAndMethodString.split('>>')[0],\n methodName = classAndMethodString.split('>>')[1];\n this.allMethodsDo(function(classObj, methodObj, selectorObj) {\n if (methodName.length == selectorObj.bytesSize()\n && methodName == selectorObj.bytesAsString()\n && className == classObj.className())\n return found = methodObj;\n });\n return found;\n },\n breakNow: function(msg) {\n if (msg) console.log(\"Break: \" + msg);\n this.breakOutOfInterpreter = 'break';\n },\n breakOn: function(classAndMethodString) {\n // classAndMethodString is 'Class>>method'\n return this.breakOnMethod = classAndMethodString && this.findMethod(classAndMethodString);\n },\n breakOnReturnFromThisContext: function() {\n this.breakOnContextChanged = false;\n this.breakOnContextReturned = this.activeContext;\n },\n breakOnSendOrReturn: function() {\n this.breakOnContextChanged = true;\n this.breakOnContextReturned = null;\n },\n printActiveContext: function() {\n // temps and stack in current context\n var ctx = this.activeContext;\n var isBlock = typeof ctx.pointers[Squeak.BlockContext_argumentCount] === 'number';\n var closure = ctx.pointers[Squeak.Context_closure];\n var isClosure = !isBlock && !closure.isNil;\n var homeCtx = isBlock ? ctx.pointers[Squeak.BlockContext_home] : ctx;\n var tempCount = isClosure\n ? closure.pointers[Squeak.Closure_numArgs]\n : homeCtx.pointers[Squeak.Context_method].methodTempCount();\n var stackBottom = this.decodeSqueakSP(0);\n var stackTop = homeCtx.contextSizeWithStack(this) - 1;\n var firstTemp = stackBottom + 1;\n var lastTemp = firstTemp + tempCount - 1;\n var stack = '';\n for (var i = stackBottom; i <= stackTop; i++) {\n var obj = homeCtx.pointers[i];\n var value = obj.sqInstName ? obj.sqInstName() : obj.toString();\n var label = '';\n if (i == stackBottom) label = '=rcvr'; else\n if (i <= lastTemp) label = '=tmp' + (i - firstTemp);\n stack += '\\nctx[' + i + ']' + label +': ' + value;\n }\n if (isBlock) {\n stack += '\\n';\n var nArgs = ctx.pointers[3];\n var firstArg = this.decodeSqueakSP(1);\n var lastArg = firstArg + nArgs;\n for (var i = firstArg; i <= this.sp; i++) {\n var obj = ctx.pointers[i];\n var value = obj.sqInstName ? obj.sqInstName() : obj.toString();\n var label = '';\n if (i <= lastArg) label = '=arg' + (i - firstArg);\n stack += '\\nblk[' + i + ']' + label +': ' + value;\n }\n }\n return stack;\n },\n printAllProcesses: function() {\n var schedAssn = this.specialObjects[Squeak.splOb_SchedulerAssociation],\n sched = schedAssn.pointers[Squeak.Assn_value];\n // print active process\n var activeProc = sched.pointers[Squeak.ProcSched_activeProcess],\n result = \"Active: \" + this.printProcess(activeProc, true);\n // print other runnable processes\n var lists = sched.pointers[Squeak.ProcSched_processLists].pointers;\n for (var priority = lists.length - 1; priority >= 0; priority--) {\n var process = lists[priority].pointers[Squeak.LinkedList_firstLink];\n while (!process.isNil) {\n result += \"\\nRunnable: \" + this.printProcess(process);\n process = process.pointers[Squeak.Link_nextLink];\n }\n }\n // print all processes waiting on a semaphore\n var semaClass = this.specialObjects[Squeak.splOb_ClassSemaphore],\n sema = this.image.someInstanceOf(semaClass);\n while (sema) {\n var process = sema.pointers[Squeak.LinkedList_firstLink];\n while (!process.isNil) {\n result += \"\\nWaiting: \" + this.printProcess(process);\n process = process.pointers[Squeak.Link_nextLink];\n }\n sema = this.image.nextInstanceAfter(sema);\n }\n return result;\n },\n printProcess: function(process, active) {\n var context = process.pointers[Squeak.Proc_suspendedContext],\n priority = process.pointers[Squeak.Proc_priority],\n stack = this.printStack(active ? null : context);\n return process.toString() +\" at priority \" + priority + \"\\n\" + stack;\n },\n printByteCodes: function(aMethod, optionalIndent, optionalHighlight, optionalPC) {\n if (!aMethod) aMethod = this.method;\n var printer = new Squeak.InstructionPrinter(aMethod, this);\n return printer.printInstructions(optionalIndent, optionalHighlight, optionalPC);\n },\n willSendOrReturn: function() {\n // Answer whether the next bytecode corresponds to a Smalltalk\n // message send or return\n var byte = this.method.bytes[this.pc];\n if (byte >= 120 && byte <= 125) return true; // return\n if (byte < 131 || byte == 200) return false;\n if (byte >= 176) return true; // special send or short send\n if (byte <= 134) { // long sends\n // long form support demands we check the selector\n var litIndex;\n if (byte === 132) {\n if ((this.method.bytes[this.pc + 1] >> 5) > 1) return false;\n litIndex = this.method.bytes[this.pc + 2];\n } else\n litIndex = this.method.bytes[this.pc + 1] & (byte === 134 ? 63 : 31);\n var selectorObj = this.method.pointers[litIndex + 1];\n if (selectorObj.bytesAsString() != 'blockCopy:') return true;\n }\n return false;\n },\n});\n\nObject.subclass('Squeak.Primitives',\n'initialization', {\n initialize: function(vm, display) {\n this.vm = vm;\n this.display = display;\n this.display.vm = this.vm;\n this.oldPrims = !this.vm.image.hasClosures;\n this.allowAccessBeyondSP = this.oldPrims;\n this.deferDisplayUpdates = false;\n this.semaphoresToSignal = [];\n this.initDisplay();\n this.initAtCache();\n this.initModules();\n },\n initModules: function() {\n this.loadedModules = {};\n this.builtinModules = {\n JavaScriptPlugin: this.findPluginFunctions(\"js_\", \"\", true),\n FilePlugin: this.findPluginFunctions(\"\", \"primitive(Disable)?(File|Directory)\"),\n DropPlugin: this.findPluginFunctions(\"\", \"primitiveDropRequest\"),\n SoundPlugin: this.findPluginFunctions(\"snd_\"),\n JPEGReadWriter2Plugin: this.findPluginFunctions(\"jpeg2_\"),\n SecurityPlugin: {\n primitiveDisableImageWrite: this.fakePrimitive.bind(this, \"SecurityPlugin.primitiveDisableImageWrite\", 0),\n },\n };\n this.patchModules = {\n ScratchPlugin: this.findPluginFunctions(\"scratch_\"),\n };\n this.interpreterProxy = new Squeak.InterpreterProxy(this.vm);\n },\n findPluginFunctions: function(prefix, match, bindLate) {\n match = match || \"(initialise|shutdown|prim)\";\n var plugin = {},\n regex = new RegExp(\"^\" + prefix + match, \"i\");\n for (var funcName in this)\n if (regex.test(funcName) && typeof this[funcName] == \"function\") {\n var primName = funcName;\n if (prefix) primName = funcName[prefix.length].toLowerCase() + funcName.slice(prefix.length + 1);\n plugin[primName] = bindLate ? funcName : this[funcName].bind(this);\n }\n return plugin;\n },\n initDisplay: function() {\n this.indexedColors = [\n 0xFFFFFFFF, 0xFF000001, 0xFFFFFFFF, 0xFF808080, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFF00FFFF,\n 0xFFFFFF00, 0xFFFF00FF, 0xFF202020, 0xFF404040, 0xFF606060, 0xFF9F9F9F, 0xFFBFBFBF, 0xFFDFDFDF,\n 0xFF080808, 0xFF101010, 0xFF181818, 0xFF282828, 0xFF303030, 0xFF383838, 0xFF484848, 0xFF505050,\n 0xFF585858, 0xFF686868, 0xFF707070, 0xFF787878, 0xFF878787, 0xFF8F8F8F, 0xFF979797, 0xFFA7A7A7,\n 0xFFAFAFAF, 0xFFB7B7B7, 0xFFC7C7C7, 0xFFCFCFCF, 0xFFD7D7D7, 0xFFE7E7E7, 0xFFEFEFEF, 0xFFF7F7F7,\n 0xFF000001, 0xFF003300, 0xFF006600, 0xFF009900, 0xFF00CC00, 0xFF00FF00, 0xFF000033, 0xFF003333,\n 0xFF006633, 0xFF009933, 0xFF00CC33, 0xFF00FF33, 0xFF000066, 0xFF003366, 0xFF006666, 0xFF009966,\n 0xFF00CC66, 0xFF00FF66, 0xFF000099, 0xFF003399, 0xFF006699, 0xFF009999, 0xFF00CC99, 0xFF00FF99,\n 0xFF0000CC, 0xFF0033CC, 0xFF0066CC, 0xFF0099CC, 0xFF00CCCC, 0xFF00FFCC, 0xFF0000FF, 0xFF0033FF,\n 0xFF0066FF, 0xFF0099FF, 0xFF00CCFF, 0xFF00FFFF, 0xFF330000, 0xFF333300, 0xFF336600, 0xFF339900,\n 0xFF33CC00, 0xFF33FF00, 0xFF330033, 0xFF333333, 0xFF336633, 0xFF339933, 0xFF33CC33, 0xFF33FF33,\n 0xFF330066, 0xFF333366, 0xFF336666, 0xFF339966, 0xFF33CC66, 0xFF33FF66, 0xFF330099, 0xFF333399,\n 0xFF336699, 0xFF339999, 0xFF33CC99, 0xFF33FF99, 0xFF3300CC, 0xFF3333CC, 0xFF3366CC, 0xFF3399CC,\n 0xFF33CCCC, 0xFF33FFCC, 0xFF3300FF, 0xFF3333FF, 0xFF3366FF, 0xFF3399FF, 0xFF33CCFF, 0xFF33FFFF,\n 0xFF660000, 0xFF663300, 0xFF666600, 0xFF669900, 0xFF66CC00, 0xFF66FF00, 0xFF660033, 0xFF663333,\n 0xFF666633, 0xFF669933, 0xFF66CC33, 0xFF66FF33, 0xFF660066, 0xFF663366, 0xFF666666, 0xFF669966,\n 0xFF66CC66, 0xFF66FF66, 0xFF660099, 0xFF663399, 0xFF666699, 0xFF669999, 0xFF66CC99, 0xFF66FF99,\n 0xFF6600CC, 0xFF6633CC, 0xFF6666CC, 0xFF6699CC, 0xFF66CCCC, 0xFF66FFCC, 0xFF6600FF, 0xFF6633FF,\n 0xFF6666FF, 0xFF6699FF, 0xFF66CCFF, 0xFF66FFFF, 0xFF990000, 0xFF993300, 0xFF996600, 0xFF999900,\n 0xFF99CC00, 0xFF99FF00, 0xFF990033, 0xFF993333, 0xFF996633, 0xFF999933, 0xFF99CC33, 0xFF99FF33,\n 0xFF990066, 0xFF993366, 0xFF996666, 0xFF999966, 0xFF99CC66, 0xFF99FF66, 0xFF990099, 0xFF993399,\n 0xFF996699, 0xFF999999, 0xFF99CC99, 0xFF99FF99, 0xFF9900CC, 0xFF9933CC, 0xFF9966CC, 0xFF9999CC,\n 0xFF99CCCC, 0xFF99FFCC, 0xFF9900FF, 0xFF9933FF, 0xFF9966FF, 0xFF9999FF, 0xFF99CCFF, 0xFF99FFFF,\n 0xFFCC0000, 0xFFCC3300, 0xFFCC6600, 0xFFCC9900, 0xFFCCCC00, 0xFFCCFF00, 0xFFCC0033, 0xFFCC3333,\n 0xFFCC6633, 0xFFCC9933, 0xFFCCCC33, 0xFFCCFF33, 0xFFCC0066, 0xFFCC3366, 0xFFCC6666, 0xFFCC9966,\n 0xFFCCCC66, 0xFFCCFF66, 0xFFCC0099, 0xFFCC3399, 0xFFCC6699, 0xFFCC9999, 0xFFCCCC99, 0xFFCCFF99,\n 0xFFCC00CC, 0xFFCC33CC, 0xFFCC66CC, 0xFFCC99CC, 0xFFCCCCCC, 0xFFCCFFCC, 0xFFCC00FF, 0xFFCC33FF,\n 0xFFCC66FF, 0xFFCC99FF, 0xFFCCCCFF, 0xFFCCFFFF, 0xFFFF0000, 0xFFFF3300, 0xFFFF6600, 0xFFFF9900,\n 0xFFFFCC00, 0xFFFFFF00, 0xFFFF0033, 0xFFFF3333, 0xFFFF6633, 0xFFFF9933, 0xFFFFCC33, 0xFFFFFF33,\n 0xFFFF0066, 0xFFFF3366, 0xFFFF6666, 0xFFFF9966, 0xFFFFCC66, 0xFFFFFF66, 0xFFFF0099, 0xFFFF3399,\n 0xFFFF6699, 0xFFFF9999, 0xFFFFCC99, 0xFFFFFF99, 0xFFFF00CC, 0xFFFF33CC, 0xFFFF66CC, 0xFFFF99CC,\n 0xFFFFCCCC, 0xFFFFFFCC, 0xFFFF00FF, 0xFFFF33FF, 0xFFFF66FF, 0xFFFF99FF, 0xFFFFCCFF, 0xFFFFFFFF];\n },\n},\n'dispatch', {\n quickSendOther: function(rcvr, lobits) {\n // returns true if it succeeds\n this.success = true;\n switch (lobits) {\n case 0x0: return this.popNandPushIfOK(2, this.objectAt(true,true,false)); // at:\n case 0x1: return this.popNandPushIfOK(3, this.objectAtPut(true,true,false)); // at:put:\n case 0x2: return this.popNandPushIfOK(1, this.objectSize(true)); // size\n //case 0x3: return false; // next\n //case 0x4: return false; // nextPut:\n //case 0x5: return false; // atEnd\n case 0x6: return this.pop2andPushBoolIfOK(this.vm.stackValue(1) === this.vm.stackValue(0)); // ==\n case 0x7: return this.popNandPushIfOK(1,this.vm.getClass(this.vm.top())); // class\n case 0x8: return this.popNandPushIfOK(2,this.doBlockCopy()); // blockCopy:\n case 0x9: return this.primitiveBlockValue(0); // value\n case 0xA: return this.primitiveBlockValue(1); // value:\n //case 0xB: return false; // do:\n //case 0xC: return false; // new\n //case 0xD: return false; // new:\n //case 0xE: return false; // x\n //case 0xF: return false; // y\n }\n return false;\n },\n doPrimitive: function(index, argCount, primMethod) {\n this.success = true;\n if (index < 128) // Chrome only optimized up to 128 cases\n switch (index) {\n // Integer Primitives (0-19)\n case 1: return this.popNandPushIntIfOK(2,this.stackInteger(1) + this.stackInteger(0)); // Integer.add\n case 2: return this.popNandPushIntIfOK(2,this.stackInteger(1) - this.stackInteger(0)); // Integer.subtract\n case 3: return this.pop2andPushBoolIfOK(this.stackInteger(1) < this.stackInteger(0)); // Integer.less\n case 4: return this.pop2andPushBoolIfOK(this.stackInteger(1) > this.stackInteger(0)); // Integer.greater\n case 5: return this.pop2andPushBoolIfOK(this.stackInteger(1) <= this.stackInteger(0)); // Integer.leq\n case 6: return this.pop2andPushBoolIfOK(this.stackInteger(1) >= this.stackInteger(0)); // Integer.geq\n case 7: return this.pop2andPushBoolIfOK(this.stackInteger(1) === this.stackInteger(0)); // Integer.equal\n case 8: return this.pop2andPushBoolIfOK(this.stackInteger(1) !== this.stackInteger(0)); // Integer.notequal\n case 9: return this.popNandPushIntIfOK(2,this.stackInteger(1) * this.stackInteger(0)); // Integer.multiply *\n case 10: return this.popNandPushIntIfOK(2,this.vm.quickDivide(this.stackInteger(1),this.stackInteger(0))); // Integer.divide / (fails unless exact)\n case 11: return this.popNandPushIntIfOK(2,this.vm.mod(this.stackInteger(1),this.stackInteger(0))); // Integer.mod \\\\\n case 12: return this.popNandPushIntIfOK(2,this.vm.div(this.stackInteger(1),this.stackInteger(0))); // Integer.div //\n case 13: return this.popNandPushIntIfOK(2,this.stackInteger(1) / this.stackInteger(0) | 0); // Integer.quo\n case 14: return this.popNandPushIfOK(2,this.doBitAnd()); // SmallInt.bitAnd\n case 15: return this.popNandPushIfOK(2,this.doBitOr()); // SmallInt.bitOr\n case 16: return this.popNandPushIfOK(2,this.doBitXor()); // SmallInt.bitXor\n case 17: return this.popNandPushIfOK(2,this.doBitShift()); // SmallInt.bitShift\n case 18: return this.primitiveMakePoint(argCount, false);\n case 19: return false; // Guard primitive for simulation -- *must* fail\n // LargeInteger Primitives (20-39)\n // 32-bit logic is aliased to Integer prims above\n case 20: return false; // primitiveRemLargeIntegers\n case 21: return false; // primitiveAddLargeIntegers\n case 22: return false; // primitiveSubtractLargeIntegers\n case 23: return this.primitiveLessThanLargeIntegers();\n case 24: return this.primitiveGreaterThanLargeIntegers();\n case 25: return this.primitiveLessOrEqualLargeIntegers();\n case 26: return this.primitiveGreaterOrEqualLargeIntegers();\n case 27: return this.primitiveEqualLargeIntegers();\n case 28: return this.primitiveNotEqualLargeIntegers();\n case 29: return false; // primitiveMultiplyLargeIntegers\n case 30: return false; // primitiveDivideLargeIntegers\n case 31: return false; // primitiveModLargeIntegers\n case 32: return false; // primitiveDivLargeIntegers\n case 33: return false; // primitiveQuoLargeIntegers\n case 34: return false; // primitiveBitAndLargeIntegers\n case 35: return false; // primitiveBitOrLargeIntegers\n case 36: return false; // primitiveBitXorLargeIntegers\n case 37: return false; // primitiveBitShiftLargeIntegers\n case 38: return this.popNandPushIfOK(2, this.objectAt(false,false,false)); // Float basicAt\n case 39: return this.popNandPushIfOK(3, this.objectAtPut(false,false,false)); // Float basicAtPut\n // Float Primitives (40-59)\n case 40: return this.popNandPushFloatIfOK(1,this.stackInteger(0)); // primitiveAsFloat\n case 41: return this.popNandPushFloatIfOK(2,this.stackFloat(1)+this.stackFloat(0)); // Float +\n case 42: return this.popNandPushFloatIfOK(2,this.stackFloat(1)-this.stackFloat(0)); // Float -\n case 43: return this.pop2andPushBoolIfOK(this.stackFloat(1)this.stackFloat(0)); // Float >\n case 45: return this.pop2andPushBoolIfOK(this.stackFloat(1)<=this.stackFloat(0)); // Float <=\n case 46: return this.pop2andPushBoolIfOK(this.stackFloat(1)>=this.stackFloat(0)); // Float >=\n case 47: return this.pop2andPushBoolIfOK(this.stackFloat(1)===this.stackFloat(0)); // Float =\n case 48: return this.pop2andPushBoolIfOK(this.stackFloat(1)!==this.stackFloat(0)); // Float !=\n case 49: return this.popNandPushFloatIfOK(2,this.stackFloat(1)*this.stackFloat(0)); // Float.mul\n case 50: return this.popNandPushFloatIfOK(2,this.safeFDiv(this.stackFloat(1),this.stackFloat(0))); // Float.div\n case 51: return this.popNandPushIfOK(1,this.floatAsSmallInt(this.stackFloat(0))); // Float.asInteger\n case 52: return false; // Float.fractionPart (modf)\n case 53: return this.popNandPushIntIfOK(1, this.frexp_exponent(this.stackFloat(0)) - 1); // Float.exponent\n case 54: return this.popNandPushFloatIfOK(2, this.ldexp(this.stackFloat(1), this.stackFloat(0))); // Float.timesTwoPower\n case 55: return this.popNandPushFloatIfOK(1, Math.sqrt(this.stackFloat(0))); // SquareRoot\n case 56: return this.popNandPushFloatIfOK(1, Math.sin(this.stackFloat(0))); // Sine\n case 57: return this.popNandPushFloatIfOK(1, Math.atan(this.stackFloat(0))); // Arctan\n case 58: return this.popNandPushFloatIfOK(1, Math.log(this.stackFloat(0))); // LogN\n case 59: return this.popNandPushFloatIfOK(1, Math.exp(this.stackFloat(0))); // Exp\n // Subscript and Stream Primitives (60-67)\n case 60: return this.popNandPushIfOK(2, this.objectAt(false,false,false)); // basicAt:\n case 61: return this.popNandPushIfOK(3, this.objectAtPut(false,false,false)); // basicAt:put:\n case 62: return this.popNandPushIfOK(1, this.objectSize(false)); // size\n case 63: return this.popNandPushIfOK(2, this.objectAt(false,true,false)); // String.basicAt:\n case 64: return this.popNandPushIfOK(3, this.objectAtPut(false,true,false)); // String.basicAt:put:\n case 65: return false; // primitiveNext\n case 66: return false; // primitiveNextPut\n case 67: return false; // primitiveAtEnd\n // StorageManagement Primitives (68-79)\n case 68: return this.popNandPushIfOK(2, this.objectAt(false,false,true)); // Method.objectAt:\n case 69: return this.popNandPushIfOK(3, this.objectAtPut(false,false,true)); // Method.objectAt:put:\n case 70: return this.popNandPushIfOK(1, this.instantiateClass(this.stackNonInteger(0), 0)); // Class.new\n case 71: return this.popNandPushIfOK(2, this.instantiateClass(this.stackNonInteger(1), this.stackPos32BitInt(0))); // Class.new:\n case 72: return this.primitiveArrayBecome(argCount, false); // one way\n case 73: return this.popNandPushIfOK(2, this.objectAt(false,false,true)); // instVarAt:\n case 74: return this.popNandPushIfOK(3, this.objectAtPut(false,false,true)); // instVarAt:put:\n case 75: return this.popNandPushIfOK(1, this.stackNonInteger(0).hash); // Object.identityHash\n case 76: return this.primitiveStoreStackp(argCount); // (Blue Book: primitiveAsObject)\n case 77: return this.popNandPushIfOK(1, this.someInstanceOf(this.stackNonInteger(0))); // Class.someInstance\n case 78: return this.popNandPushIfOK(1, this.nextInstanceAfter(this.stackNonInteger(0))); // Object.nextInstance\n case 79: return this.primitiveNewMethod(argCount); // Compiledmethod.new\n // Control Primitives (80-89)\n case 80: return this.popNandPushIfOK(2,this.doBlockCopy()); // blockCopy:\n case 81: return this.primitiveBlockValue(argCount); // BlockContext.value\n case 82: return this.primitiveBlockValueWithArgs(argCount); // BlockContext.valueWithArguments:\n case 83: return this.vm.primitivePerform(argCount); // Object.perform:(with:)*\n case 84: return this.vm.primitivePerformWithArgs(argCount, false); // Object.perform:withArguments:\n case 85: return this.primitiveSignal(); // Semaphore.wait\n case 86: return this.primitiveWait(); // Semaphore.wait\n case 87: return this.primitiveResume(); // Process.resume\n case 88: return this.primitiveSuspend(); // Process.suspend\n case 89: return this.vm.flushMethodCache(); //primitiveFlushCache\n // Input/Output Primitives (90-109)\n case 90: return this.primitiveMousePoint(argCount); // mousePoint\n case 91: return this.primitiveTestDisplayDepth(argCount); // cursorLocPut in old images\n // case 92: return false; // primitiveSetDisplayMode\n case 93: return this.primitiveInputSemaphore(argCount);\n case 94: return this.primitiveGetNextEvent(argCount);\n case 95: return this.primitiveInputWord(argCount);\n case 96: return this.namedPrimitive('BitBltPlugin', 'primitiveCopyBits', argCount);\n case 97: return this.primitiveSnapshot(argCount);\n //case 98: return false; // primitiveStoreImageSegment\n case 99: return this.primitiveLoadImageSegment(argCount);\n case 100: return this.vm.primitivePerformWithArgs(argCount, true); // Object.perform:withArguments:inSuperclass: (Blue Book: primitiveSignalAtTick)\n case 101: return this.primitiveBeCursor(argCount); // Cursor.beCursor\n case 102: return this.primitiveBeDisplay(argCount); // DisplayScreen.beDisplay\n case 103: return false; // primitiveScanCharacters\n case 104: return false; // primitiveDrawLoop\n case 105: return this.popNandPushIfOK(5, this.doStringReplace()); // string and array replace\n case 106: return this.primitiveScreenSize(argCount); // actualScreenSize\n case 107: return this.primitiveMouseButtons(argCount); // Sensor mouseButtons\n case 108: return this.primitiveKeyboardNext(argCount); // Sensor kbdNext\n case 109: return this.primitiveKeyboardPeek(argCount); // Sensor kbdPeek\n // System Primitives (110-119)\n case 110: return this.pop2andPushBoolIfOK(this.vm.stackValue(1) === this.vm.stackValue(0)); // ==\n case 111: return this.popNandPushIfOK(1, this.vm.getClass(this.vm.top())); // Object.class\n case 112: return this.popNandPushIfOK(1, this.vm.image.bytesLeft()); //primitiveBytesLeft\n case 113: return this.primitiveQuit(argCount);\n case 114: return this.primitiveExitToDebugger(argCount);\n case 115: return this.primitiveChangeClass(argCount);\n case 116: return this.vm.flushMethodCacheForMethod(this.vm.top()); // after Squeak 2.2 uses 119\n case 117: return this.doNamedPrimitive(argCount, primMethod); // named prims\n case 118: return this.primitiveDoPrimitiveWithArgs(argCount);\n case 119: return this.vm.flushMethodCacheForSelector(this.vm.top()); // before Squeak 2.3 uses 116\n // Miscellaneous Primitives (120-149)\n case 120: return false; //primitiveCalloutToFFI\n case 121: return this.primitiveImageName(argCount); //get+set imageName\n case 122: return this.primitiveReverseDisplay(argCount); // Blue Book: primitiveImageVolume\n //case 123: return false; //TODO primitiveValueUninterruptably\n case 124: return this.popNandPushIfOK(2, this.registerSemaphore(Squeak.splOb_TheLowSpaceSemaphore));\n case 125: return this.popNandPushIfOK(2, this.setLowSpaceThreshold());\n case 126: return this.primitiveDeferDisplayUpdates(argCount);\n case 127: return this.primitiveShowDisplayRect(argCount);\n } else if (index < 256) switch (index) { // Chrome only optimized up to 128 cases\n case 128: return this.primitiveArrayBecome(argCount, true); // both ways\n case 129: return this.popNandPushIfOK(1, this.vm.image.specialObjectsArray); //specialObjectsOop\n case 130: return this.primitiveFullGC(argCount);\n case 131: return this.popNandPushIfOK(1, this.vm.image.partialGC()); // GCmost\n case 132: return this.pop2andPushBoolIfOK(this.pointsTo(this.stackNonInteger(1), this.vm.top())); //Object.pointsTo\n case 133: return true; //TODO primitiveSetInterruptKey\n case 134: return this.popNandPushIfOK(2, this.registerSemaphore(Squeak.splOb_TheInterruptSemaphore));\n case 135: return this.popNandPushIfOK(1, this.millisecondClockValue());\n case 136: return this.primitiveSignalAtMilliseconds(argCount); //Delay signal:atMs:());\n case 137: return this.popNandPushIfOK(1, this.secondClock()); // seconds since Jan 1, 1901\n case 138: return this.popNandPushIfOK(1, this.someObject()); // Object.someObject\n case 139: return this.popNandPushIfOK(1, this.nextObject(this.vm.top())); // Object.nextObject\n case 140: return this.primitiveBeep(argCount);\n case 141: return this.primitiveClipboardText(argCount);\n case 142: return this.popNandPushIfOK(1, this.makeStString(this.filenameToSqueak(Squeak.vmPath)));\n case 143: // short at and shortAtPut\n case 144: return this.primitiveShortAtAndPut(argCount);\n case 145: return this.primitiveConstantFill(argCount);\n case 146: return this.namedPrimitive('JoystickTabletPlugin', 'primitiveReadJoystick', argCount);\n case 147: return this.namedPrimitive('BitBltPlugin', 'primitiveWarpBits', argCount);\n case 148: return this.popNandPushIfOK(1, this.vm.image.clone(this.vm.top())); //shallowCopy\n case 149: return this.primitiveGetAttribute(argCount);\n // File Primitives (150-169)\n case 150: if (this.oldPrims) return this.primitiveFileAtEnd(argCount);\n case 151: if (this.oldPrims) return this.primitiveFileClose(argCount);\n case 152: if (this.oldPrims) return this.primitiveFileGetPosition(argCount);\n case 153: if (this.oldPrims) return this.primitiveFileOpen(argCount);\n case 154: if (this.oldPrims) return this.primitiveFileRead(argCount);\n case 155: if (this.oldPrims) return this.primitiveFileSetPosition(argCount);\n case 156: if (this.oldPrims) return this.primitiveFileDelete(argCount);\n case 157: if (this.oldPrims) return this.primitiveFileSize(argCount);\n case 158: if (this.oldPrims) return this.primitiveFileWrite(argCount);\n case 159: if (this.oldPrims) return this.primitiveFileRename(argCount);\n case 160: if (this.oldPrims) return this.primitiveDirectoryCreate(argCount); // new: primitiveAdoptInstance\n case 161: if (this.oldPrims) return this.primitiveDirectoryDelimitor(argCount); // new: primitiveSetIdentityHash\n case 162: if (this.oldPrims) return this.primitiveDirectoryLookup(argCount);\n case 163: if (this.oldPrims) return this.primitiveDirectoryDelete(argCount);\n break; // fail 150-163 if fell through\n // 164: unused\n case 165:\n case 166: return this.primitiveIntegerAtAndPut(argCount);\n case 167: return false; // Processor.yield\n case 168: return this.primitiveCopyObject(argCount);\n case 169: if (this.oldPrims) return this.primitiveDirectorySetMacTypeAndCreator(argCount);\n else return this.primitiveNotIdentical(argCount);\n // Sound Primitives (170-199)\n case 170: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundStart', argCount);\n case 171: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundStartWithSemaphore', argCount);\n case 172: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundStop', argCount);\n case 173: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundAvailableSpace', argCount);\n case 174: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundPlaySamples', argCount);\n case 175: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundPlaySilence', argCount);\n case 176: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primWaveTableSoundmixSampleCountintostartingAtpan', argCount);\n case 177: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primFMSoundmixSampleCountintostartingAtpan', argCount);\n case 178: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primPluckedSoundmixSampleCountintostartingAtpan', argCount);\n case 179: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primSampledSoundmixSampleCountintostartingAtpan', argCount);\n case 180: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primitiveMixFMSound', argCount);\n case 181: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primitiveMixPluckedSound', argCount);\n case 182: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'oldprimSampledSoundmixSampleCountintostartingAtleftVolrightVol', argCount);\n case 183: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primitiveApplyReverb', argCount);\n case 184: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primitiveMixLoopedSampledSound', argCount);\n case 185: if (this.oldPrims) return this.namedPrimitive('SoundGenerationPlugin', 'primitiveMixSampledSound', argCount);\n break; // fail 170-185 if fell through\n // 186-188: was unused\n case 188: if (!this.oldPrims) return this.primitiveExecuteMethodArgsArray(argCount);\n break; // fail 188 if fell through\n case 189: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundInsertSamples', argCount);\n case 190: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundStartRecording', argCount);\n case 191: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundStopRecording', argCount);\n case 192: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundGetRecordingSampleRate', argCount);\n case 193: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundRecordSamples', argCount);\n case 194: if (this.oldPrims) return this.namedPrimitive('SoundPlugin', 'primitiveSoundSetRecordLevel', argCount);\n break; // fail 189-194 if fell through\n case 195: return false; // Context.findNextUnwindContextUpTo:\n case 196: return false; // Context.terminateTo:\n case 197: return false; // Context.findNextHandlerContextStarting\n case 198: return false; // MarkUnwindMethod (must fail)\n case 199: return false; // MarkHandlerMethod (must fail)\n // Networking Primitives (200-229)\n case 200: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveInitializeNetwork', argCount);\n else return this.primitiveClosureCopyWithCopiedValues(argCount);\n case 201: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveResolverStartNameLookup', argCount);\n else return this.primitiveClosureValue(argCount);\n case 202: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveResolverNameLookupResult', argCount);\n else return this.primitiveClosureValue(argCount);\n case 203: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveResolverStartAddressLookup', argCount);\n else return this.primitiveClosureValue(argCount);\n case 204: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveResolverAddressLookupResult', argCount);\n else return this.primitiveClosureValue(argCount);\n case 205: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveResolverAbortLookup', argCount);\n else return this.primitiveClosureValue(argCount);\n case 206: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveResolverLocalAddress', argCount);\n else return this.primitiveClosureValueWithArgs(argCount);\n case 207: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveResolverStatus', argCount);\n case 208: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveResolverError', argCount);\n case 209: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketCreate', argCount);\n break; // fail 207-209 if fell through\n case 210: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketDestroy', argCount);\n else return this.popNandPushIfOK(2, this.objectAt(false,false,false)); // contextAt:\n case 211: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketConnectionStatus', argCount);\n else return this.popNandPushIfOK(3, this.objectAtPut(false,false,false)); // contextAt:put:\n case 212: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketError', argCount);\n else return this.popNandPushIfOK(1, this.objectSize(false)); // contextSize\n case 213: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketLocalAddress', argCount);\n case 214: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketLocalPort', argCount);\n case 215: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketRemoteAddress', argCount);\n case 216: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketRemotePort', argCount);\n case 217: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketConnectToPort', argCount);\n case 218: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketListenOnPort', argCount);\n case 219: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketCloseConnection', argCount);\n case 220: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketAbortConnection', argCount);\n break; // fail 212-220 if fell through\n case 221: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketReceiveDataBufCount', argCount);\n else return this.primitiveClosureValueNoContextSwitch(argCount);\n case 222: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketReceiveDataAvailable', argCount);\n else return this.primitiveClosureValueNoContextSwitch(argCount);\n case 223: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketSendDataBufCount', argCount);\n case 224: if (this.oldPrims) return this.namedPrimitive('SocketPlugin', 'primitiveSocketSendDone', argCount);\n break; // fail 223-229 if fell through\n // 225-229: unused\n // Other Primitives (230-249)\n case 230: return this.primitiveRelinquishProcessorForMicroseconds(argCount);\n case 231: return this.primitiveForceDisplayUpdate(argCount);\n // case 232: return this.primitiveFormPrint(argCount);\n case 233: return this.primitiveSetFullScreen(argCount);\n case 234: if (this.oldPrims) return this.namedPrimitive('MiscPrimitivePlugin', 'primitiveDecompressFromByteArray', argCount);\n case 235: if (this.oldPrims) return this.namedPrimitive('MiscPrimitivePlugin', 'primitiveCompareString', argCount);\n case 236: if (this.oldPrims) return this.namedPrimitive('MiscPrimitivePlugin', 'primitiveConvert8BitSigned', argCount);\n case 237: if (this.oldPrims) return this.namedPrimitive('MiscPrimitivePlugin', 'primitiveCompressToByteArray', argCount);\n case 238: if (this.oldPrims) return this.namedPrimitive('SerialPlugin', 'primitiveSerialPortOpen', argCount);\n case 239: if (this.oldPrims) return this.namedPrimitive('SerialPlugin', 'primitiveSerialPortClose', argCount);\n break; // fail 234-239 if fell through\n case 240: if (this.oldPrims) return this.namedPrimitive('SerialPlugin', 'primitiveSerialPortWrite', argCount);\n else return this.popNandPushIfOK(1, this.microsecondClockUTC());\n case 241: if (this.oldPrims) return this.namedPrimitive('SerialPlugin', 'primitiveSerialPortRead', argCount);\n else return this.popNandPushIfOK(1, this.microsecondClockLocal());\n // 242: unused\n case 243: if (this.oldPrims) return this.namedPrimitive('MiscPrimitivePlugin', 'primitiveTranslateStringWithTable', argCount);\n case 244: if (this.oldPrims) return this.namedPrimitive('MiscPrimitivePlugin', 'primitiveFindFirstInString' , argCount);\n case 245: if (this.oldPrims) return this.namedPrimitive('MiscPrimitivePlugin', 'primitiveIndexOfAsciiInString', argCount);\n case 246: if (this.oldPrims) return this.namedPrimitive('MiscPrimitivePlugin', 'primitiveFindSubstring', argCount);\n break; // fail 243-246 if fell through\n // 247: unused\n case 248: return this.vm.primitiveInvokeObjectAsMethod(argCount, primMethod); // see findSelectorInClass()\n case 249: return this.primitiveArrayBecome(argCount, false); // one way, opt. copy hash\n case 254: return this.primitiveVMParameter(argCount);\n } else switch (index) { // Chrome only optimized up to 128 cases\n //MIDI Primitives (520-539)\n case 521: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIClosePort', argCount);\n case 522: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIGetClock', argCount);\n case 523: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIGetPortCount', argCount);\n case 524: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIGetPortDirectionality', argCount);\n case 525: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIGetPortName', argCount);\n case 526: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIOpenPort', argCount);\n case 527: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIParameterGetOrSet', argCount);\n case 528: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIRead', argCount);\n case 529: return this.namedPrimitive('MIDIPlugin', 'primitiveMIDIWrite', argCount);\n // 530-539: reserved for extended MIDI primitives\n // Sound Codec Primitives\n case 550: return this.namedPrimitive('ADPCMCodecPlugin', 'primitiveDecodeMono', argCount);\n case 551: return this.namedPrimitive('ADPCMCodecPlugin', 'primitiveDecodeStereo', argCount);\n case 552: return this.namedPrimitive('ADPCMCodecPlugin', 'primitiveEncodeMono', argCount);\n case 553: return this.namedPrimitive('ADPCMCodecPlugin', 'primitiveEncodeStereo', argCount);\n // External primitive support primitives (570-574)\n // case 570: return this.primitiveFlushExternalPrimitives(argCount);\n case 571: return this.primitiveUnloadModule(argCount);\n case 572: return this.primitiveListBuiltinModule(argCount);\n case 573: return this.primitiveListLoadedModule(argCount);\n }\n console.error(\"primitive \" + index + \" not implemented yet\");\n return false;\n },\n namedPrimitive: function(modName, functionName, argCount) {\n // duplicated in loadFunctionFrom()\n var mod = modName === \"\" ? this : this.loadedModules[modName];\n if (mod === undefined) { // null if earlier load failed\n mod = this.loadModule(modName);\n this.loadedModules[modName] = mod;\n }\n var result = false;\n if (mod) {\n this.interpreterProxy.argCount = argCount;\n var primitive = mod[functionName];\n if (typeof primitive === \"function\") {\n result = mod[functionName](argCount);\n } else if (typeof primitive === \"string\") {\n // allow late binding for built-ins\n result = this[primitive](argCount);\n } else {\n this.vm.warnOnce(\"missing primitive: \" + modName + \".\" + functionName);\n }\n } else {\n this.vm.warnOnce(\"missing module: \" + modName + \" (\" + functionName + \")\");\n }\n if (result === true || result === false) return result;\n return this.success;\n },\n doNamedPrimitive: function(argCount, primMethod) {\n if (primMethod.pointersSize() < 2) return false;\n var firstLiteral = primMethod.pointers[1]; // skip method header\n if (firstLiteral.pointersSize() !== 4) return false;\n this.primMethod = primMethod;\n var moduleName = firstLiteral.pointers[0].bytesAsString();\n var functionName = firstLiteral.pointers[1].bytesAsString();\n return this.namedPrimitive(moduleName, functionName, argCount);\n },\n fakePrimitive: function(prim, retVal, argCount) {\n // fake a named primitive\n // prim and retVal need to be curried when used:\n // this.fakePrimitive.bind(this, \"Module.primitive\", 42)\n this.vm.warnOnce(\"faking primitive: \" + prim);\n if (retVal === undefined) this.vm.popN(argCount);\n else this.vm.popNandPush(argCount+1, this.makeStObject(retVal));\n return true;\n },\n},\n'modules', {\n loadModule: function(modName) {\n var mod = Squeak.externalModules[modName] || this.builtinModules[modName];\n if (!mod) return null;\n if (this.patchModules[modName])\n this.patchModule(mod, modName);\n if (mod.setInterpreter) {\n if (!mod.setInterpreter(this.interpreterProxy)) {\n console.log(\"Wrong interpreter proxy version: \" + modName);\n return null;\n }\n }\n var initFunc = mod.initialiseModule;\n if (typeof initFunc === 'function') {\n mod.initialiseModule();\n } else if (typeof initFunc === 'string') {\n // allow late binding for built-ins\n this[initFunc]();\n }\n if (this.interpreterProxy.failed()) {\n console.log(\"Module initialization failed: \" + modName);\n return null;\n }\n console.log(\"Loaded module: \" + modName);\n return mod;\n },\n patchModule: function(mod, modName) {\n var patch = this.patchModules[modName];\n for (var key in patch)\n mod[key] = patch[key];\n },\n unloadModule: function(modName) {\n var mod = this.loadedModules[modName];\n if (!modName || !mod|| mod === this) return null;\n delete this.loadedModules[modName];\n var unloadFunc = mod.unloadModule;\n if (typeof unloadFunc === 'function') {\n mod.unloadModule(this);\n } else if (typeof unloadFunc === 'string') {\n // allow late binding for built-ins\n this[unloadFunc](this);\n }\n console.log(\"Unloaded module: \" + modName);\n return mod;\n },\n loadFunctionFrom: function(functionName, modName) {\n // copy of namedPrimitive() returning the bound function instead of calling it\n var mod = modName === \"\" ? this : this.loadedModules[modName];\n if (mod === undefined) { // null if earlier load failed\n mod = this.loadModule(modName);\n this.loadedModules[modName] = mod;\n }\n if (!mod) return null;\n var func = mod[functionName];\n if (typeof func === \"function\") {\n return func.bind(mod);\n } else if (typeof func === \"string\") {\n return (this[func]).bind(this);\n }\n this.vm.warnOnce(\"missing primitive: \" + modName + \".\" + functionName);\n return null;\n },\n primitiveUnloadModule: function(argCount) {\n var moduleName = this.stackNonInteger(0).bytesAsString();\n if (!moduleName) return false;\n this.unloadModule(moduleName);\n return this.popNIfOK(argCount);\n },\n primitiveListBuiltinModule: function(argCount) {\n var index = this.stackInteger(0) - 1;\n if (!this.success) return false;\n var moduleNames = Object.keys(this.builtinModules);\n return this.popNandPushIfOK(argCount + 1, this.makeStObject(moduleNames[index]));\n },\n primitiveListLoadedModule: function(argCount) {\n var index = this.stackInteger(0) - 1;\n if (!this.success) return false;\n var moduleNames = [];\n for (var key in this.loadedModules) {\n var module = this.loadedModules[key];\n if (module) {\n var moduleName = module.getModuleName ? module.getModuleName() : key;\n moduleNames.push(moduleName);\n }\n }\n return this.popNandPushIfOK(argCount + 1, this.makeStObject(moduleNames[index]));\n },\n},\n'stack access', {\n popNIfOK: function(nToPop) {\n if (!this.success) return false;\n this.vm.popN(nToPop);\n return true;\n },\n pop2andPushBoolIfOK: function(bool) {\n this.vm.success = this.success;\n return this.vm.pop2AndPushBoolResult(bool);\n },\n popNandPushIfOK: function(nToPop, returnValue) {\n if (!this.success || returnValue == null) return false;\n this.vm.popNandPush(nToPop, returnValue);\n return true;\n },\n popNandPushIntIfOK: function(nToPop, returnValue) {\n if (!this.success || !this.vm.canBeSmallInt(returnValue)) return false;\n return this.popNandPushIfOK(nToPop, returnValue);\n },\n popNandPushFloatIfOK: function(nToPop, returnValue) {\n if (!this.success) return false;\n return this.popNandPushIfOK(nToPop, this.makeFloat(returnValue));\n },\n stackNonInteger: function(nDeep) {\n return this.checkNonInteger(this.vm.stackValue(nDeep));\n },\n stackInteger: function(nDeep) {\n return this.checkSmallInt(this.vm.stackValue(nDeep));\n },\n stackPos32BitInt: function(nDeep) {\n return this.positive32BitValueOf(this.vm.stackValue(nDeep));\n },\n pos32BitIntFor: function(signed32) {\n // Return the 32-bit quantity as an unsigned 32-bit integer\n if (signed32 >= 0 && signed32 <= Squeak.MaxSmallInt) return signed32;\n var lgIntClass = this.vm.specialObjects[Squeak.splOb_ClassLargePositiveInteger],\n lgIntObj = this.vm.instantiateClass(lgIntClass, 4),\n bytes = lgIntObj.bytes;\n for (var i=0; i<4; i++)\n bytes[i] = (signed32>>>(8*i)) & 255;\n return lgIntObj;\n },\n pos64BitIntFor: function(longlong) {\n // Return the quantity as an unsigned 64-bit integer\n if (longlong <= 0xFFFFFFFF) return this.pos32BitIntFor(longlong);\n var sz = longlong <= 0xFFFFFFFFFF ? 5 :\n longlong <= 0xFFFFFFFFFFFF ? 6 :\n longlong <= 0xFFFFFFFFFFFFFF ? 7 : 8;\n var lgIntClass = this.vm.specialObjects[Squeak.splOb_ClassLargePositiveInteger],\n lgIntObj = this.vm.instantiateClass(lgIntClass, sz),\n bytes = lgIntObj.bytes;\n for (var i = 0; i < sz; i++) {\n bytes[i] = longlong & 255;\n longlong /= 256;\n }\n return lgIntObj;\n },\n stackSigned32BitInt: function(nDeep) {\n var stackVal = this.vm.stackValue(nDeep);\n if (typeof stackVal === \"number\") { // SmallInteger\n return stackVal;\n }\n if (stackVal.bytesSize() !== 4) {\n this.success = false;\n return 0;\n }\n var bytes = stackVal.bytes,\n value = 0;\n for (var i = 0, f = 1; i < 4; i++, f *= 256)\n value += bytes[i] * f;\n if (this.isA(stackVal, Squeak.splOb_ClassLargePositiveInteger))\n return value;\n if (this.isA(stackVal, Squeak.splOb_ClassLargeNegativeInteger))\n return -value;\n this.success = false;\n return 0;\n },\n signed32BitIntegerFor: function(signed32) {\n // Return the 32-bit quantity as a signed 32-bit integer\n if (signed32 >= Squeak.MinSmallInt && signed32 <= Squeak.MaxSmallInt) return signed32;\n var negative = signed32 < 0,\n unsigned = negative ? -signed32 : signed32,\n lgIntClass = negative ? Squeak.splOb_ClassLargeNegativeInteger : Squeak.splOb_ClassLargePositiveInteger,\n lgIntObj = this.vm.instantiateClass(this.vm.specialObjects[lgIntClass], 4),\n bytes = lgIntObj.bytes;\n for (var i=0; i<4; i++)\n bytes[i] = (unsigned>>>(8*i)) & 255;\n return lgIntObj;\n },\n stackFloat: function(nDeep) {\n return this.checkFloat(this.vm.stackValue(nDeep));\n },\n stackBoolean: function(nDeep) {\n return this.checkBoolean(this.vm.stackValue(nDeep));\n },\n stackSigned53BitInt:function(nDeep) {\n var stackVal = this.vm.stackValue(nDeep);\n if (typeof stackVal === \"number\") { // SmallInteger\n return stackVal;\n }\n var n = stackVal.bytesSize();\n if (n <= 7) {\n var bytes = stackVal.bytes,\n value = 0;\n for (var i = 0, f = 1; i < n; i++, f *= 256)\n value += bytes[i] * f;\n if (value < 9007199254740992) {\n if (this.isA(stackVal, Squeak.splOb_ClassLargePositiveInteger))\n return value;\n if (this.isA(stackVal, Squeak.splOb_ClassLargeNegativeInteger))\n return -value;\n }\n }\n this.success = false;\n return 0;\n },\n},\n'numbers', {\n doBitAnd: function() {\n var rcvr = this.stackPos32BitInt(1);\n var arg = this.stackPos32BitInt(0);\n if (!this.success) return 0;\n return this.pos32BitIntFor(rcvr & arg);\n },\n doBitOr: function() {\n var rcvr = this.stackPos32BitInt(1);\n var arg = this.stackPos32BitInt(0);\n if (!this.success) return 0;\n return this.pos32BitIntFor(rcvr | arg);\n },\n doBitXor: function() {\n var rcvr = this.stackPos32BitInt(1);\n var arg = this.stackPos32BitInt(0);\n if (!this.success) return 0;\n return this.pos32BitIntFor(rcvr ^ arg);\n },\n doBitShift: function() {\n var rcvr = this.stackPos32BitInt(1);\n var arg = this.stackInteger(0);\n if (!this.success) return 0;\n var result = this.vm.safeShift(rcvr, arg); // returns negative result if failed\n if (result > 0)\n return this.pos32BitIntFor(this.vm.safeShift(rcvr, arg));\n this.success = false;\n return 0;\n },\n safeFDiv: function(dividend, divisor) {\n if (divisor === 0.0) {\n this.success = false;\n return 1.0;\n }\n return dividend / divisor;\n },\n floatAsSmallInt: function(float) {\n var truncated = float >= 0 ? Math.floor(float) : Math.ceil(float);\n return this.ensureSmallInt(truncated);\n },\n frexp_exponent: function(value) {\n // frexp separates a float into its mantissa and exponent\n if (value == 0.0) return 0; // zero is special\n var data = new DataView(new ArrayBuffer(8));\n data.setFloat64(0, value); // for accessing IEEE-754 exponent bits\n var bits = (data.getUint32(0) >>> 20) & 0x7FF;\n if (bits === 0) { // we have a subnormal float (actual zero was handled above)\n // make it normal by multiplying a large number\n data.setFloat64(0, value * Math.pow(2, 64));\n // access its exponent bits, and subtract the large number's exponent\n bits = ((data.getUint32(0) >>> 20) & 0x7FF) - 64;\n }\n var exponent = bits - 1022; // apply bias\n // mantissa = this.ldexp(value, -exponent) // not needed for Squeak\n return exponent;\n },\n ldexp: function(mantissa, exponent) {\n // construct a float from mantissa and exponent\n return exponent > 1023 // avoid multiplying by infinity\n ? mantissa * Math.pow(2, 1023) * Math.pow(2, exponent - 1023)\n : exponent < -1074 // avoid multiplying by zero\n ? mantissa * Math.pow(2, -1074) * Math.pow(2, exponent + 1074)\n : mantissa * Math.pow(2, exponent);\n },\n primitiveLessThanLargeIntegers: function() {\n return this.pop2andPushBoolIfOK(this.stackSigned53BitInt(1) < this.stackSigned53BitInt(0));\n },\n primitiveGreaterThanLargeIntegers: function() {\n return this.pop2andPushBoolIfOK(this.stackSigned53BitInt(1) > this.stackSigned53BitInt(0));\n },\n primitiveLessOrEqualLargeIntegers: function() {\n return this.pop2andPushBoolIfOK(this.stackSigned53BitInt(1) <= this.stackSigned53BitInt(0));\n },\n primitiveGreaterOrEqualLargeIntegers: function() {\n return this.pop2andPushBoolIfOK(this.stackSigned53BitInt(1) >= this.stackSigned53BitInt(0));\n },\n primitiveEqualLargeIntegers: function() {\n return this.pop2andPushBoolIfOK(this.stackSigned53BitInt(1) === this.stackSigned53BitInt(0));\n },\n primitiveNotEqualLargeIntegers: function() {\n return this.pop2andPushBoolIfOK(this.stackSigned53BitInt(1) !== this.stackSigned53BitInt(0));\n },\n},\n'utils', {\n floatOrInt: function(obj) {\n if (obj.isFloat) return obj.float;\n if (typeof obj === \"number\") return obj; // SmallInteger\n return 0;\n },\n positive32BitValueOf: function(obj) {\n if (typeof obj === \"number\") { // SmallInteger\n if (obj >= 0)\n return obj;\n this.success = false;\n return 0;\n }\n if (!this.isA(obj, Squeak.splOb_ClassLargePositiveInteger) || obj.bytesSize() !== 4) {\n this.success = false;\n return 0;\n }\n var bytes = obj.bytes,\n value = 0;\n for (var i = 0, f = 1; i < 4; i++, f *= 256)\n value += bytes[i] * f;\n return value;\n },\n checkFloat: function(maybeFloat) { // returns a number and sets success\n if (maybeFloat.isFloat)\n return maybeFloat.float;\n if (typeof maybeFloat === \"number\") // SmallInteger\n return maybeFloat;\n this.success = false;\n return 0.0;\n },\n checkSmallInt: function(maybeSmall) { // returns an int and sets success\n if (typeof maybeSmall === \"number\")\n return maybeSmall;\n this.success = false;\n return 0;\n },\n checkNonInteger: function(obj) { // returns a SqObj and sets success\n if (typeof obj !== \"number\")\n return obj;\n this.success = false;\n return this.vm.nilObj;\n },\n checkBoolean: function(obj) { // returns true/false and sets success\n if (obj.isTrue) return true;\n if (obj.isFalse) return false;\n return this.success = false;\n },\n indexableSize: function(obj) {\n if (typeof obj === \"number\") return -1; // -1 means not indexable\n var fmt = obj.format;\n if (fmt<2) return -1; //not indexable\n if (fmt===3 && this.vm.isContext(obj) && !this.allowAccessBeyondSP)\n return obj.pointers[Squeak.Context_stackPointer]; // no access beyond top of stacks\n if (fmt<6) return obj.pointersSize() - obj.instSize(); // pointers\n if (fmt<8) return obj.wordsSize(); // words\n if (fmt<12) return obj.bytesSize(); // bytes\n return obj.bytesSize() + (4 * obj.pointersSize()); // methods\n },\n isA: function(obj, knownClass) {\n return obj.sqClass === this.vm.specialObjects[knownClass];\n },\n isKindOf: function(obj, knownClass) {\n var classOrSuper = obj.sqClass;\n var theClass = this.vm.specialObjects[knownClass];\n while (!classOrSuper.isNil) {\n if (classOrSuper === theClass) return true;\n classOrSuper = classOrSuper.pointers[Squeak.Class_superclass];\n }\n return false;\n },\n isAssociation: function(obj) {\n return typeof obj !== \"number\" && obj.pointersSize() == 2;\n },\n ensureSmallInt: function(number) {\n if (number === (number|0) && this.vm.canBeSmallInt(number))\n return number;\n this.success = false;\n return 0;\n },\n charFromInt: function(ascii) {\n var charTable = this.vm.specialObjects[Squeak.splOb_CharacterTable];\n return charTable.pointers[ascii];\n },\n makeFloat: function(value) {\n var floatClass = this.vm.specialObjects[Squeak.splOb_ClassFloat];\n var newFloat = this.vm.instantiateClass(floatClass, 2);\n newFloat.float = value;\n return newFloat;\n },\n makeLargeIfNeeded: function(integer) {\n return this.vm.canBeSmallInt(integer) ? integer : this.makeLargeInt(integer);\n },\n makeLargeInt: function(integer) {\n if (integer < 0) throw Error(\"negative large ints not implemented yet\");\n if (integer > 0xFFFFFFFF) throw Error(\"large large ints not implemented yet\");\n return this.pos32BitIntFor(integer);\n },\n makePointWithXandY: function(x, y) {\n var pointClass = this.vm.specialObjects[Squeak.splOb_ClassPoint];\n var newPoint = this.vm.instantiateClass(pointClass, 0);\n newPoint.pointers[Squeak.Point_x] = x;\n newPoint.pointers[Squeak.Point_y] = y;\n return newPoint;\n },\n makeStArray: function(jsArray, proxyClass) {\n var array = this.vm.instantiateClass(this.vm.specialObjects[Squeak.splOb_ClassArray], jsArray.length);\n for (var i = 0; i < jsArray.length; i++)\n array.pointers[i] = this.makeStObject(jsArray[i], proxyClass);\n return array;\n },\n makeStString: function(jsString) {\n var bytes = [];\n for (var i = 0; i < jsString.length; ++i)\n bytes.push(jsString.charCodeAt(i) & 0xFF);\n var stString = this.vm.instantiateClass(this.vm.specialObjects[Squeak.splOb_ClassString], bytes.length);\n stString.bytes = bytes;\n return stString;\n },\n makeStObject: function(obj, proxyClass) {\n if (obj === undefined || obj === null) return this.vm.nilObj;\n if (obj === true) return this.vm.trueObj;\n if (obj === false) return this.vm.falseObj;\n if (obj.sqClass) return obj;\n if (typeof obj === \"number\")\n if (obj === (obj|0)) return this.makeLargeIfNeeded(obj);\n else return this.makeFloat(obj);\n if (proxyClass) { // wrap in JS proxy instance \n var stObj = this.vm.instantiateClass(proxyClass, 0);\n stObj.jsObject = obj;\n return stObj;\n } \n if (typeof obj === \"string\" || obj.constructor === Uint8Array) return this.makeStString(obj);\n if (obj.constructor === Array) return this.makeStArray(obj);\n throw Error(\"cannot make smalltalk object\");\n },\n pointsTo: function(rcvr, arg) {\n if (!rcvr.pointers) return false;\n return rcvr.pointers.indexOf(arg) >= 0;\n },\n asUint8Array: function(buffer) {\n if (buffer.constructor === Uint8Array) return buffer;\n if (buffer.constructor === ArrayBuffer) return new Uint8Array(buffer);\n if (typeof buffer === \"string\") {\n var array = new Uint8Array(buffer.length);\n for (var i = 0; i < buffer.length; i++)\n array[i] = buffer.charCodeAt(i);\n return array;\n }\n throw Error(\"unknown buffer type\");\n },\n filenameToSqueak: function(unixpath) {\n var slash = unixpath[0] !== \"/\" ? \"/\" : \"\",\n filepath = \"/SqueakJS\" + slash + unixpath; // add SqueakJS\n if (this.emulateMac)\n filepath = (\"Macintosh HD\" + filepath) // add Mac volume\n .replace(/\\//g, \"€\").replace(/:/g, \"/\").replace(/€/g, \":\"); // substitute : for /\n return filepath;\n },\n filenameFromSqueak: function(filepath) {\n var unixpath = !this.emulateMac ? filepath :\n filepath.replace(/^[^:]*:/, \":\") // remove volume\n .replace(/\\//g, \"€\").replace(/:/g, \"/\").replace(/€/g, \":\"); // substitute : for /\n unixpath = unixpath.replace(/^\\/*SqueakJS\\/?/, \"/\"); // strip SqueakJS\n return unixpath;\n },\n},\n'indexing', {\n objectAt: function(cameFromBytecode, convertChars, includeInstVars) {\n //Returns result of at: or sets success false\n var array = this.stackNonInteger(1);\n var index = this.stackPos32BitInt(0); //note non-int returns zero\n if (!this.success) return array;\n var info;\n if (cameFromBytecode) {// fast entry checks cache\n info = this.atCache[array.hash & this.atCacheMask];\n if (info.array !== array) {this.success = false; return array;}\n } else {// slow entry installs in cache if appropriate\n if (array.isFloat) { // present float as word array\n var floatData = array.floatData();\n if (index==1) return this.pos32BitIntFor(floatData.getUint32(0, false));\n if (index==2) return this.pos32BitIntFor(floatData.getUint32(4, false));\n this.success = false; return array;\n }\n info = this.makeAtCacheInfo(this.atCache, this.vm.specialSelectors[32], array, convertChars, includeInstVars);\n }\n if (index < 1 || index > info.size) {this.success = false; return array;}\n if (includeInstVars) //pointers... instVarAt and objectAt\n return array.pointers[index-1];\n if (array.format<6) //pointers... normal at:\n return array.pointers[index-1+info.ivarOffset];\n if (array.format<8) // words...\n return this.pos32BitIntFor(array.words[index-1]);\n if (array.format<12) // bytes...\n if (info.convertChars) return this.charFromInt(array.bytes[index-1] & 0xFF);\n else return array.bytes[index-1] & 0xFF;\n // methods (format>=12) must simulate Squeak's method indexing\n var offset = array.pointersSize() * 4;\n if (index-1-offset < 0) {this.success = false; return array;} //reading lits as bytes\n return array.bytes[index-1-offset] & 0xFF;\n },\n objectAtPut: function(cameFromBytecode, convertChars, includeInstVars) {\n //Returns result of at:put: or sets success false\n var array = this.stackNonInteger(2);\n var index = this.stackPos32BitInt(1); //note non-int returns zero\n if (!this.success) return array;\n var info;\n if (cameFromBytecode) {// fast entry checks cache\n info = this.atPutCache[array.hash & this.atCacheMask];\n if (info.array !== array) {this.success = false; return array;}\n } else {// slow entry installs in cache if appropriate\n if (array.isFloat) { // present float as word array\n var wordToPut = this.stackPos32BitInt(0);\n if (this.success && (index == 1 || index == 2)) {\n var floatData = array.floatData();\n floatData.setUint32(index == 1 ? 0 : 4, wordToPut, false);\n array.float = floatData.getFloat64(0);\n } else this.success = false;\n return this.vm.stackValue(0);\n }\n info = this.makeAtCacheInfo(this.atPutCache, this.vm.specialSelectors[34], array, convertChars, includeInstVars);\n }\n if (index<1 || index>info.size) {this.success = false; return array;}\n var objToPut = this.vm.stackValue(0);\n if (includeInstVars) // pointers... instVarAtPut and objectAtPut\n return array.pointers[index-1] = objToPut; //eg, objectAt:\n if (array.format<6) // pointers... normal atPut\n return array.pointers[index-1+info.ivarOffset] = objToPut;\n var intToPut;\n if (array.format<8) { // words...\n intToPut = this.stackPos32BitInt(0);\n if (this.success) array.words[index-1] = intToPut;\n return objToPut;\n }\n // bytes...\n if (convertChars) {\n // put a character...\n if (objToPut.sqClass !== this.vm.specialObjects[Squeak.splOb_ClassCharacter])\n {this.success = false; return objToPut;}\n intToPut = objToPut.pointers[0];\n if (typeof intToPut !== \"number\") {this.success = false; return objToPut;}\n } else { // put a byte...\n if (typeof objToPut !== \"number\") {this.success = false; return objToPut;}\n intToPut = objToPut;\n }\n if (intToPut<0 || intToPut>255) {this.success = false; return objToPut;}\n if (array.format<8) // bytes...\n return array.bytes[index-1] = intToPut;\n // methods (format>=12) must simulate Squeak's method indexing\n var offset = array.pointersSize() * 4;\n if (index-1-offset < 0) {this.success = false; return array;} //writing lits as bytes\n array.bytes[index-1-offset] = intToPut;\n return objToPut;\n },\n objectSize: function(cameFromBytecode) {\n var rcvr = this.vm.stackValue(0),\n size = -1;\n if (cameFromBytecode) {\n // must only handle classes with size == basicSize, fail otherwise\n if (rcvr.sqClass === this.vm.specialObjects[Squeak.splOb_ClassArray]) {\n size = rcvr.pointersSize();\n } else if (rcvr.sqClass === this.vm.specialObjects[Squeak.splOb_ClassString]) {\n size = rcvr.bytesSize();\n }\n } else { // basicSize\n size = this.indexableSize(rcvr);\n }\n if (size === -1) {this.success = false; return -1}; //not indexable\n return this.pos32BitIntFor(size);\n },\n initAtCache: function() {\n // The purpose of the at-cache is to allow fast (bytecode) access to at/atput code\n // without having to check whether this object has overridden at, etc.\n this.atCacheSize = 32; // must be power of 2\n this.atCacheMask = this.atCacheSize - 1; //...so this is a mask\n this.atCache = [];\n this.atPutCache = [];\n this.nonCachedInfo = {};\n for (var i= 0; i < this.atCacheSize; i++) {\n this.atCache.push({});\n this.atPutCache.push({});\n }\n },\n clearAtCache: function() { //clear at-cache pointers (prior to GC)\n this.nonCachedInfo.array = null;\n for (var i= 0; i < this.atCacheSize; i++) {\n this.atCache[i].array = null;\n this.atPutCache[i].array = null;\n }\n },\n makeAtCacheInfo: function(atOrPutCache, atOrPutSelector, array, convertChars, includeInstVars) {\n //Make up an info object and store it in the atCache or the atPutCache.\n //If it's not cacheable (not a non-super send of at: or at:put:)\n //then return the info in nonCachedInfo.\n //Note that info for objectAt (includeInstVars) will have\n //a zero ivarOffset, and a size that includes the extra instVars\n var info;\n var cacheable =\n (this.vm.verifyAtSelector === atOrPutSelector) //is at or atPut\n && (this.vm.verifyAtClass === array.sqClass) //not a super send\n && !(array.format === 3 && this.vm.isContext(array)); //not a context (size can change)\n info = cacheable ? atOrPutCache[array.hash & this.atCacheMask] : this.nonCachedInfo;\n info.array = array;\n info.convertChars = convertChars;\n if (includeInstVars) {\n info.size = array.instSize() + Math.max(0, this.indexableSize(array));\n info.ivarOffset = 0;\n } else {\n info.size = this.indexableSize(array);\n info.ivarOffset = (array.format < 6) ? array.instSize() : 0;\n }\n return info;\n },\n},\n'basic',{\n instantiateClass: function(clsObj, indexableSize) {\n if (indexableSize * 4 > this.vm.image.bytesLeft()) {\n // we're not really out of memory, we have no idea how much memory is available\n // but we need to stop runaway allocations\n console.warn(\"squeak: out of memory\");\n this.success = false;\n return null;\n } else {\n return this.vm.instantiateClass(clsObj, indexableSize);\n }\n },\n someObject: function() {\n return this.vm.image.firstOldObject;\n },\n nextObject: function(obj) {\n return this.vm.image.objectAfter(obj) || 0;\n },\n someInstanceOf: function(clsObj) {\n var someInstance = this.vm.image.someInstanceOf(clsObj);\n if (someInstance) return someInstance;\n this.success = false;\n return 0;\n },\n nextInstanceAfter: function(obj) {\n var nextInstance = this.vm.image.nextInstanceAfter(obj);\n if (nextInstance) return nextInstance;\n this.success = false;\n return 0;\n },\n primitiveFullGC: function(argCount) {\n this.vm.image.fullGC(\"primitive\");\n var bytes = this.vm.image.bytesLeft();\n return this.popNandPushIfOK(1, this.makeLargeIfNeeded(bytes));\n },\n primitiveMakePoint: function(argCount, checkNumbers) {\n var x = this.vm.stackValue(1);\n var y = this.vm.stackValue(0);\n if (checkNumbers) {\n this.checkFloat(x);\n this.checkFloat(y);\n if (!this.success) return false;\n }\n this.vm.popNandPush(1+argCount, this.makePointWithXandY(x, y));\n return true;\n },\n primitiveStoreStackp: function(argCount) {\n var ctxt = this.stackNonInteger(1),\n newStackp = this.stackInteger(0);\n if (!this.success || newStackp < 0 || this.vm.decodeSqueakSP(newStackp) >= ctxt.pointers.length)\n return false;\n var stackp = ctxt.pointers[Squeak.Context_stackPointer];\n while (stackp < newStackp)\n ctxt.pointers[this.vm.decodeSqueakSP(++stackp)] = this.vm.nilObj;\n ctxt.pointers[Squeak.Context_stackPointer] = newStackp;\n this.vm.popN(argCount);\n return true;\n },\n primitiveChangeClass: function(argCount) {\n if (argCount !== 1) return false;\n var rcvr = this.stackNonInteger(1),\n arg = this.stackNonInteger(0);\n if (!this.success) return false;\n if (rcvr.format !== arg.format ||\n rcvr.sqClass.isCompact !== arg.sqClass.isCompact ||\n rcvr.sqClass.classInstSize() !== arg.sqClass.classInstSize())\n return false;\n rcvr.sqClass = arg.sqClass;\n return this.popNIfOK(1);\n },\n primitiveDoPrimitiveWithArgs: function(argCount) {\n var argumentArray = this.stackNonInteger(0),\n primIdx = this.stackInteger(1);\n if (!this.success) return false;\n var arraySize = argumentArray.pointersSize(),\n cntxSize = this.vm.activeContext.pointersSize();\n if (this.vm.sp + arraySize >= cntxSize) return false;\n // Pop primIndex and argArray, then push args in place...\n this.vm.popN(2);\n for (var i = 0; i < arraySize; i++)\n this.vm.push(argumentArray.pointers[i]);\n // Run the primitive\n if (this.vm.tryPrimitive(primIdx, arraySize))\n return true;\n // Primitive failed, restore state for failure code\n this.vm.popN(arraySize);\n this.vm.push(primIdx);\n this.vm.push(argumentArray);\n return false;\n },\n primitiveShortAtAndPut: function(argCount) {\n var rcvr = this.stackNonInteger(argCount),\n index = this.stackInteger(argCount-1) - 1, // make zero-based\n array = rcvr.wordsAsInt16Array();\n if (!this.success || !array || index < 0 || index >= array.length)\n return false;\n var value;\n if (argCount < 2) { // shortAt:\n value = array[index];\n } else { // shortAt:put:\n value = this.stackInteger(0);\n if (value < -32768 || value > 32767)\n return false;\n array[index] = value;\n }\n this.popNandPushIfOK(argCount+1, value);\n return true;\n },\n primitiveIntegerAtAndPut: function(argCount) {\n var rcvr = this.stackNonInteger(argCount),\n index = this.stackInteger(argCount-1) - 1, // make zero-based\n array = rcvr.wordsAsInt32Array();\n if (!this.success || !array || index < 0 || index >= array.length)\n return false;\n var value;\n if (argCount < 2) { // integerAt:\n value = this.signed32BitIntegerFor(array[index]);\n } else { // integerAt:put:\n value = this.stackSigned32BitInt(0);\n if (!this.success)\n return false;\n array[index] = value;\n }\n this.popNandPushIfOK(argCount+1, value);\n return true;\n },\n primitiveConstantFill: function(argCount) {\n var rcvr = this.stackNonInteger(1),\n value = this.stackPos32BitInt(0);\n if (!this.success || !rcvr.isWordsOrBytes())\n return false;\n var array = rcvr.words || rcvr.bytes;\n if (array) {\n if (array === rcvr.bytes && value > 255)\n return false;\n for (var i = 0; i < array.length; i++)\n array[i] = value;\n }\n this.vm.popN(argCount);\n return true;\n },\n primitiveNewMethod: function(argCount) {\n var header = this.stackInteger(0);\n var bytecodeCount = this.stackInteger(1);\n if (!this.success) return 0;\n var litCount = (header>>9) & 0xFF;\n var method = this.vm.instantiateClass(this.vm.stackValue(2), bytecodeCount);\n method.pointers = [header];\n for (var i = 0; i < litCount; i++)\n method.pointers.push(this.vm.nilObj);\n this.vm.popNandPush(1+argCount, method);\n if (this.vm.breakOnNewMethod) // break on doit\n this.vm.breakOnMethod = method;\n return true;\n },\n primitiveExecuteMethodArgsArray: function(argCount) {\n // receiver, argsArray, then method are on top of stack. Execute method with\n // receiver and args.\n var methodObj = this.stackNonInteger(0),\n argsArray = this.stackNonInteger(1),\n receiver = this.vm.stackValue(2);\n // Allow for up to two extra arguments (e.g. for mirror primitives).\n if (!this.success || !this.vm.isMethod(methodObj) || argCount > 4) return false;\n var numArgs = methodObj.methodNumArgs();\n if (numArgs !== argsArray.pointersSize()) return false;\n // drop all args, push receiver, and new arguments\n this.vm.popNandPush(argCount+1, receiver);\n for (var i = 0; i < numArgs; i++)\n this.vm.push(argsArray.pointers[i]);\n this.vm.executeNewMethod(receiver, methodObj, numArgs, methodObj.methodPrimitiveIndex(), null, null);\n return true;\n },\n primitiveArrayBecome: function(argCount, doBothWays) {\n var rcvr = this.stackNonInteger(argCount),\n arg = this.stackNonInteger(argCount-1),\n copyHash = argCount > 1 ? this.stackBoolean(argCount-2) : true;\n if (!this.success) return false;\n this.success = this.vm.image.bulkBecome(rcvr.pointers, arg.pointers, doBothWays, copyHash);\n return this.popNIfOK(argCount);\n },\n doStringReplace: function() {\n var dst = this.stackNonInteger(4);\n var dstPos = this.stackInteger(3) - 1;\n var count = this.stackInteger(2) - dstPos;\n var src = this.stackNonInteger(1);\n var srcPos = this.stackInteger(0) - 1;\n if (!this.success) return dst; //some integer not right\n var srcFmt = src.format;\n var dstFmt = dst.format;\n if (dstFmt < 8)\n if (dstFmt != srcFmt) {this.success = false; return dst;} //incompatible formats\n else\n if ((dstFmt&0xC) != (srcFmt&0xC)) {this.success = false; return dst;} //incompatible formats\n if (srcFmt<4) {//pointer type objects\n var totalLength = src.pointersSize();\n var srcInstSize = src.instSize();\n srcPos += srcInstSize;\n if ((srcPos < 0) || (srcPos + count) > totalLength)\n {this.success = false; return dst;} //would go out of bounds\n totalLength = dst.pointersSize();\n var dstInstSize= dst.instSize();\n dstPos += dstInstSize;\n if ((dstPos < 0) || (dstPos + count) > totalLength)\n {this.success= false; return dst;} //would go out of bounds\n for (var i = 0; i < count; i++)\n dst.pointers[dstPos + i] = src.pointers[srcPos + i];\n return dst;\n } else if (srcFmt < 8) { //words type objects\n var totalLength = src.wordsSize();\n if ((srcPos < 0) || (srcPos + count) > totalLength)\n {this.success = false; return dst;} //would go out of bounds\n totalLength = dst.wordsSize();\n if ((dstPos < 0) || (dstPos + count) > totalLength)\n {this.success = false; return dst;} //would go out of bounds\n for (var i = 0; i < count; i++)\n dst.words[dstPos + i] = src.words[srcPos + i];\n return dst;\n } else { //bytes type objects\n var totalLength = src.bytesSize();\n if ((srcPos < 0) || (srcPos + count) > totalLength)\n {this.success = false; return dst;} //would go out of bounds\n totalLength = dst.bytesSize();\n if ((dstPos < 0) || (dstPos + count) > totalLength)\n {this.success = false; return dst;} //would go out of bounds\n for (var i = 0; i < count; i++)\n dst.bytes[dstPos + i] = src.bytes[srcPos + i];\n return dst;\n }\n },\n primitiveCopyObject: function(argCount) {\n var rcvr = this.stackNonInteger(1),\n arg = this.stackNonInteger(0),\n length = rcvr.pointersSize();\n if (!this.success ||\n rcvr.isWordsOrBytes() ||\n rcvr.sqClass !== arg.sqClass ||\n length !== arg.pointersSize()) return false;\n for (var i = 0; i < length; i++)\n arg.pointers[i] = rcvr.pointers[i];\n this.vm.pop(argCount);\n return true;\n },\n primitiveLoadImageSegment: function(argCount) {\n var segmentWordArray = this.stackNonInteger(1),\n outPointerArray = this.stackNonInteger(0);\n if (!segmentWordArray.words || !outPointerArray.pointers) return false;\n var roots = this.vm.image.loadImageSegment(segmentWordArray, outPointerArray);\n if (!roots) return false;\n return this.popNandPushIfOK(argCount + 1, roots);\n },\n},\n'blocks/closures', {\n doBlockCopy: function() {\n var rcvr = this.vm.stackValue(1);\n var sqArgCount = this.stackInteger(0);\n var homeCtxt = rcvr;\n if(!this.vm.isContext(homeCtxt)) this.success = false;\n if(!this.success) return rcvr;\n if (typeof homeCtxt.pointers[Squeak.Context_method] === \"number\")\n // ctxt is itself a block; get the context for its enclosing method\n homeCtxt = homeCtxt.pointers[Squeak.BlockContext_home];\n var blockSize = homeCtxt.pointersSize() - homeCtxt.instSize(); // could use a const for instSize\n var newBlock = this.vm.instantiateClass(this.vm.specialObjects[Squeak.splOb_ClassBlockContext], blockSize);\n var initialPC = this.vm.encodeSqueakPC(this.vm.pc + 2, this.vm.method); //*** check this...\n newBlock.pointers[Squeak.BlockContext_initialIP] = initialPC;\n newBlock.pointers[Squeak.Context_instructionPointer] = initialPC; // claim not needed; value will set it\n newBlock.pointers[Squeak.Context_stackPointer] = 0;\n newBlock.pointers[Squeak.BlockContext_argumentCount] = sqArgCount;\n newBlock.pointers[Squeak.BlockContext_home] = homeCtxt;\n newBlock.pointers[Squeak.Context_sender] = this.vm.nilObj; // claim not needed; just initialized\n return newBlock;\n },\n primitiveBlockValue: function(argCount) {\n var rcvr = this.vm.stackValue(argCount);\n if (!this.isA(rcvr, Squeak.splOb_ClassBlockContext)) return false;\n var block = rcvr;\n var blockArgCount = block.pointers[Squeak.BlockContext_argumentCount];\n if (typeof blockArgCount !== \"number\") return false;\n if (blockArgCount != argCount) return false;\n if (!block.pointers[Squeak.BlockContext_caller].isNil) return false;\n this.vm.arrayCopy(this.vm.activeContext.pointers, this.vm.sp-argCount+1, block.pointers, Squeak.Context_tempFrameStart, argCount);\n var initialIP = block.pointers[Squeak.BlockContext_initialIP];\n block.pointers[Squeak.Context_instructionPointer] = initialIP;\n block.pointers[Squeak.Context_stackPointer] = argCount;\n block.pointers[Squeak.BlockContext_caller] = this.vm.activeContext;\n this.vm.popN(argCount+1);\n this.vm.newActiveContext(block);\n return true;\n },\n primitiveBlockValueWithArgs: function(argCount) {\n var block = this.vm.stackValue(1);\n var array = this.vm.stackValue(0);\n if (!this.isA(block, Squeak.splOb_ClassBlockContext)) return false;\n if (!this.isA(array, Squeak.splOb_ClassArray)) return false;\n var blockArgCount = block.pointers[Squeak.BlockContext_argumentCount];\n if (typeof blockArgCount !== \"number\") return false;\n if (blockArgCount != array.pointersSize()) return false;\n if (!block.pointers[Squeak.BlockContext_caller].isNil) return false;\n this.vm.arrayCopy(array.pointers, 0, block.pointers, Squeak.Context_tempFrameStart, blockArgCount);\n var initialIP = block.pointers[Squeak.BlockContext_initialIP];\n block.pointers[Squeak.Context_instructionPointer] = initialIP;\n block.pointers[Squeak.Context_stackPointer] = blockArgCount;\n block.pointers[Squeak.BlockContext_caller] = this.vm.activeContext;\n this.vm.popN(argCount+1);\n this.vm.newActiveContext(block);\n return true;\n },\n primitiveClosureCopyWithCopiedValues: function(argCount) {\n this.vm.breakNow(\"primitiveClosureCopyWithCopiedValues\");\n debugger;\n return false;\n },\n primitiveClosureValue: function(argCount) {\n var blockClosure = this.vm.stackValue(argCount),\n blockArgCount = blockClosure.pointers[Squeak.Closure_numArgs];\n if (argCount !== blockArgCount) return false;\n return this.activateNewClosureMethod(blockClosure, argCount);\n },\n primitiveClosureValueWithArgs: function(argCount) {\n var array = this.vm.top(),\n arraySize = array.pointersSize(),\n blockClosure = this.vm.stackValue(argCount),\n blockArgCount = blockClosure.pointers[Squeak.Closure_numArgs];\n if (arraySize !== blockArgCount) return false;\n this.vm.pop();\n for (var i = 0; i < arraySize; i++)\n this.vm.push(array.pointers[i]);\n return this.activateNewClosureMethod(blockClosure, arraySize);\n },\n primitiveClosureValueNoContextSwitch: function(argCount) {\n return this.primitiveClosureValue(argCount);\n },\n activateNewClosureMethod: function(blockClosure, argCount) {\n var outerContext = blockClosure.pointers[Squeak.Closure_outerContext],\n method = outerContext.pointers[Squeak.Context_method],\n newContext = this.vm.allocateOrRecycleContext(method.methodNeedsLargeFrame()),\n numCopied = blockClosure.pointers.length - Squeak.Closure_firstCopiedValue;\n newContext.pointers[Squeak.Context_sender] = this.vm.activeContext;\n newContext.pointers[Squeak.Context_instructionPointer] = blockClosure.pointers[Squeak.Closure_startpc];\n newContext.pointers[Squeak.Context_stackPointer] = argCount + numCopied;\n newContext.pointers[Squeak.Context_method] = outerContext.pointers[Squeak.Context_method];\n newContext.pointers[Squeak.Context_closure] = blockClosure;\n newContext.pointers[Squeak.Context_receiver] = outerContext.pointers[Squeak.Context_receiver];\n // Copy the arguments and copied values ...\n var where = Squeak.Context_tempFrameStart;\n for (var i = 0; i < argCount; i++)\n newContext.pointers[where++] = this.vm.stackValue(argCount - i - 1);\n for (var i = 0; i < numCopied; i++)\n newContext.pointers[where++] = blockClosure.pointers[Squeak.Closure_firstCopiedValue + i];\n // The initial instructions in the block nil-out remaining temps.\n this.vm.popN(argCount + 1);\n this.vm.newActiveContext(newContext);\n return true;\n },\n},\n'scheduling',\n{\n primitiveResume: function() {\n this.resume(this.vm.top());\n return true;\n },\n primitiveSuspend: function() {\n var activeProc = this.getScheduler().pointers[Squeak.ProcSched_activeProcess];\n if (this.vm.top() !== activeProc) return false;\n this.vm.popNandPush(1, this.vm.nilObj);\n this.transferTo(this.pickTopProcess());\n return true;\n },\n getScheduler: function() {\n var assn = this.vm.specialObjects[Squeak.splOb_SchedulerAssociation];\n return assn.pointers[Squeak.Assn_value];\n },\n resume: function(newProc) {\n var activeProc = this.getScheduler().pointers[Squeak.ProcSched_activeProcess];\n var activePriority = activeProc.pointers[Squeak.Proc_priority];\n var newPriority = newProc.pointers[Squeak.Proc_priority];\n if (newPriority > activePriority) {\n this.putToSleep(activeProc);\n this.transferTo(newProc);\n } else {\n this.putToSleep(newProc);\n }\n },\n putToSleep: function(aProcess) {\n //Save the given process on the scheduler process list for its priority.\n var priority = aProcess.pointers[Squeak.Proc_priority];\n var processLists = this.getScheduler().pointers[Squeak.ProcSched_processLists];\n var processList = processLists.pointers[priority - 1];\n this.linkProcessToList(aProcess, processList);\n },\n transferTo: function(newProc) {\n //Record a process to be awakened on the next interpreter cycle.\n var sched = this.getScheduler();\n var oldProc = sched.pointers[Squeak.ProcSched_activeProcess];\n sched.pointers[Squeak.ProcSched_activeProcess] = newProc;\n oldProc.pointers[Squeak.Proc_suspendedContext] = this.vm.activeContext;\n this.vm.newActiveContext(newProc.pointers[Squeak.Proc_suspendedContext]);\n newProc.pointers[Squeak.Proc_suspendedContext] = this.vm.nilObj;\n this.vm.reclaimableContextCount = 0;\n if (this.vm.breakOnContextChanged) {\n this.vm.breakOnContextChanged = false;\n this.vm.breakNow();\n }\n },\n pickTopProcess: function() { // aka wakeHighestPriority\n //Return the highest priority process that is ready to run.\n //Note: It is a fatal VM error if there is no runnable process.\n var schedLists = this.getScheduler().pointers[Squeak.ProcSched_processLists];\n var p = schedLists.pointersSize() - 1; // index of last indexable field\n var processList;\n do {\n if (p < 0) throw Error(\"scheduler could not find a runnable process\");\n processList = schedLists.pointers[p--];\n } while (this.isEmptyList(processList));\n return this.removeFirstLinkOfList(processList);\n },\n linkProcessToList: function(proc, aList) {\n // Add the given process to the given linked list and set the backpointer\n // of process to its new list.\n if (this.isEmptyList(aList))\n aList.pointers[Squeak.LinkedList_firstLink] = proc;\n else {\n var lastLink = aList.pointers[Squeak.LinkedList_lastLink];\n lastLink.pointers[Squeak.Link_nextLink] = proc;\n }\n aList.pointers[Squeak.LinkedList_lastLink] = proc;\n proc.pointers[Squeak.Proc_myList] = aList;\n },\n isEmptyList: function(aLinkedList) {\n return aLinkedList.pointers[Squeak.LinkedList_firstLink].isNil;\n },\n removeFirstLinkOfList: function(aList) {\n //Remove the first process from the given linked list.\n var first = aList.pointers[Squeak.LinkedList_firstLink];\n var last = aList.pointers[Squeak.LinkedList_lastLink];\n if (first === last) {\n aList.pointers[Squeak.LinkedList_firstLink] = this.vm.nilObj;\n aList.pointers[Squeak.LinkedList_lastLink] = this.vm.nilObj;\n } else {\n var next = first.pointers[Squeak.Link_nextLink];\n aList.pointers[Squeak.LinkedList_firstLink] = next;\n }\n first.pointers[Squeak.Link_nextLink] = this.vm.nilObj;\n return first;\n },\n registerSemaphore: function(specialObjIndex) {\n var sema = this.vm.top();\n if (this.isA(sema, Squeak.splOb_ClassSemaphore))\n this.vm.specialObjects[specialObjIndex] = sema;\n else\n this.vm.specialObjects[specialObjIndex] = this.vm.nilObj;\n return this.vm.stackValue(1);\n },\n primitiveWait: function() {\n var sema = this.vm.top();\n if (!this.isA(sema, Squeak.splOb_ClassSemaphore)) return false;\n var excessSignals = sema.pointers[Squeak.Semaphore_excessSignals];\n if (excessSignals > 0)\n sema.pointers[Squeak.Semaphore_excessSignals] = excessSignals - 1;\n else {\n var activeProc = this.getScheduler().pointers[Squeak.ProcSched_activeProcess];\n this.linkProcessToList(activeProc, sema);\n this.transferTo(this.pickTopProcess());\n }\n return true;\n },\n primitiveSignal: function() {\n var sema = this.vm.top();\n if (!this.isA(sema, Squeak.splOb_ClassSemaphore)) return false;\n this.synchronousSignal(sema);\n return true;\n },\n synchronousSignal: function(sema) {\n if (this.isEmptyList(sema)) {\n // no process is waiting on this semaphore\n sema.pointers[Squeak.Semaphore_excessSignals]++;\n } else\n this.resume(this.removeFirstLinkOfList(sema));\n return;\n },\n primitiveSignalAtMilliseconds: function(argCount) { //Delay signal:atMs:\n var msTime = this.stackInteger(0);\n var sema = this.stackNonInteger(1);\n var rcvr = this.stackNonInteger(2);\n if (!this.success) return false;\n if (this.isA(sema, Squeak.splOb_ClassSemaphore)) {\n this.vm.specialObjects[Squeak.splOb_TheTimerSemaphore] = sema;\n this.vm.nextWakeupTick = msTime;\n } else {\n this.vm.specialObjects[Squeak.splOb_TheTimerSemaphore] = this.vm.nilObj;\n this.vm.nextWakeupTick = 0;\n }\n this.vm.popN(argCount); // return self\n return true;\n },\n signalSemaphoreWithIndex: function(semaIndex) {\n // asynch signal: will actually be signaled in checkForInterrupts()\n this.semaphoresToSignal.push(semaIndex);\n },\n signalExternalSemaphores: function() {\n var semaphores = this.vm.specialObjects[Squeak.splOb_ExternalObjectsArray].pointers,\n semaClass = this.vm.specialObjects[Squeak.splOb_ClassSemaphore];\n while (this.semaphoresToSignal.length) {\n var semaIndex = this.semaphoresToSignal.shift(),\n sema = semaphores[semaIndex - 1];\n if (sema.sqClass == semaClass)\n this.synchronousSignal(sema);\n }\n },\n},\n'vm functions', {\n primitiveGetAttribute: function(argCount) {\n var attr = this.stackInteger(0);\n if (!this.success) return false;\n var value;\n switch (attr) {\n case 0: value = this.filenameToSqueak(Squeak.vmPath + Squeak.vmFile); break;\n case 1: value = this.display.documentName || null; break; // 1.x images want document here\n case 2: value = this.display.documentName || null; break; // later images want document here\n case 1001: value = Squeak.platformName; break;\n case 1002: value = Squeak.osVersion; break;\n case 1003: value = Squeak.platformSubtype; break;\n case 1004: value = Squeak.vmVersion; break;\n case 1005: value = Squeak.windowSystem; break;\n case 1006: value = Squeak.vmBuild; break;\n case 1007: value = Squeak.vmVersion; break; // Interpreter class\n // case 1008: Cogit class\n case 1009: value = Squeak.vmVersion; break; // Platform source version\n default: return false;\n }\n this.vm.popNandPush(argCount+1, this.makeStObject(value));\n return true;\n },\n setLowSpaceThreshold: function() {\n var nBytes = this.stackInteger(0);\n if (this.success) this.vm.lowSpaceThreshold = nBytes;\n return this.vm.stackValue(1);\n },\n primitiveVMParameter: function(argCount) {\n /* Behaviour depends on argument count:\n 0 args: return an Array of VM parameter values;\n 1 arg: return the indicated VM parameter;\n 2 args: set the VM indicated parameter. */\n var paramsArraySize = 41;\n switch (argCount) {\n case 0:\n var arrayObj = this.vm.instantiateClass(this.vm.specialObjects[Squeak.splOb_ClassArray], paramsArraySize);\n for (var i = 0; i < paramsArraySize; i++)\n arrayObj.pointers[i] = this.makeStObject(this.vmParameterAt(i+1));\n return this.popNandPushIfOK(1, arrayObj);\n case 1:\n var parm = this.stackInteger(0);\n return this.popNandPushIfOK(2, this.makeStObject(this.vmParameterAt(parm)));\n case 2:\n return this.popNandPushIfOK(3, 0);\n };\n return false;\n },\n vmParameterAt: function(index) {\n switch (index) {\n case 1: return this.vm.image.oldSpaceBytes; // end of old-space (0-based, read-only)\n case 2: return this.vm.image.oldSpaceBytes; // end of young-space (read-only)\n case 3: return this.vm.image.totalMemory; // end of memory (read-only)\n case 4: return this.vm.image.allocationCount + this.vm.image.newSpaceCount; // allocationCount (read-only; nil in Cog VMs)\n // 5 allocations between GCs (read-write; nil in Cog VMs)\n // 6 survivor count tenuring threshold (read-write)\n case 7: return this.vm.image.gcCount; // full GCs since startup (read-only)\n case 8: return this.vm.image.gcMilliseconds; // total milliseconds in full GCs since startup (read-only)\n case 9: return 1; /* image expects > 0 */ // incremental GCs since startup (read-only)\n case 10: return 0; // total milliseconds in incremental GCs since startup (read-only)\n case 11: return this.vm.image.gcTenured; // tenures of surving objects since startup (read-only)\n // 12-20 specific to the translating VM\n // 21 root table size (read-only)\n // 22 root table overflows since startup (read-only)\n // 23 bytes of extra memory to reserve for VM buffers, plugins, etc.\n // 24 memory threshold above which to shrink object memory (read-write)\n // 25 memory headroom when growing object memory (read-write)\n // 26 interruptChecksEveryNms - force an ioProcessEvents every N milliseconds (read-write)\n // 27 number of times mark loop iterated for current IGC/FGC (read-only) includes ALL marking\n // 28 number of times sweep loop iterated for current IGC/FGC (read-only)\n // 29 number of times make forward loop iterated for current IGC/FGC (read-only)\n // 30 number of times compact move loop iterated for current IGC/FGC (read-only)\n // 31 number of grow memory requests (read-only)\n // 32 number of shrink memory requests (read-only)\n // 33 number of root table entries used for current IGC/FGC (read-only)\n // 34 number of allocations done before current IGC/FGC (read-only)\n // 35 number of survivor objects after current IGC/FGC (read-only)\n // 36 millisecond clock when current IGC/FGC completed (read-only)\n // 37 number of marked objects for Roots of the world, not including Root Table entries for current IGC/FGC (read-only)\n // 38 milliseconds taken by current IGC (read-only)\n // 39 Number of finalization signals for Weak Objects pending when current IGC/FGC completed (read-only)\n case 40: return 4; // BytesPerWord for this image\n case 41: return this.vm.image.formatVersion();\n }\n return null;\n },\n primitiveImageName: function(argCount) {\n if (argCount == 0)\n return this.popNandPushIfOK(1, this.makeStString(this.filenameToSqueak(this.vm.image.name)));\n this.vm.image.name = this.filenameFromSqueak(this.vm.top().bytesAsString());\n window.localStorage['squeakImageName'] = this.vm.image.name;\n return true;\n },\n primitiveSnapshot: function(argCount) {\n this.vm.popNandPush(1, this.vm.trueObj); // put true on stack for saved snapshot\n this.vm.storeContextRegisters(); // store current state for snapshot\n var proc = this.getScheduler().pointers[Squeak.ProcSched_activeProcess];\n proc.pointers[Squeak.Proc_suspendedContext] = this.vm.activeContext; // store initial context\n this.vm.image.fullGC(\"snapshot\"); // before cleanup so traversal works\n var buffer = this.vm.image.writeToBuffer();\n Squeak.flushAllFiles(); // so there are no more writes pending\n Squeak.filePut(this.vm.image.name, buffer);\n this.vm.popNandPush(1, this.vm.falseObj); // put false on stack for continuing\n return true;\n },\n primitiveQuit: function(argCount) {\n Squeak.flushAllFiles();\n this.display.quitFlag = true;\n this.vm.breakNow(\"quit\");\n return true;\n },\n primitiveExitToDebugger: function(argCount) {\n this.vm.breakNow(\"debugger primitive\");\n debugger;\n return true;\n },\n primitiveSetGCBiasToGrow: function(argCount) {\n return this.fakePrimitive(\".primitiveSetGCBiasToGrow\", 0, argCount);\n },\n primitiveSetGCBiasToGrowGCLimit: function(argCount) {\n return this.fakePrimitive(\".primitiveSetGCBiasToGrowGCLimit\", 0, argCount);\n },\n},\n'display', {\n primitiveBeCursor: function(argCount) {\n if (this.display.cursorCanvas) {\n var cursorForm = this.loadForm(this.stackNonInteger(argCount), true),\n maskForm = argCount === 1 ? this.loadForm(this.stackNonInteger(0)) : null;\n if (!this.success || !cursorForm) return false;\n var cursorCanvas = this.display.cursorCanvas,\n context = cursorCanvas.getContext(\"2d\"),\n bounds = {left: 0, top: 0, right: cursorForm.width, bottom: cursorForm.height};\n cursorCanvas.width = cursorForm.width;\n cursorCanvas.height = cursorForm.height;\n if (cursorForm.depth === 1) {\n if (maskForm) {\n cursorForm = this.cursorMergeMask(cursorForm, maskForm);\n this.showForm(context, cursorForm, bounds, [0x00000000, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000]);\n } else {\n this.showForm(context, cursorForm, bounds, [0x00000000, 0xFF000000]);\n }\n } else {\n this.showForm(context, cursorForm, bounds, true);\n }\n var canvas = this.display.context.canvas,\n scale = canvas.offsetWidth / canvas.width;\n cursorCanvas.style.width = (cursorCanvas.width * scale|0) + \"px\";\n cursorCanvas.style.height = (cursorCanvas.height * scale|0) + \"px\";\n this.display.cursorOffsetX = cursorForm.offsetX * scale|0;\n this.display.cursorOffsetY = cursorForm.offsetY * scale|0;\n }\n this.vm.popN(argCount);\n return true;\n },\n cursorMergeMask: function(cursor, mask) {\n // make 2-bit form from cursor and mask 1-bit forms\n var bits = new Uint32Array(16);\n for (var y = 0; y < 16; y++) {\n var c = cursor.bits[y],\n m = mask.bits[y],\n bit = 0x80000000,\n merged = 0;\n for (var x = 0; x < 16; x++) {\n merged = merged | ((m & bit) >> x) | ((c & bit) >> (x + 1));\n bit = bit >>> 1;\n }\n bits[y] = merged; \n }\n return {\n obj: cursor.obj, bits: bits,\n depth: 2, width: 16, height: 16,\n offsetX: cursor.offsetX, offsetY: cursor.offsetY,\n msb: true, pixPerWord: 16, pitch: 1,\n }\n },\n primitiveBeDisplay: function(argCount) {\n var displayObj = this.vm.stackValue(0);\n this.vm.specialObjects[Squeak.splOb_TheDisplay] = displayObj;\n this.vm.popN(argCount); // return self\n return true;\n },\n primitiveReverseDisplay: function(argCount) {\n this.reverseDisplay = !this.reverseDisplay;\n this.redrawDisplay();\n if (this.display.cursorCanvas) {\n var canvas = this.display.cursorCanvas,\n context = canvas.getContext(\"2d\"),\n image = context.getImageData(0, 0, canvas.width, canvas.height),\n data = new Uint32Array(image.data.buffer);\n for (var i = 0; i < data.length; i++)\n data[i] = data[i] ^ 0x00FFFFFF;\n context.putImageData(image, 0, 0);\n }\n return true;\n },\n primitiveShowDisplayRect: function(argCount) {\n // Force the given rectangular section of the Display to be copied to the screen.\n var rect = {\n left: this.stackInteger(3),\n top: this.stackInteger(1),\n right: this.stackInteger(2),\n bottom: this.stackInteger(0),\n };\n if (!this.success) return false;\n this.redrawDisplay(rect);\n this.vm.popN(argCount);\n return true;\n },\n redrawDisplay: function(rect) {\n var theDisplay = this.theDisplay(),\n bounds = {left: 0, top: 0, right: theDisplay.width, bottom: theDisplay.height};\n if (rect) {\n if (rect.left > bounds.left) bounds.left = rect.left;\n if (rect.right < bounds.right) bounds.right = rect.right;\n if (rect.top > bounds.top) bounds.top = rect.top;\n if (rect.bottom < bounds.bottom) bounds.bottom = rect.bottom;\n }\n if (bounds.left < bounds.right && bounds.top < bounds.bottom)\n this.displayUpdate(theDisplay, bounds);\n },\n showForm: function(ctx, form, rect, cursorColors) {\n if (!rect) return;\n var srcX = rect.left,\n srcY = rect.top,\n srcW = rect.right - srcX,\n srcH = rect.bottom - srcY,\n pixels = ctx.createImageData(srcW, srcH),\n pixelData = pixels.data;\n if (!pixelData.buffer) { // mobile IE uses a different data-structure\n pixelData = new Uint8Array(srcW * srcH * 4);\n }\n var dest = new Uint32Array(pixelData.buffer);\n switch (form.depth) {\n case 1:\n case 2:\n case 4:\n case 8:\n var colors = cursorColors || this.swappedColors;\n if (!colors) {\n colors = [];\n for (var i = 0; i < 256; i++) {\n var argb = this.indexedColors[i],\n abgr = (argb & 0xFF00FF00) // green and alpha\n + ((argb & 0x00FF0000) >> 16) // shift red down\n + ((argb & 0x000000FF) << 16); // shift blue up\n colors[i] = abgr;\n }\n this.swappedColors = colors;\n }\n if (this.reverseDisplay) {\n if (cursorColors) {\n colors = cursorColors.map(function(c){return c ^ 0x00FFFFFF});\n } else {\n if (!this.reversedColors)\n this.reversedColors = colors.map(function(c){return c ^ 0x00FFFFFF});\n colors = this.reversedColors;\n }\n }\n var mask = (1 << form.depth) - 1;\n var leftSrcShift = 32 - (srcX % form.pixPerWord + 1) * form.depth;\n for (var y = 0; y < srcH; y++) {\n var srcIndex = form.pitch * srcY + (srcX / form.pixPerWord | 0);\n var srcShift = leftSrcShift;\n var src = form.bits[srcIndex];\n var dstIndex = pixels.width * y;\n for (var x = 0; x < srcW; x++) {\n dest[dstIndex++] = colors[(src >>> srcShift) & mask];\n if ((srcShift -= form.depth) < 0) {\n srcShift = 32 - form.depth;\n src = form.bits[++srcIndex];\n }\n }\n srcY++;\n };\n break;\n case 16:\n var leftSrcShift = srcX % 2 ? 0 : 16;\n for (var y = 0; y < srcH; y++) {\n var srcIndex = form.pitch * srcY + (srcX / 2 | 0);\n var srcShift = leftSrcShift;\n var src = form.bits[srcIndex];\n var dstIndex = pixels.width * y;\n for (var x = 0; x < srcW; x++) {\n var rgb = src >>> srcShift;\n dest[dstIndex++] =\n ((rgb & 0x7C00) >> 7) // shift red down 2*5, up 0*8 + 3\n + ((rgb & 0x03E0) << 6) // shift green down 1*5, up 1*8 + 3\n + ((rgb & 0x001F) << 19) // shift blue down 0*5, up 2*8 + 3\n + 0xFF000000; // set alpha to opaque\n if ((srcShift -= 16) < 0) {\n srcShift = 16;\n src = form.bits[++srcIndex];\n }\n }\n srcY++;\n };\n break;\n case 32:\n var opaque = cursorColors ? 0 : 0xFF000000; // keep alpha for cursors\n for (var y = 0; y < srcH; y++) {\n var srcIndex = form.pitch * srcY + srcX;\n var dstIndex = pixels.width * y;\n for (var x = 0; x < srcW; x++) {\n var argb = form.bits[srcIndex++]; // convert ARGB -> ABGR\n var abgr = (argb & 0xFF00FF00) // green and alpha is okay\n | ((argb & 0x00FF0000) >> 16) // shift red down\n | ((argb & 0x000000FF) << 16) // shift blue up\n | opaque; // set alpha to opaque\n dest[dstIndex++] = abgr;\n }\n srcY++;\n };\n break;\n default: throw Error(\"depth not implemented\");\n };\n if (pixels.data !== pixelData) {\n pixels.data.set(pixelData);\n }\n ctx.putImageData(pixels, rect.left, rect.top);\n },\n primitiveDeferDisplayUpdates: function(argCount) {\n var flag = this.stackBoolean(0);\n if (!this.success) return false;\n this.deferDisplayUpdates = flag;\n this.vm.popN(argCount);\n return true;\n },\n primitiveForceDisplayUpdate: function(argCount) {\n this.vm.breakOut(); // show on screen\n this.vm.popN(argCount);\n return true;\n },\n primitiveScreenSize: function(argCount) {\n var display = this.display,\n w = display.width || display.context.canvas.width,\n h = display.height || display.context.canvas.height;\n return this.popNandPushIfOK(argCount+1, this.makePointWithXandY(w, h));\n },\n primitiveSetFullScreen: function(argCount) {\n var flag = this.stackBoolean(0);\n if (!this.success) return false;\n if (this.display.fullscreen != flag) {\n if (this.display.fullscreenRequest) {\n // freeze until we get the right display size\n var unfreeze = this.vm.freeze();\n this.display.fullscreenRequest(flag, function thenDo() {\n unfreeze();\n });\n } else {\n this.display.fullscreen = flag;\n this.vm.breakOut(); // let VM go into fullscreen mode\n }\n }\n this.vm.popN(argCount);\n return true;\n },\n primitiveTestDisplayDepth: function(argCount) {\n var supportedDepths = [1, 2, 4, 8, 16, 32]; // match showOnDisplay()\n return this.pop2andPushBoolIfOK(supportedDepths.indexOf(this.stackInteger(0)) >= 0);\n },\n loadForm: function(formObj, withOffset) {\n if (formObj.isNil) return null;\n var form = {\n obj: formObj,\n bits: formObj.pointers[Squeak.Form_bits].wordsOrBytes(),\n depth: formObj.pointers[Squeak.Form_depth],\n width: formObj.pointers[Squeak.Form_width],\n height: formObj.pointers[Squeak.Form_height],\n }\n if (withOffset) {\n var offset = formObj.pointers[Squeak.Form_offset];\n form.offsetX = offset.pointers ? offset.pointers[Squeak.Point_x] : 0;\n form.offsetY = offset.pointers ? offset.pointers[Squeak.Point_y] : 0;\n }\n if (form.width === 0 || form.height === 0) return form;\n if (!(form.width > 0 && form.height > 0)) return null;\n form.msb = form.depth > 0;\n if (!form.msb) form.depth = -form.depth;\n if (!(form.depth > 0)) return null; // happens if not int\n form.pixPerWord = 32 / form.depth;\n form.pitch = (form.width + (form.pixPerWord - 1)) / form.pixPerWord | 0;\n if (form.bits.length !== (form.pitch * form.height)) return null;\n return form;\n },\n theDisplay: function() {\n return this.loadForm(this.vm.specialObjects[Squeak.splOb_TheDisplay]);\n },\n displayDirty: function(form, rect) {\n if (!this.deferDisplayUpdates\n && form == this.vm.specialObjects[Squeak.splOb_TheDisplay])\n this.displayUpdate(this.theDisplay(), rect);\n },\n displayUpdate: function(form, rect) {\n this.showForm(this.display.context, form, rect);\n this.display.lastTick = this.vm.lastTick;\n this.display.idle = 0;\n },\n primitiveBeep: function(argCount) {\n var ctx = Squeak.startAudioOut();\n if (ctx) {\n var beep = ctx.createOscillator();\n beep.connect(ctx.destination);\n beep.frequency.value = 880;\n beep.noteOn(0);\n beep.noteOff(ctx.currentTime + 0.2);\n } else {\n this.vm.warnOnce(\"could not initialize audio\");\n }\n return this.popNIfOK(argCount);\n },\n},\n'input', {\n primitiveClipboardText: function(argCount) {\n if (argCount === 0) { // read from clipboard\n if (typeof(this.display.clipboardString) !== 'string') return false;\n this.vm.popNandPush(1, this.makeStString(this.display.clipboardString));\n } else if (argCount === 1) { // write to clipboard\n var stringObj = this.vm.top();\n if (stringObj.bytes) {\n this.display.clipboardString = stringObj.bytesAsString();\n this.display.clipboardStringChanged = true;\n }\n this.vm.pop();\n }\n return true;\n },\n primitiveKeyboardNext: function(argCount) {\n return this.popNandPushIfOK(argCount+1, this.ensureSmallInt(this.display.keys.shift()));\n },\n primitiveKeyboardPeek: function(argCount) {\n var length = this.display.keys.length;\n return this.popNandPushIfOK(argCount+1, length ? this.ensureSmallInt(this.display.keys[0] || 0) : this.vm.nilObj);\n },\n primitiveMouseButtons: function(argCount) {\n // only used in non-event based (old MVC) images\n this.popNandPushIfOK(argCount+1, this.ensureSmallInt(this.display.buttons));\n // if the image calls this primitive it means it's done displaying\n // we break out of the VM so the browser shows it quickly\n this.vm.breakOut();\n // if nothing was drawn but the image looks at the buttons rapidly,\n // it must be idle.\n if (this.display.idle++ > 20)\n this.vm.goIdle(); // might switch process, so must be after pop\n return true;\n },\n primitiveMousePoint: function(argCount) {\n var x = this.ensureSmallInt(this.display.mouseX),\n y = this.ensureSmallInt(this.display.mouseY);\n return this.popNandPushIfOK(argCount+1, this.makePointWithXandY(x, y));\n },\n primitiveInputSemaphore: function(argCount) {\n var semaIndex = this.stackInteger(0);\n if (!this.success) return false;\n this.inputEventSemaIndex = semaIndex;\n this.display.signalInputEvent = function() {\n this.signalSemaphoreWithIndex(this.inputEventSemaIndex);\n }.bind(this);\n return true;\n },\n primitiveInputWord: function(argCount) {\n // Return an integer indicating the reason for the most recent input interrupt\n return this.popNandPushIfOK(1, 0); // noop for now\n },\n primitiveGetNextEvent: function(argCount) {\n this.display.idle++;\n var evtBuf = this.stackNonInteger(0);\n if (!this.display.getNextEvent) return false;\n this.display.getNextEvent(evtBuf.pointers, this.vm.startupTime);\n return true;\n },\n},\n'time', {\n primitiveRelinquishProcessorForMicroseconds: function(argCount) {\n // we ignore the optional arg\n this.vm.pop(argCount);\n this.vm.goIdle(); // might switch process, so must be after pop\n return true;\n },\n millisecondClockValue: function() {\n //Return the value of the millisecond clock as an integer.\n //Note that the millisecond clock wraps around periodically.\n //The range is limited to SmallInteger maxVal / 2 to allow\n //delays of up to that length without overflowing a SmallInteger.\n return (Date.now() - this.vm.startupTime) & Squeak.MillisecondClockMask;\n },\n millisecondClockValueSet: function(clock) {\n // set millisecondClock to the (previously saved) clock value\n // to allow \"stopping\" the VM clock while debugging\n this.vm.startupTime = Date.now() - clock;\n },\n secondClock: function() {\n return this.pos32BitIntFor(Squeak.totalSeconds()); // will overflow 32 bits in 2037\n },\n microsecondClockUTC: function() {\n var millis = Date.now() - Squeak.EpochUTC;\n return this.pos64BitIntFor(millis * 1000);\n },\n microsecondClockLocal: function() {\n var millis = Date.now() - Squeak.Epoch;\n return this.pos64BitIntFor(millis * 1000);\n },\n},\n'FilePlugin', {\n primitiveDirectoryCreate: function(argCount) {\n var dirNameObj = this.stackNonInteger(0);\n if (!this.success) return false;\n var dirName = this.filenameFromSqueak(dirNameObj.bytesAsString());\n this.success = Squeak.dirCreate(dirName);\n if (!this.success) {\n var path = Squeak.splitFilePath(dirName);\n console.log(\"Directory not created: \" + path.fullname);\n }\n return this.popNIfOK(argCount);\n },\n primitiveDirectoryDelete: function(argCount) {\n var dirNameObj = this.stackNonInteger(0);\n if (!this.success) return false;\n var dirName = this.filenameFromSqueak(dirNameObj.bytesAsString());\n this.success = Squeak.dirDelete(dirName);\n return this.popNIfOK(argCount);\n },\n primitiveDirectoryDelimitor: function(argCount) {\n var delimitor = this.emulateMac ? ':' : '/';\n return this.popNandPushIfOK(1, this.charFromInt(delimitor.charCodeAt(0)));\n },\n primitiveDirectoryEntry: function(argCount) {\n this.vm.warnOnce(\"Not yet implemented: primitiveDirectoryEntry\");\n return false; // image falls back on primitiveDirectoryLookup\n },\n primitiveDirectoryLookup: function(argCount) {\n var index = this.stackInteger(0),\n dirNameObj = this.stackNonInteger(1);\n if (!this.success) return false;\n var sqDirName = dirNameObj.bytesAsString();\n var dirName = this.filenameFromSqueak(sqDirName);\n var entries = Squeak.dirList(dirName, true);\n if (!entries) {\n var path = Squeak.splitFilePath(dirName);\n console.log(\"Directory not found: \" + path.fullname);\n return false;\n }\n var keys = Object.keys(entries).sort(),\n entry = entries[keys[index - 1]];\n if (sqDirName === \"/\") { // fake top-level dir\n if (index === 1) {\n if (!entry) entry = [0, 0, 0, 0, 0];\n entry[0] = \"SqueakJS\";\n entry[3] = true;\n }\n else entry = null;\n }\n this.popNandPushIfOK(argCount+1, this.makeStObject(entry)); // entry or nil\n return true;\n },\n primitiveDirectorySetMacTypeAndCreator: function(argCount) {\n return this.popNIfOK(argCount);\n },\n primitiveFileAtEnd: function(argCount) {\n var handle = this.stackNonInteger(0);\n if (!this.success || !handle.file) return false;\n this.popNandPushIfOK(argCount+1, this.makeStObject(handle.filePos >= handle.file.size));\n return true;\n },\n primitiveFileClose: function(argCount) {\n var handle = this.stackNonInteger(0);\n if (!this.success || !handle.file) return false;\n this.fileClose(handle.file);\n this.vm.breakOut(); // return to JS asap so async file handler can run\n handle.file = null;\n return this.popNIfOK(argCount);\n },\n primitiveFileDelete: function(argCount) {\n var fileNameObj = this.stackNonInteger(0);\n if (!this.success) return false;\n var fileName = this.filenameFromSqueak(fileNameObj.bytesAsString());\n this.success = Squeak.fileDelete(fileName);\n return this.popNIfOK(argCount);\n },\n primitiveFileFlush: function(argCount) {\n var handle = this.stackNonInteger(0);\n if (!this.success || !handle.file) return false;\n Squeak.flushFile(handle.file);\n this.vm.breakOut(); // return to JS asap so async file handler can run\n return this.popNIfOK(argCount);\n },\n primitiveFileGetPosition: function(argCount) {\n var handle = this.stackNonInteger(0);\n if (!this.success || !handle.file) return false;\n this.popNandPushIfOK(argCount + 1, this.makeLargeIfNeeded(handle.filePos));\n return true;\n },\n primitiveFileOpen: function(argCount) {\n var writeFlag = this.stackBoolean(0),\n fileNameObj = this.stackNonInteger(1);\n if (!this.success) return false;\n var fileName = this.filenameFromSqueak(fileNameObj.bytesAsString()),\n file = this.fileOpen(fileName, writeFlag);\n if (!file) return false;\n var handle = this.makeStArray([file.name]); // array contents irrelevant\n handle.file = file; // shared between handles\n handle.fileWrite = writeFlag; // specific to this handle\n handle.filePos = 0; // specific to this handle\n this.popNandPushIfOK(argCount+1, handle);\n return true;\n },\n primitiveFileRead: function(argCount) {\n var count = this.stackInteger(0),\n startIndex = this.stackInteger(1) - 1, // make zero based\n arrayObj = this.stackNonInteger(2),\n handle = this.stackNonInteger(3);\n if (!this.success || !handle.file) return false;\n if (!count) return this.popNandPushIfOK(argCount+1, 0);\n if (!arrayObj.bytes) {\n console.log(\"File reading into non-bytes object not implemented yet\");\n return false;\n }\n if (startIndex < 0 || startIndex + count > arrayObj.bytes.length)\n return false;\n return this.fileContentsDo(handle.file, function(file) {\n if (!file.contents)\n return this.popNandPushIfOK(argCount+1, 0);\n var srcArray = file.contents,\n dstArray = arrayObj.bytes;\n count = Math.min(count, file.size - handle.filePos);\n for (var i = 0; i < count; i++)\n dstArray[startIndex + i] = srcArray[handle.filePos++];\n this.popNandPushIfOK(argCount+1, count);\n }.bind(this));\n },\n primitiveFileRename: function(argCount) {\n var oldNameObj = this.stackNonInteger(1),\n newNameObj = this.stackNonInteger(0);\n if (!this.success) return false;\n var oldName = this.filenameFromSqueak(oldNameObj.bytesAsString()),\n newName = this.filenameFromSqueak(newNameObj.bytesAsString());\n this.success = Squeak.fileRename(oldName, newName);\n this.vm.breakOut(); // return to JS asap so async file handler can run\n return this.popNIfOK(argCount);\n },\n primitiveFileSetPosition: function(argCount) {\n var pos = this.stackPos32BitInt(0),\n handle = this.stackNonInteger(1);\n if (!this.success || !handle.file) return false;\n handle.filePos = pos;\n return this.popNIfOK(argCount);\n },\n primitiveFileSize: function(argCount) {\n var handle = this.stackNonInteger(0);\n if (!this.success || !handle.file) return false;\n this.popNandPushIfOK(argCount+1, this.makeLargeIfNeeded(handle.file.size));\n return true;\n },\n primitiveFileStdioHandles: function(argCount) {\n this.vm.warnOnce(\"Not yet implemented: primitiveFileStdioHandles\");\n return false;\n },\n primitiveFileTruncate: function(argCount) {\n console.warn(\"Not yet implemented: primitiveFileTruncate\");\n return false;\n },\n primitiveDisableFileAccess: function(argCount) {\n return this.fakePrimitive(\"FilePlugin.primitiveDisableFileAccess\", 0, argCount);\n },\n primitiveFileWrite: function(argCount) {\n var count = this.stackInteger(0),\n startIndex = this.stackInteger(1) - 1, // make zero based\n arrayObj = this.stackNonInteger(2),\n handle = this.stackNonInteger(3);\n if (!this.success || !handle.file || !handle.fileWrite) return false;\n if (!count) return this.popNandPushIfOK(argCount+1, 0);\n var array = arrayObj.bytes || arrayObj.wordsAsUint8Array();\n if (!array) return false;\n if (startIndex < 0 || startIndex + count > array.length)\n return false;\n return this.fileContentsDo(handle.file, function(file) {\n var srcArray = array,\n dstArray = file.contents || [];\n if (handle.filePos + count > dstArray.length) {\n var newSize = dstArray.length === 0 ? handle.filePos + count :\n Math.max(handle.filePos + count, dstArray.length + 10000);\n file.contents = new Uint8Array(newSize);\n file.contents.set(dstArray);\n dstArray = file.contents;\n }\n for (var i = 0; i < count; i++)\n dstArray[handle.filePos++] = srcArray[startIndex + i];\n if (handle.filePos > file.size) file.size = handle.filePos;\n file.modified = true;\n this.popNandPushIfOK(argCount+1, count);\n }.bind(this));\n },\n fileOpen: function(filename, writeFlag) {\n // if a file is opened for read and write at the same time,\n // they must share the contents. That's why all open files\n // are held in the ref-counted global SqueakFiles\n if (typeof SqueakFiles == 'undefined')\n window.SqueakFiles = {};\n var path = Squeak.splitFilePath(filename);\n if (!path.basename) return null; // malformed filename\n // fetch or create directory entry\n var directory = Squeak.dirList(path.dirname, true);\n if (!directory) return null;\n var entry = directory[path.basename],\n contents = null;\n if (entry) {\n // if it is open already, return it\n var file = SqueakFiles[path.fullname];\n if (file) {\n ++file.refCount;\n return file;\n }\n } else {\n if (!writeFlag) {\n console.log(\"File not found: \" + path.fullname);\n return null;\n }\n contents = new Uint8Array();\n entry = Squeak.filePut(path.fullname, contents.buffer);\n if (!entry) {\n console.log(\"Cannot create file: \" + path.fullname);\n return null;\n }\n }\n // make the file object\n var file = {\n name: path.fullname,\n size: entry[4], // actual file size, may differ from contents.length\n contents: contents, // possibly null, fetched when needed\n modified: false,\n refCount: 1\n };\n SqueakFiles[file.name] = file;\n return file;\n },\n fileClose: function(file) {\n Squeak.flushFile(file);\n if (--file.refCount == 0)\n delete SqueakFiles[file.name];\n },\n fileContentsDo: function(file, func) {\n if (file.contents) {\n func(file);\n } else {\n if (file.contents === false) // failed to get contents before\n return false;\n this.vm.freeze(function(unfreeze) {\n Squeak.fileGet(file.name,\n function success(contents) {\n file.contents = this.asUint8Array(contents);\n unfreeze();\n func(file);\n }.bind(this),\n function error(msg) {\n console.log(\"File get failed: \" + msg);\n file.contents = false;\n unfreeze();\n func(file);\n }.bind(this));\n }.bind(this));\n }\n return true;\n },\n},\n'DropPlugin', {\n primitiveDropRequestFileHandle: function(argCount) {\n var index = this.stackInteger(0),\n fileNames = this.display.droppedFiles || [];\n if (index < 1 || index > fileNames.length) return false;\n // same code as primitiveFileOpen()\n var fileName = fileNames[index - 1],\n file = this.fileOpen(fileName, false);\n if (!file) return false;\n var handle = this.makeStArray([fileName]); // array contents irrelevant\n handle.file = file; // shared between handles\n handle.fileWrite = false; // specific to this handle\n handle.filePos = 0; // specific to this handle\n this.popNandPushIfOK(argCount+1, handle);\n return true;\n },\n primitiveDropRequestFileName: function(argCount) {\n var index = this.stackInteger(0),\n fileNames = this.display.droppedFiles || [];\n if (index < 1 || index > fileNames.length) return false;\n var result = this.makeStString(this.filenameToSqueak(fileNames[index - 1]));\n return this.popNandPushIfOK(argCount, result);\n },\n},\n'SoundPlugin', {\n snd_primitiveSoundStart: function(argCount) {\n return this.snd_primitiveSoundStartWithSemaphore(argCount);\n },\n snd_primitiveSoundStartWithSemaphore: function(argCount) {\n var bufFrames = this.stackInteger(argCount-1),\n samplesPerSec = this.stackInteger(argCount-2),\n stereoFlag = this.stackBoolean(argCount-3),\n semaIndex = argCount > 3 ? this.stackInteger(argCount-4) : 0;\n if (!this.success) return false;\n this.audioContext = Squeak.startAudioOut();\n if (!this.audioContext) {\n this.vm.warnOnce(\"could not initialize audio\");\n return false;\n }\n this.audioSema = semaIndex; // signal when ready to accept another buffer of samples\n this.audioNextTimeSlot = 0;\n this.audioBuffersReady = [];\n this.audioBuffersUnused = [\n this.audioContext.createBuffer(stereoFlag ? 2 : 1, bufFrames, samplesPerSec),\n this.audioContext.createBuffer(stereoFlag ? 2 : 1, bufFrames, samplesPerSec),\n ];\n console.log(\"sound: started\");\n return this.popNIfOK(argCount);\n },\n snd_playNextBuffer: function() {\n if (!this.audioContext || this.audioBuffersReady.length === 0)\n return;\n var source = this.audioContext.createBufferSource();\n source.buffer = this.audioBuffersReady.shift();\n source.connect(this.audioContext.destination);\n if (this.audioNextTimeSlot < this.audioContext.currentTime) {\n if (this.audioNextTimeSlot > 0)\n console.warn(\"sound \" + this.audioContext.currentTime.toFixed(3) +\n \": buffer underrun by \" + (this.audioContext.currentTime - this.audioNextTimeSlot).toFixed(3) + \" s\");\n this.audioNextTimeSlot = this.audioContext.currentTime;\n }\n source.start(this.audioNextTimeSlot);\n //console.log(\"sound \" + this.audioContext.currentTime.toFixed(3) +\n // \": scheduling from \" + this.audioNextTimeSlot.toFixed(3) +\n // \" to \" + (this.audioNextTimeSlot + source.buffer.duration).toFixed(3));\n this.audioNextTimeSlot += source.buffer.duration;\n // source.onended is unreliable, using a timeout instead\n window.setTimeout(function() {\n if (!this.audioContext) return;\n // console.log(\"sound \" + this.audioContext.currentTime.toFixed(3) +\n // \": done, next time slot \" + this.audioNextTimeSlot.toFixed(3));\n this.audioBuffersUnused.push(source.buffer);\n if (this.audioSema) this.signalSemaphoreWithIndex(this.audioSema);\n this.vm.forceInterruptCheck();\n }.bind(this), (this.audioNextTimeSlot - this.audioContext.currentTime) * 1000);\n this.snd_playNextBuffer();\n },\n snd_primitiveSoundAvailableSpace: function(argCount) {\n if (!this.audioContext) {\n console.log(\"sound: no audio context\");\n return false;\n }\n var available = 0;\n if (this.audioBuffersUnused.length > 0) {\n var buf = this.audioBuffersUnused[0];\n available = buf.length * buf.numberOfChannels * 2;\n }\n return this.popNandPushIfOK(argCount + 1, available);\n },\n snd_primitiveSoundPlaySamples: function(argCount) {\n if (!this.audioContext || this.audioBuffersUnused.length === 0) {\n console.log(\"sound: play but no free buffers\");\n return false;\n }\n var count = this.stackInteger(2),\n sqSamples = this.stackNonInteger(1).wordsAsInt16Array(),\n startIndex = this.stackInteger(0) - 1;\n if (!this.success || !sqSamples) return false;\n var buffer = this.audioBuffersUnused.shift(),\n channels = buffer.numberOfChannels;\n for (var channel = 0; channel < channels; channel++) {\n var jsSamples = buffer.getChannelData(channel),\n index = startIndex + channel;\n for (var i = 0; i < count; i++) {\n jsSamples[i] = sqSamples[index] / 32768; // int16 -> float32\n index += channels;\n }\n }\n this.audioBuffersReady.push(buffer);\n this.snd_playNextBuffer();\n return this.popNIfOK(argCount);\n },\n snd_primitiveSoundPlaySilence: function(argCount) {\n if (!this.audioContext || this.audioBuffersUnused.length === 0) {\n console.log(\"sound: play but no free buffers\");\n return false;\n }\n var buffer = this.audioBuffersUnused.shift(),\n channels = buffer.numberOfChannels,\n count = buffer.length;\n for (var channel = 0; channel < channels; channel++) {\n var jsSamples = buffer.getChannelData(channel);\n for (var i = 0; i < count; i++)\n jsSamples[i] = 0;\n }\n this.audioBuffersReady.push(buffer);\n this.snd_playNextBuffer();\n return this.popNandPushIfOK(argCount + 1, count);\n },\n snd_primitiveSoundStop: function(argCount) {\n if (this.audioContext) {\n this.audioContext = null;\n this.audioBuffersReady = null;\n this.audioBuffersUnused = null;\n this.audioNextTimeSlot = 0;\n this.audioSema = 0;\n console.log(\"sound: stopped\");\n }\n return this.popNIfOK(argCount);\n },\n snd_primitiveSoundStartRecording: function(argCount) {\n if (argCount !== 3) return false;\n var rcvr = this.stackNonInteger(3),\n samplesPerSec = this.stackInteger(2),\n stereoFlag = this.stackBoolean(1),\n semaIndex = this.stackInteger(0);\n if (!this.success) return false;\n var method = this.primMethod,\n unfreeze = this.vm.freeze(),\n self = this;\n Squeak.startAudioIn(\n function onSuccess(audioContext, source) {\n console.log(\"sound: recording started\")\n self.audioInContext = audioContext;\n self.audioInSource = source;\n self.audioInSema = semaIndex;\n self.audioInBuffers = [];\n self.audioInBufferIndex = 0;\n self.audioInOverSample = 1;\n // if sample rate is still too high, adjust oversampling\n while (samplesPerSec * self.audioInOverSample < self.audioInContext.sampleRate)\n self.audioInOverSample *= 2;\n // make a buffer of at least 100 ms\n var bufferSize = self.audioInOverSample * 1024;\n while (bufferSize / self.audioInContext.sampleRate < 0.1)\n bufferSize *= 2;\n self.audioInProcessor = audioContext.createScriptProcessor(bufferSize, stereoFlag ? 2 : 1, stereoFlag ? 2 : 1);\n self.audioInProcessor.onaudioprocess = function(event) {\n self.snd_recordNextBuffer(event.inputBuffer);\n };\n self.audioInSource.connect(self.audioInProcessor);\n self.audioInProcessor.connect(audioContext.destination);\n self.vm.popN(argCount);\n window.setTimeout(unfreeze, 0);\n },\n function onError(msg) {\n console.warn(msg);\n self.vm.sendAsPrimitiveFailure(rcvr, method, argCount);\n window.setTimeout(unfreeze, 0);\n });\n return true;\n },\n snd_recordNextBuffer: function(audioBuffer) {\n if (!this.audioInContext) return;\n // console.log(\"sound \" + this.audioInContext.currentTime.toFixed(3) +\n // \": recorded \" + audioBuffer.duration.toFixed(3) + \" s\");\n if (this.audioInBuffers.length > 5)\n this.audioInBuffers.shift();\n this.audioInBuffers.push(audioBuffer);\n if (this.audioInSema) this.signalSemaphoreWithIndex(this.audioInSema);\n this.vm.forceInterruptCheck();\n },\n snd_primitiveSoundGetRecordingSampleRate: function(argCount) {\n if (!this.audioInContext) return false;\n var actualRate = this.audioInContext.sampleRate / this.audioInOverSample | 0;\n console.log(\"sound: actual recording rate \" + actualRate + \"x\" + this.audioInOverSample);\n return this.popNandPushIfOK(argCount + 1, actualRate);\n },\n snd_primitiveSoundRecordSamples: function(argCount) {\n var sqSamples = this.stackNonInteger(1).wordsAsInt16Array(),\n sqStartIndex = this.stackInteger(0) - 1;\n if (!this.success) return false;\n var sampleCount = 0;\n while (sqStartIndex < sqSamples.length) {\n if (this.audioInBuffers.length === 0) break;\n var buffer = this.audioInBuffers[0],\n channels = buffer.numberOfChannels,\n sqStep = channels,\n jsStep = this.audioInOverSample,\n sqCount = (sqSamples.length - sqStartIndex) / sqStep,\n jsCount = (buffer.length - this.audioInBufferIndex) / jsStep,\n count = Math.min(jsCount, sqCount);\n for (var channel = 0; channel < channels; channel++) {\n var jsSamples = buffer.getChannelData(channel),\n jsIndex = this.audioInBufferIndex,\n sqIndex = sqStartIndex + channel;\n for (var i = 0; i < count; i++) {\n sqSamples[sqIndex] = jsSamples[jsIndex] * 32768 & 0xFFFF; // float32 -> int16\n sqIndex += sqStep;\n jsIndex += jsStep;\n }\n }\n sampleCount += count * channels;\n sqStartIndex += count * channels;\n if (jsIndex < buffer.length) {\n this.audioInBufferIndex = jsIndex;\n } else {\n this.audioInBufferIndex = 0;\n this.audioInBuffers.shift();\n }\n }\n return this.popNandPushIfOK(argCount + 1, sampleCount);\n },\n snd_primitiveSoundStopRecording: function(argCount) {\n if (this.audioInContext) {\n this.audioInSource.disconnect();\n this.audioInProcessor.disconnect();\n this.audioInContext = null;\n this.audioInSema = 0;\n this.audioInBuffers = null;\n this.audioInSource = null;\n this.audioInProcessor = null;\n console.log(\"sound recording stopped\")\n }\n return true;\n },\n snd_primitiveSoundSetRecordLevel: function(argCount) {\n return true;\n },\n},\n'JPEGReadWriter2Plugin', {\n jpeg2_primJPEGPluginIsPresent: function(argCount) {\n return this.popNandPushIfOK(argCount + 1, this.vm.trueObj);\n },\n jpeg2_primImageHeight: function(argCount) {\n var decompressStruct = this.stackNonInteger(0).wordsOrBytes();\n if (!decompressStruct) return false;\n var height = decompressStruct[1];\n return this.popNandPushIfOK(argCount + 1, height);\n },\n jpeg2_primImageWidth: function(argCount) {\n var decompressStruct = this.stackNonInteger(0).wordsOrBytes();\n if (!decompressStruct) return false;\n var width = decompressStruct[0];\n return this.popNandPushIfOK(argCount + 1, width);\n },\n jpeg2_primJPEGCompressStructSize: function(argCount) {\n // no struct needed\n return this.popNandPushIfOK(argCount + 1, 0);\n },\n jpeg2_primJPEGDecompressStructSize: function(argCount) {\n // width, height, 32 bits each\n return this.popNandPushIfOK(argCount + 1, 8);\n },\n jpeg2_primJPEGErrorMgr2StructSize: function(argCount) {\n // no struct needed\n return this.popNandPushIfOK(argCount + 1, 0);\n },\n jpeg2_primJPEGReadHeaderfromByteArrayerrorMgr: function(argCount) {\n var decompressStruct = this.stackNonInteger(2).wordsOrBytes(),\n source = this.stackNonInteger(1).bytes;\n if (!decompressStruct || !source) return false;\n var unfreeze = this.vm.freeze();\n this.jpeg2_readImageFromBytes(source,\n function success(image) {\n this.jpeg2state = {src: source, img: image};\n decompressStruct[0] = image.width;\n decompressStruct[1] = image.height;\n unfreeze();\n }.bind(this),\n function error() {\n decompressStruct[0] = 0;\n decompressStruct[1] = 0;\n unfreeze();\n }.bind(this));\n return this.popNIfOK(argCount);\n },\n jpeg2_primJPEGReadImagefromByteArrayonFormdoDitheringerrorMgr: function(argCount) {\n var source = this.stackNonInteger(3).bytes,\n form = this.stackNonInteger(2).pointers,\n ditherFlag = this.stackBoolean(1);\n if (!this.success || !source || !form) return false;\n var state = this.jpeg2state;\n if (!state || state.src !== source) {\n console.error(\"jpeg read did not match header info\");\n return false;\n }\n var depth = form[Squeak.Form_depth],\n image = this.jpeg2_getPixelsFromImage(state.img),\n formBits = form[Squeak.Form_bits].words;\n if (depth === 32) {\n this.jpeg2_copyPixelsToForm32(image, formBits);\n } else if (depth === 16) {\n if (ditherFlag) this.jpeg2_ditherPixelsToForm16(image, formBits);\n else this.jpeg2_copyPixelsToForm16(image, formBits);\n } else return false;\n return this.popNIfOK(argCount);\n },\n jpeg2_primJPEGWriteImageonByteArrayformqualityprogressiveJPEGerrorMgr: function(argCount) {\n this.vm.warnOnce(\"JPEGReadWritePlugin2: writing not implemented yet\");\n return false;\n },\n jpeg2_readImageFromBytes: function(bytes, thenDo, errorDo) {\n var blob = new Blob([bytes], {type: \"image/jpeg\"}),\n image = new Image();\n image.onload = function() {\n thenDo(image);\n };\n image.onerror = function() {\n console.warn(\"could not render JPEG\");\n errorDo();\n };\n image.src = (window.URL || window.webkitURL).createObjectURL(blob);\n },\n jpeg2_getPixelsFromImage: function(image) {\n var canvas = document.createElement(\"canvas\"),\n context = canvas.getContext(\"2d\");\n canvas.width = image.width;\n canvas.height = image.height;\n context.drawImage(image, 0, 0);\n return context.getImageData(0, 0, image.width, image.height);\n },\n jpeg2_copyPixelsToForm32: function(image, formBits) {\n var pixels = image.data;\n for (var i = 0; i < formBits.length; i++) {\n var r = pixels[i*4 + 0],\n g = pixels[i*4 + 1],\n b = pixels[i*4 + 2];\n formBits[i] = 0xFF000000 | (r << 16) | (g << 8) | b;\n }\n },\n jpeg2_copyPixelsToForm16: function(image, formBits) {\n var width = image.width,\n height = image.height,\n pixels = image.data;\n for (var y = 0; y < height; y++)\n for (var x = 0; x < width; x += 2) {\n var i = y * height + x,\n r1 = pixels[i*4 + 0] >> 3,\n g1 = pixels[i*4 + 1] >> 3,\n b1 = pixels[i*4 + 2] >> 3,\n r2 = pixels[i*4 + 4] >> 3,\n g2 = pixels[i*4 + 5] >> 3,\n b2 = pixels[i*4 + 6] >> 3,\n formPix = (r1 << 10) | (g1 << 5) | b1;\n if (formPix === 0) formPix = 1;\n formPix = (formPix << 16) | (r2 << 10) | (g2 << 5) | b2;\n if ((formPix & 65535) === 0) formPix = formPix | 1;\n formBits[i >> 1] = formPix;\n }\n },\n jpeg2_ditherPixelsToForm16: function(image, formBits) {\n var width = image.width >> 1, // 2 pix a time\n height = image.height,\n pixels = image.data,\n ditherMatrix1 = [2, 0, 14, 12, 1, 3, 13, 15],\n ditherMatrix2 = [10, 8, 6, 4, 9, 11, 5, 7];\n for (var y = 0; y < height; y++)\n for (var x = 0; x < width; x++) {\n var i = (y * height + 2 * x) << 2,\n r1 = pixels[i + 0],\n g1 = pixels[i + 1],\n b1 = pixels[i + 2],\n r2 = pixels[i + 4],\n g2 = pixels[i + 5],\n b2 = pixels[i + 6];\n /* Do 4x4 ordered dithering. Taken from Form>>orderedDither32To16 */\n var v = ((y & 3) << 1) | (x & 1),\n dmv1 = ditherMatrix1[v],\n dmv2 = ditherMatrix2[v],\n di, dmi, dmo;\n di = (r1 * 496) >> 8, dmi = di & 15, dmo = di >> 4;\n if (dmv1 < dmi) { r1 = dmo+1; } else { r1 = dmo; };\n di = (g1 * 496) >> 8; dmi = di & 15; dmo = di >> 4;\n if (dmv1 < dmi) { g1 = dmo+1; } else { g1 = dmo; };\n di = (b1 * 496) >> 8; dmi = di & 15; dmo = di >> 4;\n if (dmv1 < dmi) { b1 = dmo+1; } else { b1 = dmo; };\n\n di = (r2 * 496) >> 8; dmi = di & 15; dmo = di >> 4;\n if (dmv2 < dmi) { r2 = dmo+1; } else { r2 = dmo; };\n di = (g2 * 496) >> 8; dmi = di & 15; dmo = di >> 4;\n if (dmv2 < dmi) { g2 = dmo+1; } else { g2 = dmo; };\n di = (b2 * 496) >> 8; dmi = di & 15; dmo = di >> 4;\n if (dmv2 < dmi) { b2 = dmo+1; } else { b2 = dmo; };\n\n var formPix = (r1 << 10) | (g1 << 5) | b1;\n if (formPix === 0) formPix = 1;\n formPix = (formPix << 16) | (r2 << 10) | (g2 << 5) | b2;\n if ((formPix & 65535) === 0) formPix = formPix | 1;\n formBits[i >> 3] = formPix;\n }\n },\n},\n'ScratchPluginAdditions', {\n // methods not handled by generated ScratchPlugin\n scratch_primitiveOpenURL: function(argCount) {\n var url = this.stackNonInteger(0).bytesAsString();\n if (url == \"\") return false;\n if (/^\\/SqueakJS\\//.test(url)) {\n url = url.slice(10); // remove file root\n var path = Squeak.splitFilePath(url),\n template = localStorage[\"squeak-template:\" + path.dirname];\n if (template) url = JSON.parse(template).url + \"/\" + path.basename;\n }\n window.open(url, \"_blank\"); // likely blocked as pop-up, but what can we do?\n return this.popNIfOK(argCount);\n },\n scratch_primitiveGetFolderPath: function(argCount) {\n var index = this.stackInteger(0);\n if (!this.success) return false;\n var path;\n switch (index) {\n case 1: path = '/'; break; // home dir\n // case 2: path = '/desktop'; break; // desktop\n // case 3: path = '/documents'; break; // documents\n // case 4: path = '/pictures'; break; // my pictures\n // case 5: path = '/music'; break; // my music\n }\n if (!path) return false;\n this.vm.popNandPush(argCount + 1, this.makeStString(this.filenameToSqueak(path)));\n return true;\n },\n},\n'JavaScriptPlugin', {\n js_primitiveDoUnderstand: function(argCount) {\n // This is JS's doesNotUnderstand handler,\n // as well as JS class's doesNotUnderstand handler.\n // Property name is the selector up to first colon. \n // If it is 'new', create an instance;\n // otherwise if the property is a function, call it;\n // otherwise if the property exists, get/set it;\n // otherwise, fail.\n var rcvr = this.stackNonInteger(1),\n obj = this.js_objectOrGlobal(rcvr),\n message = this.stackNonInteger(0).pointers,\n selector = message[0].bytesAsString(),\n args = message[1].pointers || [],\n isGlobal = !('jsObject' in rcvr),\n jsResult = null;\n try {\n // prevent callbacks while running this primitive\n this.js_activeCallback = \"Callbacks must be asynchronous\";\n var propName = selector.match(/([^:]*)/)[0];\n if (!isGlobal && propName === \"new\") {\n if (args.length === 0) {\n // new this()\n jsResult = new obj();\n } else {\n // new this(arg0, arg1, ...)\n var newArgs = [null].concat(this.js_fromStArray(args));\n jsResult = new (Function.prototype.bind.apply(obj, newArgs));\n }\n } else {\n if (!(propName in obj))\n return this.js_setError(\"Property not found: \" + propName);\n var propValue = obj[propName];\n if (typeof propValue == \"function\" && (!isGlobal || args.length > 0)) {\n // do this[selector](arg0, arg1, ...)\n jsResult = propValue.apply(obj, this.js_fromStArray(args));\n } else {\n if (args.length == 0) {\n // do this[selector]\n jsResult = propValue;\n } else if (args.length == 1) {\n // do this[selector] = arg0\n obj[propName] = this.js_fromStObject(args[0]);\n } else {\n // cannot do this[selector] = arg0, arg1, ...\n return this.js_setError(\"Property \" + propName + \" is not a function\");\n }\n }\n }\n } catch(err) {\n return this.js_setError(err.message);\n } finally {\n // allow callbacks\n this.js_activeCallback = null;\n }\n var stResult = this.makeStObject(jsResult, rcvr.sqClass);\n return this.popNandPushIfOK(argCount + 1, stResult);\n },\n js_primitiveAsString: function(argCount) {\n var obj = this.js_objectOrGlobal(this.stackNonInteger(0));\n return this.popNandPushIfOK(argCount + 1, this.makeStString(String(obj)));\n },\n js_primitiveTypeof: function(argCount) {\n var obj = this.js_objectOrGlobal(this.stackNonInteger(0));\n return this.popNandPushIfOK(argCount + 1, this.makeStString(typeof obj));\n },\n js_primitiveAt: function(argCount) {\n var rcvr = this.stackNonInteger(1),\n propName = this.vm.stackValue(0),\n propValue;\n try {\n var jsRcvr = this.js_objectOrGlobal(rcvr),\n jsPropName = this.js_fromStObject(propName),\n jsPropValue = jsRcvr[jsPropName];\n propValue = this.makeStObject(jsPropValue, rcvr.sqClass);\n } catch(err) {\n return this.js_setError(err.message);\n }\n return this.popNandPushIfOK(argCount + 1, propValue);\n },\n js_primitiveAtPut: function(argCount) {\n var rcvr = this.stackNonInteger(2),\n propName = this.vm.stackValue(1),\n propValue = this.vm.stackValue(0);\n try {\n var jsRcvr = this.js_objectOrGlobal(rcvr),\n jsPropName = this.js_fromStObject(propName),\n jsPropValue = this.js_fromStObject(propValue);\n jsRcvr[jsPropName] = jsPropValue;\n } catch(err) {\n return this.js_setError(err.message);\n }\n return this.popNandPushIfOK(argCount + 1, propValue);\n },\n js_primitiveSqueakAsJSObject: function(argCount) {\n var rcvr = this.stackNonInteger(1),\n arg = this.vm.stackValue(0);\n if (this.success) rcvr.jsObject = arg;\n return this.popNIfOK(argCount);\n },\n js_primitiveInitCallbacks: function(argCount) {\n // set callback semaphore for js_fromStBlock()\n this.js_callbackSema = this.stackInteger(0);\n this.js_activeCallback = null;\n return this.popNIfOK(argCount);\n },\n js_primitiveGetActiveCallbackBlock: function(argCount) {\n // we're inside an active callback, get block\n var callback = this.js_activeCallback;\n if (!callback) return this.js_setError(\"No active callback\");\n return this.popNandPushIfOK(argCount, callback.block);\n },\n js_primitiveGetActiveCallbackArgs: function(argCount) {\n // we're inside an active callback, get args\n var proxyClass = this.stackNonInteger(argCount),\n callback = this.js_activeCallback;\n if (!callback) return this.js_setError(\"No active callback\");\n try {\n // make array with expected number of arguments for block\n var numArgs = callback.block.pointers[Squeak.BlockContext_argumentCount],\n args = [];\n if (typeof numArgs !== 'number')\n numArgs = callback.block.pointers[Squeak.Closure_numArgs];\n for (var i = 0; i < numArgs; i++)\n args.push(callback.args[i]);\n return this.popNandPushIfOK(argCount, this.makeStArray(args, proxyClass));\n } catch(err) {\n return this.js_setError(err.message);\n }\n },\n js_primitiveReturnFromCallback: function(argCount) {\n if (argCount !== 1) return false;\n if (!this.js_activeCallback)\n return this.js_setError(\"No active callback\");\n // set result so the interpret loop in js_fromStBlock() terminates\n this.js_activeCallback.result = this.vm.pop();\n this.vm.breakOut(); // stop interpreting ASAP\n return true;\n },\n js_primitiveGetError: function(argCount) {\n var error = this.makeStObject(this.js_error);\n this.js_error = null;\n return this.popNandPushIfOK(argCount + 1, error);\n },\n js_setError: function(err) {\n this.js_error = String(err);\n return false;\n },\n js_fromStObject: function(obj) {\n if (typeof obj === \"number\") return obj;\n if (obj.jsObject) return obj.jsObject;\n if (obj.isFloat) return obj.float;\n if (obj.isNil) return null;\n if (obj.isTrue) return true;\n if (obj.isFalse) return false;\n if (obj.bytes || obj.sqClass === this.vm.specialObjects[Squeak.splOb_ClassString])\n return obj.bytesAsString();\n if (obj.sqClass === this.vm.specialObjects[Squeak.splOb_ClassArray])\n return this.js_fromStArray(obj.pointers || [], true);\n if (obj.sqClass === this.vm.specialObjects[Squeak.splOb_ClassBlockContext] ||\n obj.sqClass === this.vm.specialObjects[Squeak.splOb_ClassBlockClosure])\n return this.js_fromStBlock(obj);\n throw Error(\"asJSArgument needed for \" + obj);\n },\n js_fromStArray: function(objs, maybeDict) {\n if (objs.length > 0 && maybeDict && this.isAssociation(objs[0]))\n return this.js_fromStDict(objs);\n var jsArray = [];\n for (var i = 0; i < objs.length; i++)\n jsArray.push(this.js_fromStObject(objs[i]));\n return jsArray;\n },\n js_fromStDict: function(objs) {\n var jsDict = {};\n for (var i = 0; i < objs.length; i++) {\n var assoc = objs[i].pointers;\n if (!assoc || assoc.length !== 2) throw Error(assoc + \" is not an Association\");\n var jsKey = this.js_fromStObject(assoc[0]),\n jsValue = this.js_fromStObject(assoc[1]);\n jsDict[jsKey] = jsValue;\n }\n return jsDict;\n },\n js_fromStBlock: function(block) {\n // create callback function from block or closure\n if (!this.js_callbackSema) // image recognizes error string and will try again\n throw Error(\"CallbackSemaphore not set\");\n // block holds onto thisContext\n this.vm.reclaimableContextCount = 0;\n var squeak = this;\n return function evalSqueakBlock(/* arguments */) {\n return squeak.js_executeCallback(block, arguments);\n }\n },\n js_executeCallback: function(block, args) {\n if (this.js_activeCallback)\n if (typeof this.js_activeCallback == \"string\")\n throw Error(this.js_activeCallback);\n else\n return console.error(\"Callback: already active\");\n // make block and args available to primitiveGetActiveCallback\n this.js_activeCallback = {\n block: block,\n args: args,\n result: null,\n };\n // switch to callback handler process ASAP\n this.signalSemaphoreWithIndex(this.js_callbackSema);\n this.vm.forceInterruptCheck();\n // interpret until primitiveReturnFromCallback sets result\n var timeout = Date.now() + 500;\n while (Date.now() < timeout && !this.js_activeCallback.result)\n this.vm.interpret();\n var result = this.js_activeCallback.result;\n this.js_activeCallback = null;\n if (result) {\n // return result to JS caller as JS object or string\n try { return this.js_fromStObject(result); }\n catch(err) { return result.toString(); }\n } else {\n console.error(\"Callback error: \" + (this.vm.frozen ? \"frozen\" : \"timeout\"));\n }\n },\n js_objectOrGlobal: function(sqObject) {\n return 'jsObject' in sqObject ? sqObject.jsObject : window;\n },\n},\n'Obsolete', {\n primitiveFloatArrayAt: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveAt\", argCount);\n },\n primitiveFloatArrayMulFloatArray: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveMulFloatArray\", argCount);\n },\n primitiveFloatArrayAddScalar: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveAddScalar\", argCount);\n },\n primitiveFloatArrayDivFloatArray: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveDivFloatArray\", argCount);\n },\n primitiveFloatArrayDivScalar: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveDivScalar\", argCount);\n },\n primitiveFloatArrayHash: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveHash\", argCount);\n },\n primitiveFloatArrayAtPut: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveAtPut\", argCount);\n },\n primitiveFloatArrayMulScalar: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveMulScalar\", argCount);\n },\n primitiveFloatArrayAddFloatArray: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveAddFloatArray\", argCount);\n },\n primitiveFloatArraySubScalar: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveSubScalar\", argCount);\n },\n primitiveFloatArraySubFloatArray: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveSubFloatArray\", argCount);\n },\n primitiveFloatArrayEqual: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveEqual\", argCount);\n },\n primitiveFloatArrayDotProduct: function(argCount) {\n return this.namedPrimitive(\"FloatArrayPlugin\", \"primitiveDotProduct\", argCount);\n },\n m23PrimitiveInvertRectInto: function(argCount) {\n return this.namedPrimitive(\"Matrix2x3Plugin\", \"primitiveInvertRectInto\", argCount);\n },\n m23PrimitiveTransformPoint: function(argCount) {\n return this.namedPrimitive(\"Matrix2x3Plugin\", \"primitiveTransformPoint\", argCount);\n },\n m23PrimitiveIsPureTranslation: function(argCount) {\n return this.namedPrimitive(\"Matrix2x3Plugin\", \"primitiveIsPureTranslation\", argCount);\n },\n m23PrimitiveComposeMatrix: function(argCount) {\n return this.namedPrimitive(\"Matrix2x3Plugin\", \"primitiveComposeMatrix\", argCount);\n },\n m23PrimitiveTransformRectInto: function(argCount) {\n return this.namedPrimitive(\"Matrix2x3Plugin\", \"primitiveTransformRectInto\", argCount);\n },\n m23PrimitiveIsIdentity: function(argCount) {\n return this.namedPrimitive(\"Matrix2x3Plugin\", \"primitiveIsIdentity\", argCount);\n },\n m23PrimitiveInvertPoint: function(argCount) {\n return this.namedPrimitive(\"Matrix2x3Plugin\", \"primitiveInvertPoint\", argCount);\n },\n primitiveDeflateBlock: function(argCount) {\n return this.namedPrimitive(\"ZipPlugin\", \"primitiveDeflateBlock\", argCount);\n },\n primitiveDeflateUpdateHashTable: function(argCount) {\n return this.namedPrimitive(\"ZipPlugin\", \"primitiveDeflateUpdateHashTable\", argCount);\n },\n primitiveUpdateGZipCrc32: function(argCount) {\n return this.namedPrimitive(\"ZipPlugin\", \"primitiveUpdateGZipCrc32\", argCount);\n },\n primitiveInflateDecompressBlock: function(argCount) {\n return this.namedPrimitive(\"ZipPlugin\", \"primitiveInflateDecompressBlock\", argCount);\n },\n primitiveZipSendBlock: function(argCount) {\n return this.namedPrimitive(\"ZipPlugin\", \"primitiveZipSendBlock\", argCount);\n },\n primitiveFFTTransformData: function(argCount) {\n return this.namedPrimitive(\"FFTPlugin\", \"primitiveFFTTransformData\", argCount);\n },\n primitiveFFTScaleData: function(argCount) {\n return this.namedPrimitive(\"FFTPlugin\", \"primitiveFFTScaleData\", argCount);\n },\n primitiveFFTPermuteData: function(argCount) {\n return this.namedPrimitive(\"FFTPlugin\", \"primitiveFFTPermuteData\", argCount);\n },\n\tgePrimitiveMergeFillFrom: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveMergeFillFrom\", argCount);\n\t},\n\tgePrimitiveCopyBuffer: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveCopyBuffer\", argCount);\n\t},\n\tgePrimitiveAddRect: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddRect\", argCount);\n\t},\n\tgePrimitiveAddGradientFill: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddGradientFill\", argCount);\n\t},\n\tgePrimitiveSetClipRect: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveSetClipRect\", argCount);\n\t},\n\tgePrimitiveSetBitBltPlugin: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveSetBitBltPlugin\", argCount);\n\t},\n\tgePrimitiveRegisterExternalEdge: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveRegisterExternalEdge\", argCount);\n\t},\n\tgePrimitiveGetClipRect: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveGetClipRect\", argCount);\n\t},\n\tgePrimitiveAddBezier: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddBezier\", argCount);\n\t},\n\tgePrimitiveInitializeProcessing: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveInitializeProcessing\", argCount);\n\t},\n\tgePrimitiveRenderImage: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveRenderImage\", argCount);\n\t},\n\tgePrimitiveGetOffset: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveGetOffset\", argCount);\n\t},\n\tgePrimitiveSetDepth: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveSetDepth\", argCount);\n\t},\n\tgePrimitiveAddBezierShape: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddBezierShape\", argCount);\n\t},\n\tgePrimitiveSetEdgeTransform: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveSetEdgeTransform\", argCount);\n\t},\n\tgePrimitiveGetTimes: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveGetTimes\", argCount);\n\t},\n\tgePrimitiveNextActiveEdgeEntry: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveNextActiveEdgeEntry\", argCount);\n\t},\n\tgePrimitiveAddBitmapFill: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddBitmapFill\", argCount);\n\t},\n\tgePrimitiveGetDepth: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveGetDepth\", argCount);\n\t},\n\tgePrimitiveAbortProcessing: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAbortProcessing\", argCount);\n\t},\n\tgePrimitiveNextGlobalEdgeEntry: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveNextGlobalEdgeEntry\", argCount);\n\t},\n\tgePrimitiveGetFailureReason: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveGetFailureReason\", argCount);\n\t},\n\tgePrimitiveDisplaySpanBuffer: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveDisplaySpanBuffer\", argCount);\n\t},\n\tgePrimitiveGetCounts: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveGetCounts\", argCount);\n\t},\n\tgePrimitiveChangedActiveEdgeEntry: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveChangedActiveEdgeEntry\", argCount);\n\t},\n\tgePrimitiveRenderScanline: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveRenderScanline\", argCount);\n\t},\n\tgePrimitiveGetBezierStats: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveGetBezierStats\", argCount);\n\t},\n\tgePrimitiveFinishedProcessing: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveFinishedProcessing\", argCount);\n\t},\n\tgePrimitiveNeedsFlush: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveNeedsFlush\", argCount);\n\t},\n\tgePrimitiveAddLine: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddLine\", argCount);\n\t},\n\tgePrimitiveSetOffset: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveSetOffset\", argCount);\n\t},\n\tgePrimitiveNextFillEntry: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveNextFillEntry\", argCount);\n\t},\n\tgePrimitiveInitializeBuffer: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveInitializeBuffer\", argCount);\n\t},\n\tgePrimitiveDoProfileStats: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveDoProfileStats\", argCount);\n\t},\n\tgePrimitiveAddActiveEdgeEntry: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddActiveEdgeEntry\", argCount);\n\t},\n\tgePrimitiveSetAALevel: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveSetAALevel\", argCount);\n\t},\n\tgePrimitiveNeedsFlushPut: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveNeedsFlushPut\", argCount);\n\t},\n\tgePrimitiveAddCompressedShape: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddCompressedShape\", argCount);\n\t},\n\tgePrimitiveSetColorTransform: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveSetColorTransform\", argCount);\n\t},\n\tgePrimitiveAddOval: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddOval\", argCount);\n\t},\n\tgePrimitiveRegisterExternalFill: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveRegisterExternalFill\", argCount);\n\t},\n\tgePrimitiveAddPolygon: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveAddPolygon\", argCount);\n\t},\n\tgePrimitiveGetAALevel: function(argCount) {\n\t return this.namedPrimitive(\"B2DPlugin\", \"primitiveGetAALevel\", argCount);\n\t},\n});\n\nObject.subclass('Squeak.InterpreterProxy',\n// provides function names exactly like the C interpreter, for ease of porting\n// but maybe less efficiently because of the indirection\n// only used for plugins translated from Slang (see plugins/*.js)\n// built-in primitives use the interpreter directly\n'initialization', {\n VM_PROXY_MAJOR: 1,\n VM_PROXY_MINOR: 11,\n initialize: function(vm) {\n this.vm = vm;\n this.remappableOops = [];\n Object.defineProperty(this, 'successFlag', {\n get: function() { return vm.primHandler.success; },\n set: function(success) { vm.primHandler.success = success; },\n });\n },\n majorVersion: function() {\n return this.VM_PROXY_MAJOR;\n },\n minorVersion: function() {\n return this.VM_PROXY_MINOR;\n },\n},\n'success',\n{\n failed: function() {\n return !this.successFlag;\n },\n primitiveFail: function() {\n this.successFlag = false;\n },\n primitiveFailFor: function(reasonCode) {\n this.successFlag = false;\n },\n success: function(boolean) {\n if (!boolean) this.successFlag = false;\n },\n},\n'stack access',\n{\n pop: function(n) {\n this.vm.popN(n);\n },\n popthenPush: function(n, obj) {\n this.vm.popNandPush(n, obj);\n },\n push: function(obj) {\n this.vm.push(obj);\n },\n pushBool: function(bool) {\n this.vm.push(bool ? this.vm.trueObj : this.vm.falseObj);\n },\n pushInteger: function(int) {\n this.vm.push(int);\n },\n pushFloat: function(num) {\n this.vm.push(this.floatObjectOf(num));\n },\n stackValue: function(n) {\n return this.vm.stackValue(n);\n },\n stackIntegerValue: function(n) {\n var int = this.vm.stackValue(n);\n if (typeof int === \"number\") return int;\n this.successFlag = false;\n return 0;\n },\n stackFloatValue: function(n) {\n this.vm.success = true;\n var float = this.vm.stackIntOrFloat(n);\n if (this.vm.success) return float;\n this.successFlag = false;\n return 0;\n },\n stackObjectValue: function(n) {\n var obj = this.vm.stackValue(n);\n if (typeof obj !== \"number\") return obj;\n this.successFlag = false;\n return this.vm.nilObj;\n },\n stackBytes: function(n) {\n var oop = this.vm.stackValue(n);\n if (oop.bytes) return oop.bytes;\n if (typeof oop === \"number\" || !oop.isBytes()) this.successFlag = false;\n return [];\n },\n stackWords: function(n) {\n var oop = this.vm.stackValue(n);\n if (oop.words) return oop.words;\n if (typeof oop === \"number\" || !oop.isWords()) this.successFlag = false;\n return [];\n },\n stackInt32Array: function(n) {\n var oop = this.vm.stackValue(n);\n if (oop.words) return oop.wordsAsInt32Array();\n if (typeof oop === \"number\" || !oop.isWords()) this.successFlag = false;\n return [];\n },\n stackInt16Array: function(n) {\n var oop = this.vm.stackValue(n);\n if (oop.words) return oop.wordsAsInt16Array();\n if (typeof oop === \"number\" || !oop.isWords()) this.successFlag = false;\n return [];\n },\n stackUint16Array: function(n) {\n var oop = this.vm.stackValue(n);\n if (oop.words) return oop.wordsAsUint16Array();\n if (typeof oop === \"number\" || !oop.isWords()) this.successFlag = false;\n return [];\n },\n},\n'object access',\n{\n isBytes: function(obj) {\n return typeof obj !== \"number\" && obj.isBytes();\n },\n isWords: function(obj) {\n return typeof obj !== \"number\" && obj.isWords();\n },\n isWordsOrBytes: function(obj) {\n return typeof obj !== \"number\" && obj.isWordsOrBytes();\n },\n isPointers: function(obj) {\n return typeof obj !== \"number\" && obj.isPointers();\n },\n isIntegerValue: function(obj) {\n return typeof obj === \"number\" && obj >= -0x40000000 && obj <= 0x3FFFFFFF;\n },\n isArray: function(obj) {\n return obj.sqClass === this.vm.specialObjects[Squeak.splOb_ClassArray];\n },\n isMemberOf: function(obj, className) {\n var nameBytes = obj.sqClass.pointers[Squeak.Class_name].bytes;\n if (className.length !== nameBytes.length) return false;\n for (var i = 0; i < className.length; i++)\n if (className.charCodeAt(i) !== nameBytes[i]) return false;\n return true;\n },\n booleanValueOf: function(obj) {\n if (obj.isTrue) return true;\n if (obj.isFalse) return false;\n this.successFlag = false;\n return false;\n },\n positive32BitValueOf: function(obj) {\n return this.vm.primHandler.positive32BitValueOf(obj);\n },\n positive32BitIntegerFor: function(int) {\n return this.vm.primHandler.pos32BitIntFor(int);\n },\n floatValueOf: function(obj) {\n if (obj.isFloat) return obj.float;\n this.successFlag = false;\n return 0;\n },\n floatObjectOf: function(num) {\n return this.vm.primHandler.makeFloat(num);\n },\n fetchPointerofObject: function(n, obj) {\n return obj.pointers[n];\n },\n fetchBytesofObject: function(n, obj) {\n var oop = obj.pointers[n];\n if (oop.bytes) return oop.bytes;\n if (oop.words) return oop.wordsAsUint8Array();\n if (typeof oop === \"number\" || !oop.isWordsOrBytes()) this.successFlag = false;\n return [];\n },\n fetchWordsofObject: function(n, obj) {\n var oop = obj.pointers[n];\n if (oop.words) return oop.words;\n if (typeof oop === \"number\" || !oop.isWords()) this.successFlag = false;\n return [];\n },\n fetchInt32ArrayofObject: function(n, obj) {\n var oop = obj.pointers[n];\n if (oop.words) return oop.wordsAsInt32Array();\n if (typeof oop === \"number\" || !oop.isWords()) this.successFlag = false;\n return [];\n },\n fetchInt16ArrayofObject: function(n, obj) {\n var oop = obj.pointers[n];\n if (oop.words) return oop.wordsAsInt16Array();\n if (typeof oop === \"number\" || !oop.isWords()) this.successFlag = false;\n return [];\n },\n fetchUint16ArrayofObject: function(n, obj) {\n var oop = obj.pointers[n];\n if (oop.words) return oop.wordsAsUint16Array();\n if (typeof oop === \"number\" || !oop.isWords()) this.successFlag = false;\n return [];\n },\n fetchIntegerofObject: function(n, obj) {\n var int = obj.pointers[n];\n if (typeof int === \"number\") return int;\n this.successFlag = false;\n return 0;\n },\n fetchLong32ofObject: function(n, obj) {\n return obj.words[n];\n },\n fetchFloatofObject: function(n, obj) {\n return this.floatValueOf(obj.pointers[n]);\n },\n storeIntegerofObjectwithValue: function(n, obj, value) {\n if (typeof value === \"number\")\n obj.pointers[n] = value;\n else this.successFlag = false;\n },\n storePointerofObjectwithValue: function(n, obj, value) {\n obj.pointers[n] = value;\n },\n stObjectatput: function(array, index, obj) {\n if (array.sqClass !== this.classArray()) throw Error(\"Array expected\");\n if (index < 1 || index >= array.pointers.length) return this.successFlag = false;\n array.pointers[index] = obj;\n },\n},\n'constant access',\n{\n isKindOfInteger: function(obj) {\n return typeof obj === \"number\" ||\n obj.sqClass == this.classLargeNegativeInteger() ||\n obj.sqClass == this.classLargePositiveInteger();\n },\n classArray: function() {\n return this.vm.specialObjects[Squeak.splOb_ClassArray];\n },\n classBitmap: function() {\n return this.vm.specialObjects[Squeak.splOb_ClassBitmap];\n },\n classSmallInteger: function() {\n return this.vm.specialObjects[Squeak.splOb_ClassInteger];\n },\n classLargePositiveInteger: function() {\n return this.vm.specialObjects[Squeak.splOb_ClassLargePositiveInteger];\n },\n classLargeNegativeInteger: function() {\n return this.vm.specialObjects[Squeak.splOb_ClassLargeNegativeInteger];\n },\n classPoint: function() {\n return this.vm.specialObjects[Squeak.splOb_ClassPoint];\n },\n classString: function() {\n return this.vm.specialObjects[Squeak.splOb_ClassString];\n },\n nilObject: function() {\n return this.vm.nilObj;\n },\n falseObject: function() {\n return this.vm.falseObj;\n },\n trueObject: function() {\n return this.vm.trueObj;\n },\n},\n'vm functions',\n{\n instantiateClassindexableSize: function(aClass, indexableSize) {\n return this.vm.instantiateClass(aClass, indexableSize);\n },\n methodArgumentCount: function() {\n return this.argCount;\n },\n makePointwithxValueyValue: function(x, y) {\n return this.vm.primHandler.makePointWithXandY(x, y);\n },\n pushRemappableOop: function(obj) {\n this.remappableOops.push(obj);\n },\n popRemappableOop: function() {\n return this.remappableOops.pop();\n },\n showDisplayBitsLeftTopRightBottom: function(form, left, top, right, bottom) {\n if (left < right && top < bottom) {\n var rect = {left: left, top: top, right: right, bottom: bottom};\n this.vm.primHandler.displayDirty(form, rect);\n }\n },\n ioLoadFunctionFrom: function(funcName, pluginName) {\n return this.vm.primHandler.loadFunctionFrom(funcName, pluginName);\n },\n});\n\n\nObject.subclass('Squeak.InstructionPrinter',\n'initialization', {\n initialize: function(method, vm) {\n this.method = method;\n this.vm = vm;\n },\n},\n'printing', {\n printInstructions: function(indent, highlight, highlightPC) {\n // all args are optional\n this.indent = indent; // prepend to every line except if highlighted\n this.highlight = highlight; // prepend to highlighted line\n this.highlightPC = highlightPC; // PC of highlighted line\n this.innerIndents = {};\n this.result = '';\n this.scanner = new Squeak.InstructionStream(this.method, this.vm);\n this.oldPC = this.scanner.pc;\n this.endPC = 0; // adjusted while scanning\n this.done = false;\n while (!this.done)\n this.scanner.interpretNextInstructionFor(this);\n return this.result;\n },\n print: function(instruction) {\n if (this.oldPC === this.highlightPC) {\n if (this.highlight) this.result += this.highlight;\n } else {\n if (this.indent) this.result += this.indent;\n }\n this.result += this.oldPC;\n for (var i = 0; i < this.innerIndents[this.oldPC] || 0; i++)\n this.result += \" \";\n this.result += \" <\";\n for (var i = this.oldPC; i < this.scanner.pc; i++) {\n if (i > this.oldPC) this.result += \" \";\n this.result += (this.method.bytes[i]+0x100).toString(16).substr(-2).toUpperCase(); // padded hex\n }\n this.result += \"> \" + instruction + \"\\n\";\n this.oldPC = this.scanner.pc;\n }\n},\n'decoding', {\n blockReturnTop: function() {\n this.print('blockReturn');\n },\n doDup: function() {\n this.print('dup');\n },\n doPop: function() {\n this.print('pop');\n },\n jump: function(offset) {\n this.print('jumpTo: ' + (this.scanner.pc + offset));\n if (this.scanner.pc + offset > this.endPC) this.endPC = this.scanner.pc + offset;\n },\n jumpIf: function(condition, offset) {\n this.print((condition ? 'jumpIfTrue: ' : 'jumpIfFalse: ') + (this.scanner.pc + offset));\n if (this.scanner.pc + offset > this.endPC) this.endPC = this.scanner.pc + offset;\n },\n methodReturnReceiver: function() {\n this.print('return: receiver');\n this.done = this.scanner.pc > this.endPC;\n },\n methodReturnTop: function() {\n this.print('return: topOfStack');\n this.done = this.scanner.pc > this.endPC;\n },\n methodReturnConstant: function(obj) {\n this.print('returnConst: ' + obj.toString());\n this.done = this.scanner.pc > this.endPC;\n },\n popIntoLiteralVariable: function(anAssociation) {\n this.print('popIntoBinding: ' + anAssociation.assnKeyAsString());\n },\n popIntoReceiverVariable: function(offset) {\n this.print('popIntoInstVar: ' + offset);\n },\n popIntoTemporaryVariable: function(offset) {\n this.print('popIntoTemp: ' + offset);\n },\n pushActiveContext: function() {\n this.print('push: thisContext');\n },\n pushConstant: function(obj) {\n var value = obj.sqInstName ? obj.sqInstName() : obj.toString();\n this.print('pushConst: ' + value);\n },\n pushLiteralVariable: function(anAssociation) {\n this.print('pushBinding: ' + anAssociation.assnKeyAsString());\n },\n pushReceiver: function() {\n this.print('push: self');\n },\n pushReceiverVariable: function(offset) {\n this.print('pushInstVar: ' + offset);\n },\n pushTemporaryVariable: function(offset) {\n this.print('pushTemp: ' + offset);\n },\n send: function(selector, numberArguments, supered) {\n this.print( (supered ? 'superSend: #' : 'send: #') + (selector.bytesAsString ? selector.bytesAsString() : selector));\n },\n storeIntoLiteralVariable: function(anAssociation) {\n this.print('storeIntoBinding: ' + anAssociation.assnKeyAsString());\n },\n storeIntoReceiverVariable: function(offset) {\n this.print('storeIntoInstVar: ' + offset);\n },\n storeIntoTemporaryVariable: function(offset) {\n this.print('storeIntoTemp: ' + offset);\n },\n pushNewArray: function(size) {\n this.print('push: (Array new: ' + size + ')');\n },\n popIntoNewArray: function(numElements) {\n this.print('pop: ' + numElements + ' into: (Array new: ' + numElements + ')');\n },\n pushRemoteTemp: function(offset , arrayOffset) {\n this.print('push: ' + offset + ' ofTemp: ' + arrayOffset);\n },\n storeIntoRemoteTemp: function(offset , arrayOffset) {\n this.print('storeInto: ' + offset + ' ofTemp: ' + arrayOffset);\n },\n popIntoRemoteTemp: function(offset , arrayOffset) {\n this.print('popInto: ' + offset + ' ofTemp: ' + arrayOffset);\n },\n pushClosureCopy: function(numCopied, numArgs, blockSize) {\n var from = this.scanner.pc,\n to = from + blockSize;\n this.print('closure(' + from + '-' + (to-1) + '): ' + numCopied + ' copied, ' + numArgs + ' args');\n for (var i = from; i < to; i++)\n this.innerIndents[i] = (this.innerIndents[i] || 0) + 1;\n if (to > this.endPC) this.endPC = to;\n },\n});\n\nObject.subclass('Squeak.InstructionStream',\n'initialization', {\n initialize: function(method, vm) {\n this.vm = vm;\n this.method = method;\n this.pc = 0;\n this.specialConstants = [vm.trueObj, vm.falseObj, vm.nilObj, -1, 0, 1, 2];\n },\n},\n'decoding',\n{\n interpretNextInstructionFor: function(client) {\n // Send to the argument, client, a message that specifies the type of the next instruction.\n var method = this.method;\n var byte = method.bytes[this.pc++];\n var type = (byte / 16) | 0;\n var offset = byte % 16;\n if (type === 0) return client.pushReceiverVariable(offset);\n if (type === 1) return client.pushTemporaryVariable(offset);\n if (type === 2) return client.pushConstant(method.methodGetLiteral(offset));\n if (type === 3) return client.pushConstant(method.methodGetLiteral(offset + 16));\n if (type === 4) return client.pushLiteralVariable(method.methodGetLiteral(offset));\n if (type === 5) return client.pushLiteralVariable(method.methodGetLiteral(offset + 16));\n if (type === 6)\n if (offset<8) return client.popIntoReceiverVariable(offset)\n else return client.popIntoTemporaryVariable(offset-8);\n if (type === 7) {\n if (offset===0) return client.pushReceiver()\n if (offset < 8) return client.pushConstant(this.specialConstants[offset - 1])\n if (offset===8) return client.methodReturnReceiver();\n if (offset < 12) return client.methodReturnConstant(this.specialConstants[offset - 9]);\n if (offset===12) return client.methodReturnTop();\n if (offset===13) return client.blockReturnTop();\n if (offset > 13) throw Error(\"unusedBytecode\");\n }\n if (type === 8) return this.interpretExtension(offset, method, client);\n if (type === 9) // short jumps\n if (offset<8) return client.jump(offset+1);\n else return client.jumpIf(false, offset-8+1);\n if (type === 10) {// long jumps\n byte = this.method.bytes[this.pc++];\n if (offset<8) return client.jump((offset-4)*256 + byte);\n else return client.jumpIf(offset<12, (offset & 3)*256 + byte);\n }\n if (type === 11)\n return client.send(this.vm.specialSelectors[2 * offset],\n this.vm.specialSelectors[2 * offset + 1],\n false);\n if (type === 12)\n return client.send(this.vm.specialSelectors[2 * (offset + 16)],\n this.vm.specialSelectors[2 * (offset + 16) + 1],\n false);\n if (type > 12)\n return client.send(method.methodGetLiteral(offset), type-13, false);\n },\n interpretExtension: function(offset, method, client) {\n if (offset <= 6) { // Extended op codes 128-134\n var byte2 = this.method.bytes[this.pc++];\n if (offset <= 2) { // 128-130: extended pushes and pops\n var type = byte2 / 64 | 0;\n var offset2 = byte2 % 64;\n if (offset === 0) {\n if (type === 0) return client.pushReceiverVariable(offset2);\n if (type === 1) return client.pushTemporaryVariable(offset2);\n if (type === 2) return client.pushConstant(this.method.methodGetLiteral(offset2));\n if (type === 3) return client.pushLiteralVariable(this.method.methodGetLiteral(offset2));\n }\n if (offset === 1) {\n if (type === 0) return client.storeIntoReceiverVariable(offset2);\n if (type === 1) return client.storeIntoTemporaryVariable(offset2);\n if (type === 2) throw Error(\"illegalStore\");\n if (type === 3) return client.storeIntoLiteralVariable(this.method.methodGetLiteral(offset2));\n }\n if (offset === 2) {\n if (type === 0) return client.popIntoReceiverVariable(offset2);\n if (type === 1) return client.popIntoTemporaryVariable(offset2);\n if (type === 2) throw Error(\"illegalStore\");\n if (type === 3) return client.popIntoLiteralVariable(this.method.methodGetLiteral(offset2));\n }\n }\n // 131-134 (extended sends)\n if (offset === 3) // Single extended send\n return client.send(this.method.methodGetLiteral(byte2 % 32), byte2 / 32 | 0, false);\n if (offset === 4) { // Double extended do-anything\n var byte3 = this.method.bytes[this.pc++];\n var type = byte2 / 32 | 0;\n if (type === 0) return client.send(this.method.methodGetLiteral(byte3), byte2 % 32, false);\n if (type === 1) return client.send(this.method.methodGetLiteral(byte3), byte2 % 32, true);\n if (type === 2) return client.pushReceiverVariable(byte3);\n if (type === 3) return client.pushConstant(this.method.methodGetLiteral(byte3));\n if (type === 4) return client.pushLiteralVariable(this.method.methodGetLiteral(byte3));\n if (type === 5) return client.storeIntoReceiverVariable(byte3);\n if (type === 6) return client.popIntoReceiverVariable(byte3);\n if (type === 7) return client.storeIntoLiteralVariable(this.method.methodGetLiteral(byte3));\n }\n if (offset === 5) // Single extended send to super\n return client.send(this.method.methodGetLiteral(byte2 & 31), byte2 >> 5, true);\n if (offset === 6) // Second extended send\n return client.send(this.method.methodGetLiteral(byte2 & 63), byte2 >> 6, false);\n }\n if (offset === 7) return client.doPop();\n if (offset === 8) return client.doDup();\n if (offset === 9) return client.pushActiveContext();\n // closures\n var byte2 = this.method.bytes[this.pc++];\n if (offset === 10)\n return byte2 < 128 ? client.pushNewArray(byte2) : client.popIntoNewArray(byte2 - 128);\n if (offset === 11) throw Error(\"unusedBytecode\");\n var byte3 = this.method.bytes[this.pc++];\n if (offset === 12) return client.pushRemoteTemp(byte2, byte3);\n if (offset === 13) return client.storeIntoRemoteTemp(byte2, byte3);\n if (offset === 14) return client.popIntoRemoteTemp(byte2, byte3);\n // offset === 15\n var byte4 = this.method.bytes[this.pc++];\n return client.pushClosureCopy(byte2 >> 4, byte2 & 0xF, (byte3 * 256) + byte4);\n }\n});\n\n}) // end of module\n","module('users.bert.SqueakJS.jit').requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\"; \n/*\n * Copyright (c) 2014-2016 Bert Freudenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nObject.subclass('Squeak.Compiler',\n\n/****************************************************************************\n\nVM and Compiler\n===============\n\nThe VM has an interpreter, it will work fine (and much more memory-efficient)\nwithout loading a compiler. The compiler plugs into the VM by providing the\nSqueak.Compiler global. It can be easily replaced by just loading a different\nscript providing Squeak.Compiler.\n\nThe VM creates the compiler instance after an image has been loaded and the VM\nbeen initialized. Whenever a method is activated that was not compiled yet, the\ncompiler gets a chance to compile it. The compiler may decide to wait for a couple\nof activations before actually compiling it. This might prevent do-its from ever\ngetting compiled, because they are only activated once. Therefore, the compiler\nis also called when a long-running non-optimized loop calls checkForInterrupts.\nFinally, whenever the interpreter is about to execute a bytecode, it calls the\ncompiled method instead (which typically will execute many bytecodes):\n\n initialize:\n compiler = new Squeak.Compiler(vm);\n\n executeNewMethod, checkForInterrupts:\n if (!method.compiled && compiler)\n compiler.compile(method);\n\n interpret:\n if (method.compiled) method.compiled(vm);\n\nNote that a compiler could hook itself into a compiled method by dispatching\nto vm.compiler in the generated code. This would allow gathering statistics,\nrecompiling with optimized code etc.\n\n\nAbout This Compiler\n===================\n\nThe compiler in this file is meant to be simple, fast-compiling, and general.\nIt transcribes bytecodes 1-to-1 into equivalent JavaScript code using\ntemplates (and thus can even support single-stepping). It uses the\ninterpreter's stack pointer (SP) and program counter (PC), actual context\nobjects just like the interpreter, no register mapping, it does not optimize\nsends, etc.\n\nJumps are handled by wrapping the whole method in a loop and switch. This also\nenables continuing in the middle of a compiled method: whenever another context\nis activated, the method returns to the main loop, and is entered again later\nwith a different PC. Here is an example method, its bytecodes, and a simplified\nversion of the generated JavaScript code:\n\n method\n [value selector] whileFalse.\n ^ 42\n\n 0 <00> pushInstVar: 0\n 1 send: #selector\n 2 jumpIfTrue: 6\n 4 jumpTo: 0\n 6 <21> pushConst: 42\n 7 <7C> return: topOfStack\n\n while (true) switch (vm.pc) {\n case 0:\n stack[++vm.sp] = inst[0];\n vm.pc = 2; vm.send(#selector);\n return 0;\n case 2:\n if (stack[vm.sp--] === vm.trueObj) {\n vm.pc = 6;\n continue; // jump to case 6\n }\n // otherwise fall through to next case\n case 4:\n vm.pc = 0;\n continue; // jump to case 0\n case 6:\n stack[++vm.sp] = 42;\n vm.pc = 7; vm.doReturn(stack[vm.sp]);\n return 0;\n }\n\nThe compiled method should return the number of bytecodes executed, but for\nstatistical purposes only. It's fine to return 0.\n\nDebugging support\n=================\n\nThis compiler supports generating single-stepping code and comments, which are\nrather helpful during debugging.\n\nNormally, only bytecodes that can be a jump target are given a label. Also,\nbytecodes following a send operation need a label, to enable returning to that\nspot after the context switch. All other bytecodes are executed continuously.\n\nWhen compiling for single-stepping, each bytecode gets a label, and after each\nbytecode a flag is checked and the method returns if needed. Because this is\na performance penalty, methods are first compiled without single-step support, \nand recompiled for single-stepping on demand.\n\nThis is optional, another compiler can answer false from enableSingleStepping().\nIn that case the VM will delete the compiled method and invoke the interpreter\nto single-step.\n\n*****************************************************************************/\n\n'initialization', {\n initialize: function(vm) {\n this.vm = vm;\n this.comments = !!Squeak.Compiler.comments, // generate comments\n // for debug-printing only\n this.specialSelectors = ['+', '-', '<', '>', '<=', '>=', '=', '~=', '*', '/', '\\\\', '@',\n 'bitShift:', '//', 'bitAnd:', 'bitOr:', 'at:', 'at:put:', 'size', 'next', 'nextPut:',\n 'atEnd', '==', 'class', 'blockCopy:', 'value', 'value:', 'do:', 'new', 'new:', 'x', 'y'];\n },\n},\n'accessing', {\n compile: function(method, optClass, optSel) {\n if (!method.isHot) {\n // 1st time\n method.isHot = true;\n } else {\n // 2nd time\n this.singleStep = false;\n this.debug = this.comments;\n var clsName = optClass && optClass.className(),\n sel = optSel && optSel.bytesAsString();\n method.compiled = this.generate(method, clsName, sel);\n }\n },\n enableSingleStepping: function(method, optClass, optSel) {\n // recompile method for single-stepping\n if (!method.compiled || !method.compiled.canSingleStep) {\n this.singleStep = true; // generate breakpoint support\n this.debug = true;\n var clsAndSel = this.vm.printMethod(method, optClass, optSel).split(\">>\"); // likely expensive\n method.compiled = this.generate(method, clsAndSel[0], clsAndSel[1]);\n method.compiled.canSingleStep = true;\n }\n // if a compiler does not support single-stepping, return false\n return true;\n },\n functionNameFor: function(cls, sel) {\n if (!cls || !sel) return \"Squeak_DOIT\";\n if (!/[^a-zA-Z0-9:_]/.test(sel))\n return (cls + \"_\" + sel).replace(/[: ]/g, \"_\");\n var op = sel.replace(/./g, function(char) {\n var repl = {'|': \"OR\", '~': \"NOT\", '<': \"LT\", '=': \"EQ\", '>': \"GT\",\n '&': \"AND\", '@': \"AT\", '*': \"TIMES\", '+': \"PLUS\", '\\\\': \"MOD\",\n '-': \"MINUS\", ',': \"COMMA\", '/': \"DIV\", '?': \"IF\"}[char];\n return repl || 'OPERATOR';\n });\n return cls.replace(/[ ]/, \"_\") + \"__\" + op + \"__\";\n },\n},\n'generating',\n{\n generate: function(method, optClass, optSel) {\n this.method = method;\n this.pc = 0; // next bytecode\n this.endPC = 0; // pc of furthest jump target\n this.prevPC = 0; // pc at start of current instruction\n this.source = []; // snippets will be joined in the end\n this.sourceLabels = {}; // source pos of generated labels \n this.needsLabel = {0: true}; // jump targets\n this.needsBreak = false; // insert break check for previous bytecode\n if (optClass && optSel)\n this.source.push(\"// \", optClass, \">>\", optSel, \"\\n\");\n this.source.push(\n \"var context = vm.activeContext,\\n\",\n \" stack = context.pointers,\\n\",\n \" rcvr = vm.receiver,\\n\",\n \" inst = rcvr.pointers,\\n\",\n \" temp = vm.homeContext.pointers,\\n\",\n \" lit = vm.method.pointers,\\n\",\n \" bytecodes = 0 - vm.pc;\\n\",\n \"while (true) switch (vm.pc) {\\n\"\n );\n this.done = false;\n while (!this.done) {\n var byte = method.bytes[this.pc++],\n byte2 = 0;\n switch (byte & 0xF8) {\n // load receiver variable\n case 0x00: case 0x08:\n this.generatePush(\"inst[\", byte & 0x0F, \"]\");\n break;\n // load temporary variable\n case 0x10: case 0x18:\n this.generatePush(\"temp[\", 6 + (byte & 0xF), \"]\");\n break;\n // loadLiteral\n case 0x20: case 0x28: case 0x30: case 0x38:\n this.generatePush(\"lit[\", 1 + (byte & 0x1F), \"]\");\n break;\n // loadLiteralIndirect\n case 0x40: case 0x48: case 0x50: case 0x58:\n this.generatePush(\"lit[\", 1 + (byte & 0x1F), \"].pointers[1]\");\n break;\n // storeAndPop rcvr\n case 0x60:\n this.generatePopInto(\"inst[\", byte & 0x07, \"]\"); \n break;\n // storeAndPop temp\n case 0x68:\n this.generatePopInto(\"temp[\", 6 + (byte & 0x07), \"]\");\n break;\n // Quick push\n case 0x70:\n switch (byte) {\n case 0x70: this.generatePush(\"rcvr\"); break;\n case 0x71: this.generatePush(\"vm.trueObj\"); break;\n case 0x72: this.generatePush(\"vm.falseObj\"); break;\n case 0x73: this.generatePush(\"vm.nilObj\"); break;\n case 0x74: this.generatePush(\"-1\"); break;\n case 0x75: this.generatePush(\"0\"); break;\n case 0x76: this.generatePush(\"1\"); break;\n case 0x77: this.generatePush(\"2\"); break;\n }\n break;\n // Quick return\n case 0x78:\n switch (byte) {\n case 0x78: this.generateReturn(\"rcvr\"); break;\n case 0x79: this.generateReturn(\"vm.trueObj\"); break;\n case 0x7A: this.generateReturn(\"vm.falseObj\"); break;\n case 0x7B: this.generateReturn(\"vm.nilObj\"); break;\n case 0x7C: this.generateReturn(\"stack[vm.sp]\"); break;\n case 0x7D: this.generateBlockReturn(); break;\n default: throw Error(\"unusedBytecode\");\n }\n break;\n // Extended bytecodes \n case 0x80: case 0x88:\n this.generateExtended(byte);\n break;\n // short jump\n case 0x90:\n this.generateJump((byte & 0x07) + 1);\n break;\n // short conditional jump\n case 0x98:\n this.generateJumpIf(false, (byte & 0x07) + 1);\n break;\n // long jump, forward and back\n case 0xA0:\n byte2 = method.bytes[this.pc++];\n this.generateJump(((byte&7)-4) * 256 + byte2);\n break;\n // long conditional jump\n case 0xA8:\n byte2 = method.bytes[this.pc++];\n this.generateJumpIf(byte < 0xAC, (byte & 3) * 256 + byte2);\n break;\n // SmallInteger ops: + - < > <= >= = ~= * / @ lshift: lxor: land: lor:\n case 0xB0: case 0xB8:\n this.generateNumericOp(byte);\n break;\n // quick primitives: // at:, at:put:, size, next, nextPut:, ...\n case 0xC0: case 0xC8:\n this.generateQuickPrim(byte);\n break;\n // send literal selector\n case 0xD0: case 0xD8:\n this.generateSend(\"lit[\", 1 + (byte & 0x0F), \"]\", 0, false);\n break;\n case 0xE0: case 0xE8:\n this.generateSend(\"lit[\", 1 + (byte & 0x0F), \"]\", 1, false);\n break;\n case 0xF0: case 0xF8:\n this.generateSend(\"lit[\", 1 + (byte & 0x0F), \"]\", 2, false);\n break;\n }\n }\n var funcName = this.functionNameFor(optClass, optSel);\n if (this.singleStep) {\n if (this.debug) this.source.push(\"// all valid PCs have a label;\\n\");\n this.source.push(\"default: throw Error('invalid PC'); }\"); // all PCs handled\n return new Function(\"return function \" + funcName + \"(vm, singleStep) {\\n\" + this.source.join(\"\") + \"\\n}\")();\n } else {\n if (this.debug) this.source.push(\"// fall back to single-stepping\\n\");\n this.source.push(\"default: bytecodes += vm.pc; vm.interpretOne(true); return bytecodes;}\");\n this.deleteUnneededLabels();\n return new Function(\"return function \" + funcName + \"(vm) {\\n\" + this.source.join(\"\") + \"\\n}\")();\n }\n },\n generateExtended: function(bytecode) {\n var byte2, byte3;\n switch (bytecode) {\n // extended push\n case 0x80:\n byte2 = this.method.bytes[this.pc++];\n switch (byte2 >> 6) {\n case 0: this.generatePush(\"inst[\", byte2 & 0x3F, \"]\"); return;\n case 1: this.generatePush(\"temp[\", 6 + (byte2 & 0x3F), \"]\"); return;\n case 2: this.generatePush(\"lit[\", 1 + (byte2 & 0x3F), \"]\"); return;\n case 3: this.generatePush(\"lit[\", 1 + (byte2 & 0x3F), \"].pointers[1]\"); return;\n }\n // extended store\n case 0x81:\n byte2 = this.method.bytes[this.pc++];\n switch (byte2 >> 6) {\n case 0: this.generateStoreInto(\"inst[\", byte2 & 0x3F, \"]\"); return;\n case 1: this.generateStoreInto(\"temp[\", 6 + (byte2 & 0x3F), \"]\"); return;\n case 2: throw Error(\"illegal store into literal\");\n case 3: this.generateStoreInto(\"lit[\", 1 + (byte2 & 0x3F), \"].pointers[1]\"); return;\n }\n return;\n // extended pop into\n case 0x82:\n byte2 = this.method.bytes[this.pc++];\n switch (byte2 >> 6) {\n case 0: this.generatePopInto(\"inst[\", byte2 & 0x3F, \"]\"); return;\n case 1: this.generatePopInto(\"temp[\", 6 + (byte2 & 0x3F), \"]\"); return;\n case 2: throw Error(\"illegal pop into literal\");\n case 3: this.generatePopInto(\"lit[\", 1 + (byte2 & 0x3F), \"].pointers[1]\"); return;\n }\n // Single extended send\n case 0x83:\n byte2 = this.method.bytes[this.pc++];\n this.generateSend(\"lit[\", 1 + (byte2 & 0x1F), \"]\", byte2 >> 5, false);\n return;\n // Double extended do-anything\n case 0x84:\n byte2 = this.method.bytes[this.pc++];\n byte3 = this.method.bytes[this.pc++];\n switch (byte2 >> 5) {\n case 0: this.generateSend(\"lit[\", 1 + byte3, \"]\", byte2 & 31, false); return;\n case 1: this.generateSend(\"lit[\", 1 + byte3, \"]\", byte2 & 31, true); return;\n case 2: this.generatePush(\"inst[\", byte3, \"]\"); return;\n case 3: this.generatePush(\"lit[\", 1 + byte3, \"]\"); return;\n case 4: this.generatePush(\"lit[\", 1 + byte3, \"].pointers[1]\"); return;\n case 5: this.generateStoreInto(\"inst[\", byte3, \"]\"); return;\n case 6: this.generatePopInto(\"inst[\", byte3, \"]\"); return;\n case 7: this.generateStoreInto(\"lit[\", 1 + byte3, \"].pointers[1]\"); return;\n }\n // Single extended send to super\n case 0x85:\n byte2 = this.method.bytes[this.pc++];\n this.generateSend(\"lit[\", 1 + (byte2 & 0x1F), \"]\", byte2 >> 5, true);\n return;\n // Second extended send\n case 0x86:\n byte2 = this.method.bytes[this.pc++];\n this.generateSend(\"lit[\", 1 + (byte2 & 0x3F), \"]\", byte2 >> 6, false);\n return;\n // pop\n case 0x87:\n this.generateInstruction(\"pop\", \"vm.sp--\");\n return;\n // dup\n case 0x88:\n this.generateInstruction(\"dup\", \"var dup = stack[vm.sp]; stack[++vm.sp] = dup\");\n return;\n // thisContext\n case 0x89:\n this.generateInstruction(\"thisContext\", \"stack[++vm.sp] = vm.exportThisContext()\");\n return;\n // closures\n case 0x8A:\n byte2 = this.method.bytes[this.pc++];\n var popValues = byte2 > 127,\n count = byte2 & 127;\n this.generateClosureTemps(count, popValues);\n return;\n case 0x8B:\n throw Error(\"unusedBytecode\");\n // remote push from temp vector\n case 0x8C:\n byte2 = this.method.bytes[this.pc++];\n byte3 = this.method.bytes[this.pc++];\n this.generatePush(\"temp[\", 6 + byte3, \"].pointers[\", byte2, \"]\");\n return;\n // remote store into temp vector\n case 0x8D:\n byte2 = this.method.bytes[this.pc++];\n byte3 = this.method.bytes[this.pc++];\n this.generateStoreInto(\"temp[\", 6 + byte3, \"].pointers[\", byte2, \"]\");\n return;\n // remote store and pop into temp vector\n case 0x8E:\n byte2 = this.method.bytes[this.pc++];\n byte3 = this.method.bytes[this.pc++];\n this.generatePopInto(\"temp[\", 6 + byte3, \"].pointers[\", byte2, \"]\");\n return;\n // pushClosureCopy\n case 0x8F:\n byte2 = this.method.bytes[this.pc++];\n byte3 = this.method.bytes[this.pc++];\n var byte4 = this.method.bytes[this.pc++];\n var numArgs = byte2 & 0xF,\n numCopied = byte2 >> 4,\n blockSize = byte3 << 8 | byte4;\n this.generateClosureCopy(numArgs, numCopied, blockSize);\n return;\n }\n },\n generatePush: function(value, arg1, suffix1, arg2, suffix2) {\n if (this.debug) this.generateDebugCode(\"push\");\n this.generateLabel();\n this.source.push(\"stack[++vm.sp] = \", value);\n if (arg1 !== undefined) {\n this.source.push(arg1, suffix1);\n if (arg2 !== undefined) {\n this.source.push(arg2, suffix2);\n }\n }\n this.source.push(\";\\n\");\n },\n generateStoreInto: function(value, arg1, suffix1, arg2, suffix2) {\n if (this.debug) this.generateDebugCode(\"store into\");\n this.generateLabel();\n this.source.push(value);\n if (arg1 !== undefined) {\n this.source.push(arg1, suffix1);\n if (arg2 !== undefined) {\n this.source.push(arg2, suffix2);\n }\n }\n this.source.push(\" = stack[vm.sp];\\n\");\n },\n generatePopInto: function(value, arg1, suffix1, arg2, suffix2) {\n if (this.debug) this.generateDebugCode(\"pop into\");\n this.generateLabel();\n this.source.push(value);\n if (arg1 !== undefined) {\n this.source.push(arg1, suffix1);\n if (arg2 !== undefined) {\n this.source.push(arg2, suffix2);\n }\n }\n this.source.push(\" = stack[vm.sp--];\\n\");\n },\n generateReturn: function(what) {\n if (this.debug) this.generateDebugCode(\"return\");\n this.generateLabel();\n this.source.push(\n \"vm.pc = \", this.pc, \"; vm.doReturn(\", what, \"); return bytecodes + \", this.pc, \";\\n\");\n this.needsBreak = false; // returning anyway\n this.done = this.pc > this.endPC;\n },\n generateBlockReturn: function() {\n if (this.debug) this.generateDebugCode(\"block return\");\n this.generateLabel();\n // actually stack === context.pointers but that would look weird\n this.source.push(\n \"vm.pc = \", this.pc, \"; vm.doReturn(stack[vm.sp--], context.pointers[0]); return bytecodes + \", this.pc, \";\\n\");\n this.needsBreak = false; // returning anyway\n },\n generateJump: function(distance) {\n var destination = this.pc + distance;\n if (this.debug) this.generateDebugCode(\"jump to \" + destination);\n this.generateLabel();\n this.source.push(\"vm.pc = \", destination, \"; \");\n if (distance < 0) this.source.push(\"bytecodes += \", -distance, \"; \");\n else this.source.push(\"bytecodes -= \", distance, \"; \");\n if (distance < 0) this.source.push(\n \"\\nif (vm.interruptCheckCounter-- <= 0) {\\n\",\n \" vm.checkForInterrupts();\\n\",\n \" if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", destination, \";\\n\",\n \"}\\n\");\n if (this.singleStep) this.source.push(\"\\nif (vm.breakOutOfInterpreter) return bytecodes + \", destination, \";\\n\");\n this.source.push(\"continue;\\n\");\n this.needsBreak = false; // already checked\n this.needsLabel[destination] = true;\n if (destination > this.endPC) this.endPC = destination;\n },\n generateJumpIf: function(condition, distance) {\n var destination = this.pc + distance;\n if (this.debug) this.generateDebugCode(\"jump if \" + condition + \" to \" + destination);\n this.generateLabel();\n this.source.push(\n \"var cond = stack[vm.sp--]; if (cond === vm.\", condition, \"Obj) {vm.pc = \", destination, \"; bytecodes -= \", distance, \"; \");\n if (this.singleStep) this.source.push(\"if (vm.breakOutOfInterpreter) return bytecodes + \", destination,\"; else \");\n this.source.push(\"continue}\\n\",\n \"else if (cond !== vm.\", !condition, \"Obj) {vm.sp++; vm.pc = \", this.pc, \"; vm.send(vm.specialObjects[25], 0, false); return bytecodes + \", this.pc, \"}\\n\");\n this.needsLabel[this.pc] = true; // for coming back after #mustBeBoolean send\n this.needsLabel[destination] = true; // obviously\n if (destination > this.endPC) this.endPC = destination;\n },\n generateQuickPrim: function(byte) {\n if (this.debug) this.generateDebugCode(\"quick prim \" + this.specialSelectors[(byte & 0x0F) + 16]);\n this.generateLabel();\n switch (byte) {\n //case 0xC0: return this.popNandPushIfOK(2, this.objectAt(true,true,false)); // at:\n //case 0xC1: return this.popNandPushIfOK(3, this.objectAtPut(true,true,false)); // at:put:\n case 0xC2: // size\n this.source.push(\n \"if (stack[vm.sp].sqClass === vm.specialObjects[7]) stack[vm.sp] = stack[vm.sp].pointersSize();\\n\",\n \"else if (stack[vm.sp].sqClass === vm.specialObjects[6]) stack[vm.sp] = stack[vm.sp].bytesSize();\\n\",\n \"else { vm.pc = \", this.pc, \"; vm.sendSpecial(18); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"; }\\n\"); \n this.needsLabel[this.pc] = true;\n return;\n //case 0xC3: return false; // next\n //case 0xC4: return false; // nextPut:\n //case 0xC5: return false; // atEnd\n case 0xC6: // ==\n this.source.push(\"var cond = stack[vm.sp-1] === stack[vm.sp];\\nstack[--vm.sp] = cond ? vm.trueObj : vm.falseObj;\\n\");\n return;\n case 0xC7: // class\n this.source.push(\"stack[vm.sp] = typeof stack[vm.sp] === 'number' ? vm.specialObjects[5] : stack[vm.sp].sqClass;\\n\");\n return;\n case 0xC8: // blockCopy:\n this.source.push(\n \"vm.pc = \", this.pc, \"; if (!vm.primHandler.quickSendOther(rcvr, \", (byte & 0x0F), \")) \",\n \"{vm.sendSpecial(\", ((byte & 0x0F) + 16), \"); return bytecodes + \", this.pc, \"}\\n\");\n this.needsLabel[this.pc] = true; // for send\n this.needsLabel[this.pc + 2] = true; // for start of block\n return;\n case 0xC9: // value\n case 0xCA: // value:\n case 0xCB: // do:\n this.source.push(\n \"vm.pc = \", this.pc, \"; if (!vm.primHandler.quickSendOther(rcvr, \", (byte & 0x0F), \")) vm.sendSpecial(\", ((byte & 0x0F) + 16), \"); return bytecodes + \", this.pc, \";\\n\");\n this.needsLabel[this.pc] = true;\n return;\n //case 0xCC: return false; // new\n //case 0xCD: return false; // new:\n //case 0xCE: return false; // x\n //case 0xCF: return false; // y\n }\n // generic version for the bytecodes not yet handled above\n this.source.push(\n \"vm.pc = \", this.pc, \"; if (!vm.primHandler.quickSendOther(rcvr, \", (byte & 0x0F), \"))\",\n \" vm.sendSpecial(\", ((byte & 0x0F) + 16), \");\\n\",\n \"if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \";\\n\",\n \"if (vm.pc !== \", this.pc, \") throw Error('Huh?');\\n\");\n this.needsBreak = false; // already checked\n // if falling back to a full send we need a label for coming back\n this.needsLabel[this.pc] = true;\n },\n generateNumericOp: function(byte) {\n if (this.debug) this.generateDebugCode(\"numeric op \" + this.specialSelectors[byte & 0x0F]);\n this.generateLabel();\n // if the op cannot be executed here, do a full send and return to main loop\n // we need a label for coming back\n this.needsLabel[this.pc] = true;\n switch (byte) {\n case 0xB0: // PLUS +\n this.source.push(\"var a = stack[vm.sp - 1], b = stack[vm.sp];\\n\",\n \"if (typeof a === 'number' && typeof b === 'number') {\\n\",\n \" stack[--vm.sp] = vm.primHandler.signed32BitIntegerFor(a + b);\\n\",\n \"} else { vm.pc = \", this.pc, \"; vm.sendSpecial(0); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB1: // MINUS -\n this.source.push(\"var a = stack[vm.sp - 1], b = stack[vm.sp];\\n\",\n \"if (typeof a === 'number' && typeof b === 'number') {\\n\",\n \" stack[--vm.sp] = vm.primHandler.signed32BitIntegerFor(a - b);\\n\",\n \"} else { vm.pc = \", this.pc, \"; vm.sendSpecial(1); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB2: // LESS <\n this.source.push(\"var a = stack[vm.sp - 1], b = stack[vm.sp];\\n\",\n \"if (typeof a === 'number' && typeof b === 'number') {\\n\",\n \" stack[--vm.sp] = a < b ? vm.trueObj : vm.falseObj;\\n\",\n \"} else { vm.pc = \", this.pc, \"; vm.sendSpecial(2); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB3: // GRTR >\n this.source.push(\"var a = stack[vm.sp - 1], b = stack[vm.sp];\\n\",\n \"if (typeof a === 'number' && typeof b === 'number') {\\n\",\n \" stack[--vm.sp] = a > b ? vm.trueObj : vm.falseObj;\\n\",\n \"} else { vm.pc = \", this.pc, \"; vm.sendSpecial(3); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB4: // LEQ <=\n this.source.push(\"var a = stack[vm.sp - 1], b = stack[vm.sp];\\n\",\n \"if (typeof a === 'number' && typeof b === 'number') {\\n\",\n \" stack[--vm.sp] = a <= b ? vm.trueObj : vm.falseObj;\\n\",\n \"} else { vm.pc = \", this.pc, \"; vm.sendSpecial(4); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB5: // GEQ >=\n this.source.push(\"var a = stack[vm.sp - 1], b = stack[vm.sp];\\n\",\n \"if (typeof a === 'number' && typeof b === 'number') {\\n\",\n \" stack[--vm.sp] = a >= b ? vm.trueObj : vm.falseObj;\\n\",\n \"} else { vm.pc = \", this.pc, \"; vm.sendSpecial(5); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB6: // EQU =\n this.source.push(\"var a = stack[vm.sp - 1], b = stack[vm.sp];\\n\",\n \"if (typeof a === 'number' && typeof b === 'number') {\\n\",\n \" stack[--vm.sp] = a === b ? vm.trueObj : vm.falseObj;\\n\",\n \"} else if (a === b && a.float === a.float) {\\n\", // NaN check\n \" stack[--vm.sp] = vm.trueObj;\\n\",\n \"} else { vm.pc = \", this.pc, \"; vm.sendSpecial(6); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB7: // NEQ ~=\n this.source.push(\"var a = stack[vm.sp - 1], b = stack[vm.sp];\\n\",\n \"if (typeof a === 'number' && typeof b === 'number') {\\n\",\n \" stack[--vm.sp] = a !== b ? vm.trueObj : vm.falseObj;\\n\",\n \"} else if (a === b && a.float === a.float) {\\n\", // NaN check\n \" stack[--vm.sp] = vm.falseObj;\\n\",\n \"} else { vm.pc = \", this.pc, \"; vm.sendSpecial(7); if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB8: // TIMES *\n this.source.push(\"vm.success = true; vm.resultIsFloat = false; if(!vm.pop2AndPushNumResult(vm.stackIntOrFloat(1) * vm.stackIntOrFloat(0))) { vm.pc = \", this.pc, \"; vm.sendSpecial(8); return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xB9: // DIV /\n this.source.push(\"vm.success = true; if(!vm.pop2AndPushIntResult(vm.quickDivide(vm.stackInteger(1),vm.stackInteger(0)))) { vm.pc = \", this.pc, \"; vm.sendSpecial(9); return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xBA: // MOD \\\n this.source.push(\"vm.success = true; if(!vm.pop2AndPushIntResult(vm.mod(vm.stackInteger(1),vm.stackInteger(0)))) { vm.pc = \", this.pc, \"; vm.sendSpecial(10); return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xBB: // MakePt int@int\n this.source.push(\"vm.success = true; if(!vm.primHandler.primitiveMakePoint(1, true)) { vm.pc = \", this.pc, \"; vm.sendSpecial(11); return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xBC: // bitShift:\n this.source.push(\"vm.success = true; if(!vm.pop2AndPushIntResult(vm.safeShift(vm.stackInteger(1),vm.stackInteger(0)))) { vm.pc = \", this.pc, \"; vm.sendSpecial(12); return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xBD: // Divide //\n this.source.push(\"vm.success = true; if(!vm.pop2AndPushIntResult(vm.div(vm.stackInteger(1),vm.stackInteger(0)))) { vm.pc = \", this.pc, \"; vm.sendSpecial(13); return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xBE: // bitAnd:\n this.source.push(\"vm.success = true; if(!vm.pop2AndPushIntResult(vm.stackInteger(1) & vm.stackInteger(0))) { vm.pc = \", this.pc, \"; vm.sendSpecial(14); return bytecodes + \", this.pc, \"}\\n\");\n return;\n case 0xBF: // bitOr:\n this.source.push(\"vm.success = true; if(!vm.pop2AndPushIntResult(vm.stackInteger(1) | vm.stackInteger(0))) { vm.pc = \", this.pc, \"; vm.sendSpecial(15); return bytecodes + \", this.pc, \"}\\n\");\n return;\n }\n },\n generateSend: function(prefix, num, suffix, numArgs, superSend) {\n if (this.debug) this.generateDebugCode(\"send \" + (prefix === \"lit[\" ? this.method.pointers[num].bytesAsString() : \"...\"));\n this.generateLabel();\n // set pc, activate new method, and return to main loop\n // unless the method was a successfull primitive call (no context change)\n this.source.push(\n \"vm.pc = \", this.pc, \"; vm.send(\", prefix, num, suffix, \", \", numArgs, \", \", superSend, \"); \",\n \"if (context !== vm.activeContext || vm.breakOutOfInterpreter !== false) return bytecodes + \", this.pc, \";\\n\");\n this.needsBreak = false; // already checked\n // need a label for coming back after send\n this.needsLabel[this.pc] = true;\n },\n generateClosureTemps: function(count, popValues) {\n if (this.debug) this.generateDebugCode(\"closure temps\");\n this.generateLabel();\n this.source.push(\"var array = vm.instantiateClass(vm.specialObjects[7], \", count, \");\\n\");\n if (popValues) {\n for (var i = 0; i < count; i++)\n this.source.push(\"array.pointers[\", i, \"] = stack[vm.sp - \", count - i - 1, \"];\\n\");\n this.source.push(\"stack[vm.sp -= \", count - 1, \"] = array;\\n\");\n } else {\n this.source.push(\"stack[++vm.sp] = array;\\n\");\n }\n },\n generateClosureCopy: function(numArgs, numCopied, blockSize) {\n var from = this.pc,\n to = from + blockSize;\n if (this.debug) this.generateDebugCode(\"push closure(\" + from + \"-\" + (to-1) + \"): \" + numCopied + \" copied, \" + numArgs + \" args\");\n this.generateLabel();\n this.source.push(\n \"var closure = vm.instantiateClass(vm.specialObjects[36], \", numCopied, \");\\n\",\n \"closure.pointers[0] = context; vm.reclaimableContextCount = 0;\\n\",\n \"closure.pointers[1] = \", from + this.method.pointers.length * 4 + 1, \";\\n\", // encodeSqueakPC\n \"closure.pointers[2] = \", numArgs, \";\\n\");\n if (numCopied > 0) {\n for (var i = 0; i < numCopied; i++)\n this.source.push(\"closure.pointers[\", i + 3, \"] = stack[vm.sp - \", numCopied - i - 1,\"];\\n\");\n this.source.push(\"stack[vm.sp -= \", numCopied - 1,\"] = closure;\\n\");\n } else {\n this.source.push(\"stack[++vm.sp] = closure;\\n\");\n }\n this.source.push(\"vm.pc = \", to, \";\\n\");\n this.source.push(\"bytecodes -= \", blockSize, \";\\n\"); \n if (this.singleStep) this.source.push(\"if (vm.breakOutOfInterpreter) return bytecodes + \", to,\";\\n\");\n this.source.push(\"continue;\\n\");\n this.needsBreak = false; // already checked\n this.needsLabel[from] = true; // initial pc when activated\n this.needsLabel[to] = true; // for jump over closure\n if (to > this.endPC) this.endPC = to;\n },\n generateLabel: function() {\n // remember label position for deleteUnneededLabels()\n this.sourceLabels[this.prevPC] = this.source.length;\n this.source.push(\"case \", this.prevPC, \":\\n\");\n this.prevPC = this.pc;\n },\n generateDebugCode: function(comment) {\n // single-step for previous instructiuon\n if (this.needsBreak) {\n this.source.push(\"if (vm.breakOutOfInterpreter) return bytecodes + (vm.pc = \", this.prevPC, \");\\n\");\n this.needsLabel[this.prevPC] = true;\n }\n // comment for this instructiuon\n var bytecodes = [];\n for (var i = this.prevPC; i < this.pc; i++)\n bytecodes.push((this.method.bytes[i] + 0x100).toString(16).slice(-2).toUpperCase());\n this.source.push(\"// \", this.prevPC, \" <\", bytecodes.join(\" \"), \"> \", comment, \"\\n\");\n // enable single-step for next instruction\n this.needsBreak = this.singleStep;\n },\n generateInstruction: function(comment, instr) {\n if (this.debug) this.generateDebugCode(comment); \n this.generateLabel();\n this.source.push(instr, \";\\n\");\n },\n deleteUnneededLabels: function() {\n // switch statement is more efficient with fewer labels\n for (var i in this.sourceLabels) \n if (!this.needsLabel[i])\n for (var j = 0; j < 3; j++) \n this.source[this.sourceLabels[i] + j] = \"\";\n },\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:20 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tADPCMCodecPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.ADPCMCodecPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\"; \n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar bitPosition = 0;\nvar byteIndex = 0;\nvar currentByte = 0;\nvar encodedBytes = null;\nvar interpreterProxy = null;\nvar moduleName = \"ADPCMCodecPlugin 3 November 2014 (e)\";\nvar stepSizeTable = null;\n\n\n\n/*\tNote: This is coded so that plugins can be run from Squeak. */\n\nfunction getInterpreter() {\n\treturn interpreterProxy;\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\n\n/*\tAnswer the best index to use for the difference between the given samples. */\n/*\tDetails: Scan stepSizeTable for the first entry >= the absolute value of the difference between sample values. Since indexes are zero-based, the index used during decoding will be the one in the following stepSizeTable entry. Since the index field of a Flash frame header is only six bits, the maximum index value is 63. */\n/*\tNote: Since there does not appear to be any documentation of how Flash actually computes the indices used in its frame headers, this algorithm was guessed by reverse-engineering the Flash ADPCM decoder. */\n\nfunction indexForDeltaFromto(thisSample, nextSample) {\n\tvar bestIndex;\n\tvar diff;\n\tvar j;\n\n\tdiff = nextSample - thisSample;\n\tif (diff < 0) {\n\t\tdiff = 0 - diff;\n\t}\n\tbestIndex = 63;\n\tfor (j = 1; j <= 62; j++) {\n\t\tif (bestIndex === 63) {\n\t\t\tif (stepSizeTable[j - 1] >= diff) {\n\t\t\t\tbestIndex = j;\n\t\t\t}\n\t\t}\n\t}\n\treturn bestIndex;\n}\n\nfunction msg(s) {\n\tconsole.log(moduleName + \": \" + s);\n}\n\n\n/*\tAnswer the next n bits of my bit stream as an unsigned integer. */\n\nfunction nextBits(n) {\n\tvar remaining;\n\tvar result;\n\tvar shift;\n\n\tresult = 0;\n\tremaining = n;\n\twhile(true) {\n\t\tshift = remaining - bitPosition;\n\t\tif (shift > 0) {\n\n\t\t\t/* consumed currentByte buffer; fetch next byte */\n\n\t\t\tresult += SHL(currentByte, shift);\n\t\t\tremaining -= bitPosition;\n\t\t\tcurrentByte = encodedBytes[((++byteIndex)) - 1];\n\t\t\tbitPosition = 8;\n\t\t} else {\n\n\t\t\t/* still some bits left in currentByte buffer */\n\n\t\t\tresult += SHR(currentByte, (0 - shift));\n\n\t\t\t/* mask out the consumed bits: */\n\n\t\t\tbitPosition -= remaining;\n\t\t\tcurrentByte = currentByte & (SHR(255, (8 - bitPosition)));\n\t\t\treturn result;\n\t\t}\n\t}\n}\n\n\n/*\tWrite the next n bits to my bit stream. */\n\nfunction nextBitsput(n, anInteger) {\n\tvar bitsAvailable;\n\tvar buf;\n\tvar bufBits;\n\tvar shift;\n\n\tbuf = anInteger;\n\tbufBits = n;\n\twhile(true) {\n\t\tbitsAvailable = 8 - bitPosition;\n\n\t\t/* either left or right shift */\n\t\t/* append high bits of buf to end of currentByte: */\n\n\t\tshift = bitsAvailable - bufBits;\n\t\tif (shift < 0) {\n\n\t\t\t/* currentByte buffer filled; output it */\n\n\t\t\tcurrentByte += SHR(buf, (0 - shift));\n\t\t\tencodedBytes[((++byteIndex)) - 1] = currentByte;\n\t\t\tbitPosition = 0;\n\n\t\t\t/* clear saved high bits of buf: */\n\n\t\t\tcurrentByte = 0;\n\t\t\tbuf = buf & ((SHL(1, (0 - shift))) - 1);\n\t\t\tbufBits -= bitsAvailable;\n\t\t} else {\n\n\t\t\t/* still some bits available in currentByte buffer */\n\n\t\t\tcurrentByte += SHL(buf, shift);\n\t\t\tbitPosition += bufBits;\n\t\t\treturn self;\n\t\t}\n\t}\n}\n\nfunction primitiveDecodeMono() {\n\tvar rcvr;\n\tvar count;\n\tvar bit;\n\tvar delta;\n\tvar i;\n\tvar predictedDelta;\n\tvar step;\n\tvar bitsPerSample;\n\tvar deltaSignMask;\n\tvar deltaValueHighBit;\n\tvar deltaValueMask;\n\tvar frameSizeMask;\n\tvar index;\n\tvar indexTable;\n\tvar predicted;\n\tvar sampleIndex;\n\tvar samples;\n\n\trcvr = interpreterProxy.stackValue(1);\n\tcount = interpreterProxy.stackIntegerValue(0);\n\tpredicted = interpreterProxy.fetchIntegerofObject(0, rcvr);\n\tindex = interpreterProxy.fetchIntegerofObject(1, rcvr);\n\tdeltaSignMask = interpreterProxy.fetchIntegerofObject(2, rcvr);\n\tdeltaValueMask = interpreterProxy.fetchIntegerofObject(3, rcvr);\n\tdeltaValueHighBit = interpreterProxy.fetchIntegerofObject(4, rcvr);\n\tframeSizeMask = interpreterProxy.fetchIntegerofObject(5, rcvr);\n\tcurrentByte = interpreterProxy.fetchIntegerofObject(6, rcvr);\n\tbitPosition = interpreterProxy.fetchIntegerofObject(7, rcvr);\n\tbyteIndex = interpreterProxy.fetchIntegerofObject(8, rcvr);\n\tencodedBytes = interpreterProxy.fetchBytesofObject(9, rcvr);\n\tsamples = interpreterProxy.fetchInt16ArrayofObject(10, rcvr);\n\tsampleIndex = interpreterProxy.fetchIntegerofObject(12, rcvr);\n\tbitsPerSample = interpreterProxy.fetchIntegerofObject(13, rcvr);\n\tstepSizeTable = interpreterProxy.fetchInt16ArrayofObject(14, rcvr);\n\tindexTable = interpreterProxy.fetchInt16ArrayofObject(15, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (i = 1; i <= count; i++) {\n\t\tif ((i & frameSizeMask) === 1) {\n\n\t\t\t/* start of frame; read frame header */\n\n\t\t\tpredicted = nextBits(16);\n\t\t\tif (predicted > 32767) {\n\t\t\t\tpredicted -= 65536;\n\t\t\t}\n\t\t\tindex = nextBits(6);\n\t\t\tsamples[((++sampleIndex)) - 1] = predicted;\n\t\t} else {\n\t\t\tdelta = nextBits(bitsPerSample);\n\t\t\tstep = stepSizeTable[index];\n\t\t\tpredictedDelta = 0;\n\t\t\tbit = deltaValueHighBit;\n\t\t\twhile (bit > 0) {\n\t\t\t\tif ((delta & bit) > 0) {\n\t\t\t\t\tpredictedDelta += step;\n\t\t\t\t}\n\t\t\t\tstep = step >>> 1;\n\t\t\t\tbit = bit >>> 1;\n\t\t\t}\n\t\t\tpredictedDelta += step;\n\t\t\tif ((delta & deltaSignMask) > 0) {\n\t\t\t\tpredicted -= predictedDelta;\n\t\t\t} else {\n\t\t\t\tpredicted += predictedDelta;\n\t\t\t}\n\t\t\tif (predicted > 32767) {\n\t\t\t\tpredicted = 32767;\n\t\t\t} else {\n\t\t\t\tif (predicted < -32768) {\n\t\t\t\t\tpredicted = -32768;\n\t\t\t\t}\n\t\t\t}\n\t\t\tindex += indexTable[delta & deltaValueMask];\n\t\t\tif (index < 0) {\n\t\t\t\tindex = 0;\n\t\t\t} else {\n\t\t\t\tif (index > 88) {\n\t\t\t\t\tindex = 88;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsamples[((++sampleIndex)) - 1] = predicted;\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(0, rcvr, predicted);\n\tinterpreterProxy.storeIntegerofObjectwithValue(1, rcvr, index);\n\tinterpreterProxy.storeIntegerofObjectwithValue(6, rcvr, currentByte);\n\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, bitPosition);\n\tinterpreterProxy.storeIntegerofObjectwithValue(8, rcvr, byteIndex);\n\tinterpreterProxy.storeIntegerofObjectwithValue(12, rcvr, sampleIndex);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveDecodeStereo() {\n\tvar rcvr;\n\tvar count;\n\tvar bit;\n\tvar deltaLeft;\n\tvar deltaRight;\n\tvar i;\n\tvar indexLeft;\n\tvar indexRight;\n\tvar predictedDeltaLeft;\n\tvar predictedDeltaRight;\n\tvar predictedLeft;\n\tvar predictedRight;\n\tvar stepLeft;\n\tvar stepRight;\n\tvar bitsPerSample;\n\tvar deltaSignMask;\n\tvar deltaValueHighBit;\n\tvar deltaValueMask;\n\tvar frameSizeMask;\n\tvar index;\n\tvar indexTable;\n\tvar predicted;\n\tvar rightSamples;\n\tvar sampleIndex;\n\tvar samples;\n\n\n\t/* make local copies of decoder state variables */\n\n\trcvr = interpreterProxy.stackValue(1);\n\tcount = interpreterProxy.stackIntegerValue(0);\n\tpredicted = interpreterProxy.fetchInt16ArrayofObject(0, rcvr);\n\tindex = interpreterProxy.fetchInt16ArrayofObject(1, rcvr);\n\tdeltaSignMask = interpreterProxy.fetchIntegerofObject(2, rcvr);\n\tdeltaValueMask = interpreterProxy.fetchIntegerofObject(3, rcvr);\n\tdeltaValueHighBit = interpreterProxy.fetchIntegerofObject(4, rcvr);\n\tframeSizeMask = interpreterProxy.fetchIntegerofObject(5, rcvr);\n\tcurrentByte = interpreterProxy.fetchIntegerofObject(6, rcvr);\n\tbitPosition = interpreterProxy.fetchIntegerofObject(7, rcvr);\n\tbyteIndex = interpreterProxy.fetchIntegerofObject(8, rcvr);\n\tencodedBytes = interpreterProxy.fetchBytesofObject(9, rcvr);\n\tsamples = interpreterProxy.fetchInt16ArrayofObject(10, rcvr);\n\trightSamples = interpreterProxy.fetchInt16ArrayofObject(11, rcvr);\n\tsampleIndex = interpreterProxy.fetchIntegerofObject(12, rcvr);\n\tbitsPerSample = interpreterProxy.fetchIntegerofObject(13, rcvr);\n\tstepSizeTable = interpreterProxy.fetchInt16ArrayofObject(14, rcvr);\n\tindexTable = interpreterProxy.fetchInt16ArrayofObject(15, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tpredictedLeft = predicted[1 - 1];\n\tpredictedRight = predicted[2 - 1];\n\tindexLeft = index[1 - 1];\n\tindexRight = index[2 - 1];\n\tfor (i = 1; i <= count; i++) {\n\t\tif ((i & frameSizeMask) === 1) {\n\n\t\t\t/* start of frame; read frame header */\n\n\t\t\tpredictedLeft = nextBits(16);\n\t\t\tindexLeft = nextBits(6);\n\t\t\tpredictedRight = nextBits(16);\n\t\t\tindexRight = nextBits(6);\n\t\t\tif (predictedLeft > 32767) {\n\t\t\t\tpredictedLeft -= 65536;\n\t\t\t}\n\t\t\tif (predictedRight > 32767) {\n\t\t\t\tpredictedRight -= 65536;\n\t\t\t}\n\t\t\tsamples[((++sampleIndex)) - 1] = predictedLeft;\n\t\t\trightSamples[sampleIndex - 1] = predictedRight;\n\t\t} else {\n\t\t\tdeltaLeft = nextBits(bitsPerSample);\n\t\t\tdeltaRight = nextBits(bitsPerSample);\n\t\t\tstepLeft = stepSizeTable[indexLeft];\n\t\t\tstepRight = stepSizeTable[indexRight];\n\t\t\tpredictedDeltaLeft = (predictedDeltaRight = 0);\n\t\t\tbit = deltaValueHighBit;\n\t\t\twhile (bit > 0) {\n\t\t\t\tif ((deltaLeft & bit) > 0) {\n\t\t\t\t\tpredictedDeltaLeft += stepLeft;\n\t\t\t\t}\n\t\t\t\tif ((deltaRight & bit) > 0) {\n\t\t\t\t\tpredictedDeltaRight += stepRight;\n\t\t\t\t}\n\t\t\t\tstepLeft = stepLeft >>> 1;\n\t\t\t\tstepRight = stepRight >>> 1;\n\t\t\t\tbit = bit >>> 1;\n\t\t\t}\n\t\t\tpredictedDeltaLeft += stepLeft;\n\t\t\tpredictedDeltaRight += stepRight;\n\t\t\tif ((deltaLeft & deltaSignMask) > 0) {\n\t\t\t\tpredictedLeft -= predictedDeltaLeft;\n\t\t\t} else {\n\t\t\t\tpredictedLeft += predictedDeltaLeft;\n\t\t\t}\n\t\t\tif ((deltaRight & deltaSignMask) > 0) {\n\t\t\t\tpredictedRight -= predictedDeltaRight;\n\t\t\t} else {\n\t\t\t\tpredictedRight += predictedDeltaRight;\n\t\t\t}\n\t\t\tif (predictedLeft > 32767) {\n\t\t\t\tpredictedLeft = 32767;\n\t\t\t} else {\n\t\t\t\tif (predictedLeft < -32768) {\n\t\t\t\t\tpredictedLeft = -32768;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (predictedRight > 32767) {\n\t\t\t\tpredictedRight = 32767;\n\t\t\t} else {\n\t\t\t\tif (predictedRight < -32768) {\n\t\t\t\t\tpredictedRight = -32768;\n\t\t\t\t}\n\t\t\t}\n\t\t\tindexLeft += indexTable[deltaLeft & deltaValueMask];\n\t\t\tif (indexLeft < 0) {\n\t\t\t\tindexLeft = 0;\n\t\t\t} else {\n\t\t\t\tif (indexLeft > 88) {\n\t\t\t\t\tindexLeft = 88;\n\t\t\t\t}\n\t\t\t}\n\t\t\tindexRight += indexTable[deltaRight & deltaValueMask];\n\t\t\tif (indexRight < 0) {\n\t\t\t\tindexRight = 0;\n\t\t\t} else {\n\t\t\t\tif (indexRight > 88) {\n\t\t\t\t\tindexRight = 88;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsamples[((++sampleIndex)) - 1] = predictedLeft;\n\t\t\trightSamples[sampleIndex - 1] = predictedRight;\n\t\t}\n\t}\n\tpredicted[1 - 1] = predictedLeft;\n\tpredicted[2 - 1] = predictedRight;\n\tindex[1 - 1] = indexLeft;\n\tindex[2 - 1] = indexRight;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(6, rcvr, currentByte);\n\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, bitPosition);\n\tinterpreterProxy.storeIntegerofObjectwithValue(8, rcvr, byteIndex);\n\tinterpreterProxy.storeIntegerofObjectwithValue(12, rcvr, sampleIndex);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveEncodeMono() {\n\tvar rcvr;\n\tvar count;\n\tvar bit;\n\tvar delta;\n\tvar diff;\n\tvar i;\n\tvar p;\n\tvar predictedDelta;\n\tvar sign;\n\tvar step;\n\tvar bitsPerSample;\n\tvar deltaSignMask;\n\tvar deltaValueHighBit;\n\tvar frameSizeMask;\n\tvar index;\n\tvar indexTable;\n\tvar predicted;\n\tvar sampleIndex;\n\tvar samples;\n\n\trcvr = interpreterProxy.stackValue(1);\n\tcount = interpreterProxy.stackIntegerValue(0);\n\tpredicted = interpreterProxy.fetchIntegerofObject(0, rcvr);\n\tindex = interpreterProxy.fetchIntegerofObject(1, rcvr);\n\tdeltaSignMask = interpreterProxy.fetchIntegerofObject(2, rcvr);\n\tdeltaValueHighBit = interpreterProxy.fetchIntegerofObject(4, rcvr);\n\tframeSizeMask = interpreterProxy.fetchIntegerofObject(5, rcvr);\n\tcurrentByte = interpreterProxy.fetchIntegerofObject(6, rcvr);\n\tbitPosition = interpreterProxy.fetchIntegerofObject(7, rcvr);\n\tbyteIndex = interpreterProxy.fetchIntegerofObject(8, rcvr);\n\tencodedBytes = interpreterProxy.fetchBytesofObject(9, rcvr);\n\tsamples = interpreterProxy.fetchInt16ArrayofObject(10, rcvr);\n\tsampleIndex = interpreterProxy.fetchIntegerofObject(12, rcvr);\n\tbitsPerSample = interpreterProxy.fetchIntegerofObject(13, rcvr);\n\tstepSizeTable = interpreterProxy.fetchInt16ArrayofObject(14, rcvr);\n\tindexTable = interpreterProxy.fetchInt16ArrayofObject(15, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tstep = stepSizeTable[1 - 1];\n\tfor (i = 1; i <= count; i++) {\n\t\tif ((i & frameSizeMask) === 1) {\n\t\t\tpredicted = samples[((++sampleIndex)) - 1];\n\t\t\tif (((p = predicted)) < 0) {\n\t\t\t\tp += 65536;\n\t\t\t}\n\t\t\tnextBitsput(16, p);\n\t\t\tif (i < count) {\n\t\t\t\tindex = indexForDeltaFromto(predicted, samples[sampleIndex]);\n\t\t\t}\n\t\t\tnextBitsput(6, index);\n\t\t} else {\n\n\t\t\t/* compute sign and magnitude of difference from the predicted sample */\n\n\t\t\tsign = 0;\n\t\t\tdiff = samples[((++sampleIndex)) - 1] - predicted;\n\t\t\tif (diff < 0) {\n\t\t\t\tsign = deltaSignMask;\n\t\t\t\tdiff = 0 - diff;\n\t\t\t}\n\t\t\tdelta = 0;\n\t\t\tpredictedDelta = 0;\n\t\t\tbit = deltaValueHighBit;\n\t\t\twhile (bit > 0) {\n\t\t\t\tif (diff >= step) {\n\t\t\t\t\tdelta += bit;\n\t\t\t\t\tpredictedDelta += step;\n\t\t\t\t\tdiff -= step;\n\t\t\t\t}\n\t\t\t\tstep = step >>> 1;\n\t\t\t\tbit = bit >>> 1;\n\t\t\t}\n\n\t\t\t/* compute and clamp new prediction */\n\n\t\t\tpredictedDelta += step;\n\t\t\tif (sign > 0) {\n\t\t\t\tpredicted -= predictedDelta;\n\t\t\t} else {\n\t\t\t\tpredicted += predictedDelta;\n\t\t\t}\n\t\t\tif (predicted > 32767) {\n\t\t\t\tpredicted = 32767;\n\t\t\t} else {\n\t\t\t\tif (predicted < -32768) {\n\t\t\t\t\tpredicted = -32768;\n\t\t\t\t}\n\t\t\t}\n\t\t\tindex += indexTable[delta];\n\t\t\tif (index < 0) {\n\t\t\t\tindex = 0;\n\t\t\t} else {\n\t\t\t\tif (index > 88) {\n\t\t\t\t\tindex = 88;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* output encoded, signed delta */\n\n\t\t\tstep = stepSizeTable[index];\n\t\t\tnextBitsput(bitsPerSample, sign | delta);\n\t\t}\n\t}\n\tif (bitPosition > 0) {\n\n\t\t/* flush the last output byte, if necessary */\n\n\t\tencodedBytes[((++byteIndex)) - 1] = currentByte;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(0, rcvr, predicted);\n\tinterpreterProxy.storeIntegerofObjectwithValue(1, rcvr, index);\n\tinterpreterProxy.storeIntegerofObjectwithValue(6, rcvr, currentByte);\n\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, bitPosition);\n\tinterpreterProxy.storeIntegerofObjectwithValue(8, rcvr, byteIndex);\n\tinterpreterProxy.storeIntegerofObjectwithValue(12, rcvr, sampleIndex);\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tnot yet implemented */\n\nfunction primitiveEncodeStereo() {\n\tvar rcvr;\n\tvar count;\n\n\trcvr = interpreterProxy.stackValue(1);\n\tcount = interpreterProxy.stackIntegerValue(0);\n\tcurrentByte = interpreterProxy.fetchIntegerofObject(6, rcvr);\n\tbitPosition = interpreterProxy.fetchIntegerofObject(7, rcvr);\n\tbyteIndex = interpreterProxy.fetchIntegerofObject(8, rcvr);\n\tencodedBytes = interpreterProxy.fetchIntegerofObject(9, rcvr);\n\tstepSizeTable = interpreterProxy.fetchIntegerofObject(14, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tsuccess(false);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(6, rcvr, currentByte);\n\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, bitPosition);\n\tinterpreterProxy.storeIntegerofObjectwithValue(8, rcvr, byteIndex);\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\nSqueak.registerExternalModule(\"ADPCMCodecPlugin\", {\n\tprimitiveDecodeStereo: primitiveDecodeStereo,\n\tprimitiveEncodeStereo: primitiveEncodeStereo,\n\tsetInterpreter: setInterpreter,\n\tprimitiveEncodeMono: primitiveEncodeMono,\n\tprimitiveDecodeMono: primitiveDecodeMono,\n\tgetModuleName: getModuleName,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 14 November 2014 12:21:50 am */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.17 uuid: 399be48b-95d8-4722-bdcc-39a94a12c486\n from\n\tBalloonEnginePlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.B2DPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\"; \n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\nfunction PTR_ADD(p, n) { return new Int32Array(p.buffer, p.byteOffset + n * 4); }\nfunction FPTR_ADD(p, n) { return new Float32Array(p.buffer, p.byteOffset + n * 4); }\n\n/*** Constants ***/\nvar BEBalloonEngineSize = 12;\nvar BEBitBltIndex = 2;\nvar BEFormsIndex = 3;\nvar BESpanIndex = 1;\nvar BEWorkBufferIndex = 0;\nvar ETBalloonEdgeDataSize = 6;\nvar ETIndexIndex = 0;\nvar ETLinesIndex = 4;\nvar ETXValueIndex = 1;\nvar ETYValueIndex = 2;\nvar ETZValueIndex = 3;\nvar FTBalloonFillDataSize = 6;\nvar FTIndexIndex = 0;\nvar FTMaxXIndex = 2;\nvar FTMinXIndex = 1;\nvar FTYValueIndex = 3;\nvar GBBaseSize = 16;\nvar GBBitmapDepth = 12;\nvar GBBitmapHeight = 11;\nvar GBBitmapRaster = 14;\nvar GBBitmapSize = 13;\nvar GBBitmapWidth = 10;\nvar GBColormapOffset = 18;\nvar GBColormapSize = 15;\nvar GBEndX = 14;\nvar GBEndY = 15;\nvar GBFinalX = 21;\nvar GBMBaseSize = 18;\nvar GBTileFlag = 16;\nvar GBUpdateDDX = 4;\nvar GBUpdateDDY = 5;\nvar GBUpdateDX = 2;\nvar GBUpdateDY = 3;\nvar GBUpdateData = 10;\nvar GBUpdateX = 0;\nvar GBUpdateY = 1;\nvar GBViaX = 12;\nvar GBViaY = 13;\nvar GBWideEntry = 18;\nvar GBWideExit = 19;\nvar GBWideExtent = 20;\nvar GBWideFill = 16;\nvar GBWideSize = 28;\nvar GBWideUpdateData = 22;\nvar GBWideWidth = 17;\nvar GEBaseEdgeSize = 10;\nvar GEBaseFillSize = 4;\nvar GEEdgeFillsInvalid = 65536;\nvar GEFAlreadyFailed = 100;\nvar GEFBadPoint = 121;\nvar GEFBitBltLoadFailed = 122;\nvar GEFClassMismatch = 114;\nvar GEFEdgeDataTooSmall = 112;\nvar GEFEngineIsInteger = 101;\nvar GEFEngineIsWords = 102;\nvar GEFEngineStopped = 104;\nvar GEFEngineTooSmall = 103;\nvar GEFEntityCheckFailed = 120;\nvar GEFEntityLoadFailed = 119;\nvar GEFFillDataTooSmall = 113;\nvar GEFFormLoadFailed = 123;\nvar GEFSizeMismatch = 115;\nvar GEFWorkBufferBadMagic = 108;\nvar GEFWorkBufferIsInteger = 105;\nvar GEFWorkBufferIsPointers = 106;\nvar GEFWorkBufferStartWrong = 110;\nvar GEFWorkBufferTooSmall = 107;\nvar GEFWorkBufferWrongSize = 109;\nvar GEFWorkTooBig = 111;\nvar GEFWrongEdge = 118;\nvar GEFWrongFill = 117;\nvar GEFWrongState = 116;\nvar GEFillIndexLeft = 8;\nvar GEFillIndexRight = 9;\nvar GENumLines = 7;\nvar GEObjectIndex = 2;\nvar GEObjectLength = 1;\nvar GEObjectType = 0;\nvar GEPrimitiveBezier = 6;\nvar GEPrimitiveClippedBitmapFill = 1024;\nvar GEPrimitiveEdge = 2;\nvar GEPrimitiveEdgeMask = 255;\nvar GEPrimitiveFill = 256;\nvar GEPrimitiveFillMask = 65280;\nvar GEPrimitiveLine = 4;\nvar GEPrimitiveLinearGradientFill = 512;\nvar GEPrimitiveRadialGradientFill = 768;\nvar GEPrimitiveTypeMask = 65535;\nvar GEPrimitiveWide = 1;\nvar GEPrimitiveWideBezier = 7;\nvar GEPrimitiveWideLine = 5;\nvar GEPrimitiveWideMask = 254;\nvar GEStateAddingFromGET = 1;\nvar GEStateBlitBuffer = 5;\nvar GEStateCompleted = 8;\nvar GEStateScanningAET = 3;\nvar GEStateUnlocked = 0;\nvar GEStateUpdateEdges = 6;\nvar GEStateWaitingChange = 7;\nvar GEStateWaitingForEdge = 2;\nvar GEStateWaitingForFill = 4;\nvar GEXValue = 4;\nvar GEYValue = 5;\nvar GEZValue = 6;\nvar GErrorAETEntry = 6;\nvar GErrorBadState = 2;\nvar GErrorFillEntry = 5;\nvar GErrorGETEntry = 4;\nvar GErrorNeedFlush = 3;\nvar GErrorNoMoreSpace = 1;\nvar GFDirectionX = 6;\nvar GFDirectionY = 7;\nvar GFNormalX = 8;\nvar GFNormalY = 9;\nvar GFOriginX = 4;\nvar GFOriginY = 5;\nvar GFRampLength = 10;\nvar GFRampOffset = 12;\nvar GGBaseSize = 12;\nvar GLBaseSize = 16;\nvar GLEndX = 14;\nvar GLEndY = 15;\nvar GLError = 13;\nvar GLErrorAdjDown = 15;\nvar GLErrorAdjUp = 14;\nvar GLWideEntry = 18;\nvar GLWideExit = 19;\nvar GLWideExtent = 20;\nvar GLWideFill = 16;\nvar GLWideSize = 21;\nvar GLWideWidth = 17;\nvar GLXDirection = 10;\nvar GLXIncrement = 12;\nvar GLYDirection = 11;\nvar GWAAColorMask = 51;\nvar GWAAColorShift = 50;\nvar GWAAHalfPixel = 53;\nvar GWAALevel = 48;\nvar GWAAScanMask = 52;\nvar GWAAShift = 49;\nvar GWAETStart = 13;\nvar GWAETUsed = 14;\nvar GWBezierHeightSubdivisions = 109;\nvar GWBezierLineConversions = 111;\nvar GWBezierMonotonSubdivisions = 108;\nvar GWBezierOverflowSubdivisions = 110;\nvar GWBufferTop = 10;\nvar GWClearSpanBuffer = 69;\nvar GWClipMaxX = 43;\nvar GWClipMaxY = 45;\nvar GWClipMinX = 42;\nvar GWClipMinY = 44;\nvar GWColorTransform = 24;\nvar GWCountAddAETEntry = 97;\nvar GWCountChangeAETEntry = 107;\nvar GWCountDisplaySpan = 103;\nvar GWCountFinishTest = 93;\nvar GWCountInitializing = 91;\nvar GWCountMergeFill = 101;\nvar GWCountNextAETEntry = 105;\nvar GWCountNextFillEntry = 99;\nvar GWCountNextGETEntry = 95;\nvar GWCurrentY = 88;\nvar GWCurrentZ = 113;\nvar GWDestOffsetX = 46;\nvar GWDestOffsetY = 47;\nvar GWEdgeTransform = 18;\nvar GWFillMaxX = 37;\nvar GWFillMaxY = 39;\nvar GWFillMinX = 36;\nvar GWFillMinY = 38;\nvar GWGETStart = 11;\nvar GWGETUsed = 12;\nvar GWHasColorTransform = 17;\nvar GWHasEdgeTransform = 16;\nvar GWHeaderSize = 128;\nvar GWLastExportedEdge = 65;\nvar GWLastExportedFill = 66;\nvar GWLastExportedLeftX = 67;\nvar GWLastExportedRightX = 68;\nvar GWMagicIndex = 0;\nvar GWMagicNumber = 1097753705;\nvar GWMinimalSize = 256;\nvar GWNeedsFlush = 63;\nvar GWObjStart = 8;\nvar GWObjUsed = 9;\nvar GWPoint1 = 80;\nvar GWPoint2 = 82;\nvar GWPoint3 = 84;\nvar GWPoint4 = 86;\nvar GWSize = 1;\nvar GWSpanEnd = 34;\nvar GWSpanEndAA = 35;\nvar GWSpanSize = 33;\nvar GWSpanStart = 32;\nvar GWState = 2;\nvar GWStopReason = 64;\nvar GWTimeAddAETEntry = 96;\nvar GWTimeChangeAETEntry = 106;\nvar GWTimeDisplaySpan = 102;\nvar GWTimeFinishTest = 92;\nvar GWTimeInitializing = 90;\nvar GWTimeMergeFill = 100;\nvar GWTimeNextAETEntry = 104;\nvar GWTimeNextFillEntry = 98;\nvar GWTimeNextGETEntry = 94;\nvar PrimErrBadArgument = 3;\nvar PrimErrBadNumArgs = 5;\n\n/*** Variables ***/\nvar aetBuffer = null;\nvar bbPluginName = \"BitBltPlugin\";\nvar copyBitsFn = null;\nvar dispatchReturnValue = 0;\nvar dispatchedValue = 0;\nvar doProfileStats = 0;\nvar engine = 0;\nvar engineStopped = 0;\nvar formArray = 0;\nvar geProfileTime = 0;\nvar getBuffer = null;\nvar interpreterProxy = null;\nvar loadBBFn = null;\nvar moduleName = \"B2DPlugin 14 November 2014 (e)\";\nvar objBuffer = null;\nvar objUsed = 0;\nvar spanBuffer = null;\nvar workBuffer = null;\n\n\nfunction aaColorMaskGet() {\n\treturn workBuffer[GWAAColorMask];\n}\n\nfunction aaColorMaskPut(value) {\n\treturn workBuffer[GWAAColorMask] = value;\n}\n\nfunction aaColorShiftGet() {\n\treturn workBuffer[GWAAColorShift];\n}\n\nfunction aaColorShiftPut(value) {\n\treturn workBuffer[GWAAColorShift] = value;\n}\n\n\n/*\tCommon function to compute the first full pixel for AA drawing */\n\nfunction aaFirstPixelFromto(leftX, rightX) {\n\tvar firstPixel;\n\n\tfirstPixel = ((leftX + aaLevelGet()) - 1) & ~(aaLevelGet() - 1);\n\tif (firstPixel > rightX) {\n\t\treturn rightX;\n\t} else {\n\t\treturn firstPixel;\n\t}\n}\n\nfunction aaHalfPixelPut(value) {\n\treturn workBuffer[GWAAHalfPixel] = value;\n}\n\n\n/*\tCommon function to compute the last full pixel for AA drawing */\n\nfunction aaLastPixelFromto(leftX, rightX) {\n\treturn (rightX - 1) & ~(aaLevelGet() - 1);\n}\n\nfunction aaLevelGet() {\n\treturn workBuffer[GWAALevel];\n}\n\nfunction aaLevelPut(value) {\n\treturn workBuffer[GWAALevel] = value;\n}\n\nfunction aaScanMaskGet() {\n\treturn workBuffer[GWAAScanMask];\n}\n\nfunction aaScanMaskPut(value) {\n\treturn workBuffer[GWAAScanMask] = value;\n}\n\nfunction aaShiftGet() {\n\treturn workBuffer[GWAAShift];\n}\n\nfunction aaShiftPut(value) {\n\treturn workBuffer[GWAAShift] = value;\n}\n\n\n/*\tCompute the squared value of a 8.24 number with 0.0 <= value < 1.0,\n\te.g., compute (value * value) bitShift: -24 */\n\nfunction absoluteSquared8Dot24(value) {\n\tvar word1;\n\tvar word2;\n\n\tword1 = value & 65535;\n\tword2 = (value >>> 16) & 255;\n\treturn ((((word1 * word1) >>> 16) + ((word1 * word2) * 2)) + ((word2 * word2) << 16)) >>> 8;\n}\n\n\n/*\tReturn the accurate length of the vector described by deltaX and deltaY */\n\nfunction accurateLengthOfwith(deltaX, deltaY) {\n\tvar length2;\n\n\tif (deltaX === 0) {\n\t\tif (deltaY < 0) {\n\t\t\treturn 0 - deltaY;\n\t\t} else {\n\t\t\treturn deltaY;\n\t\t}\n\t}\n\tif (deltaY === 0) {\n\t\tif (deltaX < 0) {\n\t\t\treturn 0 - deltaX;\n\t\t} else {\n\t\t\treturn deltaX;\n\t\t}\n\t}\n\tlength2 = (deltaX * deltaX) + (deltaY * deltaY);\n\treturn computeSqrt(length2);\n}\n\nfunction addEdgeToGET(edge) {\n\tif (!allocateGETEntry(1)) {\n\t\treturn 0;\n\t}\n\tgetBuffer[getUsedGet()] = edge;\n\tgetUsedPut(getUsedGet() + 1);\n}\n\n\n/*\tAdjust the wide bezier curve (dx < 0) to start/end at the right point */\n\nfunction adjustWideBezierLeftwidthoffsetendX(bezier, lineWidth, lineOffset, endX) {\n\tvar lastX;\n\tvar lastY;\n\n\tbezierUpdateDataOf(bezier)[GBUpdateX] = (bezierUpdateDataOf(bezier)[GBUpdateX] - (lineOffset * 256));\n\tlastX = wideBezierUpdateDataOf(bezier)[GBUpdateX];\n\twideBezierUpdateDataOf(bezier)[GBUpdateX] = (lastX + ((lineWidth - lineOffset) * 256));\n\tlastY = wideBezierUpdateDataOf(bezier)[GBUpdateY];\n\twideBezierUpdateDataOf(bezier)[GBUpdateY] = (lastY + (lineWidth * 256));\n\tbezierFinalXOfput(bezier, endX - lineOffset);\n}\n\n\n/*\tAdjust the wide bezier curve (dx >= 0) to start/end at the right point */\n\nfunction adjustWideBezierRightwidthoffsetendX(bezier, lineWidth, lineOffset, endX) {\n\tvar lastX;\n\tvar lastY;\n\n\tbezierUpdateDataOf(bezier)[GBUpdateX] = (bezierUpdateDataOf(bezier)[GBUpdateX] + (lineOffset * 256));\n\tlastX = wideBezierUpdateDataOf(bezier)[GBUpdateX];\n\twideBezierUpdateDataOf(bezier)[GBUpdateX] = (lastX - ((lineWidth - lineOffset) * 256));\n\n\t/* Set lineWidth pixels down */\n\n\tlastY = wideBezierUpdateDataOf(bezier)[GBUpdateY];\n\twideBezierUpdateDataOf(bezier)[GBUpdateY] = (lastY + (lineWidth * 256));\n\tbezierFinalXOfput(bezier, (endX - lineOffset) + lineWidth);\n}\n\n\n/*\tAdjust the wide line after it has been stepped from lastX to nextX.\n\tSpecial adjustments of line width and start position are made here\n\tto simulate a rectangular brush */\n\nfunction adjustWideLineafterSteppingFromto(line, lastX, nextX) {\n\tvar baseWidth;\n\tvar deltaX;\n\tvar lineOffset;\n\tvar lineWidth;\n\tvar xDir;\n\tvar yEntry;\n\tvar yExit;\n\n\n\t/* Don't inline this */\n\t/* Fetch the values the adjustment decisions are based on */\n\n\tyEntry = wideLineEntryOf(line);\n\tyExit = wideLineExitOf(line);\n\tbaseWidth = wideLineExtentOf(line);\n\tlineOffset = offsetFromWidth(baseWidth);\n\tlineWidth = wideLineWidthOf(line);\n\txDir = lineXDirectionOf(line);\n\n\t/* Adjust the start of the line to fill an entire rectangle */\n\n\tdeltaX = nextX - lastX;\n\tif (yEntry < baseWidth) {\n\t\tif (xDir < 0) {\n\n\t\t\t/* effectively adding */\n\n\t\t\tlineWidth -= deltaX;\n\t\t} else {\n\t\t\tlineWidth += deltaX;\n\t\t\tedgeXValueOfput(line, lastX);\n\t\t}\n\t}\n\tif ((yExit + lineOffset) === 0) {\n\t\tif (xDir > 0) {\n\t\t\tlineWidth -= lineXIncrementOf(line);\n\t\t} else {\n\n\t\t\t/* effectively subtracting */\n\n\t\t\tlineWidth += lineXIncrementOf(line);\n\t\t\tedgeXValueOfput(line, lastX);\n\t\t}\n\t}\n\tif ((yExit + lineOffset) > 0) {\n\t\tif (xDir < 0) {\n\n\t\t\t/* effectively subtracting */\n\n\t\t\tlineWidth += deltaX;\n\t\t\tedgeXValueOfput(line, lastX);\n\t\t} else {\n\t\t\tlineWidth -= deltaX;\n\t\t}\n\t}\n\twideLineWidthOfput(line, lineWidth);\n}\n\nfunction aetStartGet() {\n\treturn workBuffer[GWAETStart];\n}\n\nfunction aetStartPut(value) {\n\treturn workBuffer[GWAETStart] = value;\n}\n\nfunction aetUsedGet() {\n\treturn workBuffer[GWAETUsed];\n}\n\nfunction aetUsedPut(value) {\n\treturn workBuffer[GWAETUsed] = value;\n}\n\n\n/*\tAllocate n slots in the active edge table */\n\nfunction allocateAETEntry(nSlots) {\n\treturn needAvailableSpace(nSlots);\n}\n\nfunction allocateBezier() {\n\tvar bezier;\n\n\tif (!allocateObjEntry(GBBaseSize)) {\n\t\treturn 0;\n\t}\n\tbezier = objUsed;\n\tobjUsed = bezier + GBBaseSize;\n\tobjectTypeOfput(bezier, GEPrimitiveBezier);\n\tobjectIndexOfput(bezier, 0);\n\tobjectLengthOfput(bezier, GBBaseSize);\n\treturn bezier;\n}\n\nfunction allocateBezierStackEntry() {\n\twbStackPush(6);\n\treturn wbStackSize();\n}\n\nfunction allocateBitmapFillcolormap(cmSize, cmBits) {\n\tvar cm;\n\tvar fill;\n\tvar fillSize;\n\tvar i;\n\n\tfillSize = GBMBaseSize + cmSize;\n\tif (!allocateObjEntry(fillSize)) {\n\t\treturn 0;\n\t}\n\tfill = objUsed;\n\tobjUsed = fill + fillSize;\n\tobjectTypeOfput(fill, GEPrimitiveClippedBitmapFill);\n\tobjectIndexOfput(fill, 0);\n\tobjectLengthOfput(fill, fillSize);\n\tcm = colormapOf(fill);\n\tif (hasColorTransform()) {\n\t\tfor (i = 0; i <= (cmSize - 1); i++) {\n\t\t\tcm[i] = transformColor(cmBits[i]);\n\t\t}\n\t} else {\n\t\tfor (i = 0; i <= (cmSize - 1); i++) {\n\t\t\tcm[i] = cmBits[i];\n\t\t}\n\t}\n\tbitmapCmSizeOfput(fill, cmSize);\n\treturn fill;\n}\n\n\n/*\tAllocate n slots in the global edge table */\n\nfunction allocateGETEntry(nSlots) {\n\tvar dstIndex;\n\tvar i;\n\tvar srcIndex;\n\tvar iLimiT;\n\n\n\t/* First allocate nSlots in the AET */\n\n\tif (!allocateAETEntry(nSlots)) {\n\t\treturn false;\n\t}\n\tif (aetUsedGet() !== 0) {\n\n\t\t/* Then move the AET upwards */\n\n\t\tsrcIndex = aetUsedGet();\n\t\tdstIndex = aetUsedGet() + nSlots;\n\t\tfor (i = 1, iLimiT = aetUsedGet(); i <= iLimiT; i++) {\n\t\t\taetBuffer[(--dstIndex)] = aetBuffer[(--srcIndex)];\n\t\t}\n\t}\n\taetBuffer = PTR_ADD(aetBuffer, nSlots);\n\treturn true;\n}\n\nfunction allocateGradientFillrampWidthisRadial(ramp, rampWidth, isRadial) {\n\tvar fill;\n\tvar fillSize;\n\tvar i;\n\tvar rampPtr;\n\n\tfillSize = GGBaseSize + rampWidth;\n\tif (!allocateObjEntry(fillSize)) {\n\t\treturn 0;\n\t}\n\tfill = objUsed;\n\tobjUsed = fill + fillSize;\n\tif (isRadial) {\n\t\tobjectTypeOfput(fill, GEPrimitiveRadialGradientFill);\n\t} else {\n\t\tobjectTypeOfput(fill, GEPrimitiveLinearGradientFill);\n\t}\n\tobjectIndexOfput(fill, 0);\n\tobjectLengthOfput(fill, fillSize);\n\trampPtr = gradientRampOf(fill);\n\tif (hasColorTransform()) {\n\t\tfor (i = 0; i <= (rampWidth - 1); i++) {\n\t\t\trampPtr[i] = transformColor(ramp[i]);\n\t\t}\n\t} else {\n\t\tfor (i = 0; i <= (rampWidth - 1); i++) {\n\t\t\trampPtr[i] = ramp[i];\n\t\t}\n\t}\n\tgradientRampLengthOfput(fill, rampWidth);\n\treturn fill;\n}\n\nfunction allocateLine() {\n\tvar line;\n\n\tif (!allocateObjEntry(GLBaseSize)) {\n\t\treturn 0;\n\t}\n\tline = objUsed;\n\tobjUsed = line + GLBaseSize;\n\tobjectTypeOfput(line, GEPrimitiveLine);\n\tobjectIndexOfput(line, 0);\n\tobjectLengthOfput(line, GLBaseSize);\n\treturn line;\n}\n\n\n/*\tAllocate n slots in the object buffer */\n\nfunction allocateObjEntry(nSlots) {\n\tvar dstIndex;\n\tvar i;\n\tvar srcIndex;\n\tvar iLimiT;\n\n\n\t/* First allocate nSlots in the GET */\n\n\tif (!allocateGETEntry(nSlots)) {\n\t\treturn false;\n\t}\n\tif (getUsedGet() !== 0) {\n\n\t\t/* Then move the GET upwards */\n\n\t\tsrcIndex = getUsedGet();\n\t\tdstIndex = getUsedGet() + nSlots;\n\t\tfor (i = 1, iLimiT = getUsedGet(); i <= iLimiT; i++) {\n\t\t\tgetBuffer[(--dstIndex)] = getBuffer[(--srcIndex)];\n\t\t}\n\t}\n\tgetBuffer = PTR_ADD(getBuffer, nSlots);\n\treturn true;\n}\n\n\n/*\tAET and Stack allocation are symmetric */\n\nfunction allocateStackEntry(nSlots) {\n\treturn needAvailableSpace(nSlots);\n}\n\nfunction allocateStackFillEntry() {\n\treturn wbStackPush(stackFillEntryLength());\n}\n\nfunction allocateWideBezier() {\n\tvar bezier;\n\n\tif (!allocateObjEntry(GBWideSize)) {\n\t\treturn 0;\n\t}\n\tbezier = objUsed;\n\tobjUsed = bezier + GBWideSize;\n\tobjectTypeOfput(bezier, GEPrimitiveWideBezier);\n\tobjectIndexOfput(bezier, 0);\n\tobjectLengthOfput(bezier, GBWideSize);\n\treturn bezier;\n}\n\nfunction allocateWideLine() {\n\tvar line;\n\n\tif (!allocateObjEntry(GLWideSize)) {\n\t\treturn 0;\n\t}\n\tline = objUsed;\n\tobjUsed = line + GLWideSize;\n\tobjectTypeOfput(line, GEPrimitiveWideLine);\n\tobjectIndexOfput(line, 0);\n\tobjectLengthOfput(line, GLWideSize);\n\treturn line;\n}\n\nfunction areEdgeFillsValid(edge) {\n\treturn (objectHeaderOf(edge) & GEEdgeFillsInvalid) === 0;\n}\n\n\n/*\tMake sure that val1 is between val2 and val3. */\n\nfunction assureValuebetweenand(val1, val2, val3) {\n\tif (val2 > val3) {\n\t\tif (val1 > val2) {\n\t\t\treturn val2;\n\t\t}\n\t\tif (val1 < val3) {\n\t\t\treturn val3;\n\t\t}\n\t} else {\n\t\tif (val1 < val2) {\n\t\t\treturn val2;\n\t\t}\n\t\tif (val1 > val3) {\n\t\t\treturn val3;\n\t\t}\n\t}\n\treturn val1;\n}\n\nfunction bezierEndXOf(bezier) {\n\treturn objat(bezier, GBEndX);\n}\n\nfunction bezierEndXOfput(bezier, value) {\n\treturn objatput(bezier, GBEndX, value);\n}\n\nfunction bezierEndYOf(bezier) {\n\treturn objat(bezier, GBEndY);\n}\n\nfunction bezierEndYOfput(bezier, value) {\n\treturn objatput(bezier, GBEndY, value);\n}\n\nfunction bezierFinalXOf(bezier) {\n\treturn objat(bezier, GBFinalX);\n}\n\nfunction bezierFinalXOfput(bezier, value) {\n\treturn objatput(bezier, GBFinalX, value);\n}\n\nfunction bezierUpdateDataOf(bezier) {\n\treturn PTR_ADD(objBuffer, bezier + GBUpdateData);\n}\n\nfunction bezierViaXOf(bezier) {\n\treturn objat(bezier, GBViaX);\n}\n\nfunction bezierViaXOfput(bezier, value) {\n\treturn objatput(bezier, GBViaX, value);\n}\n\nfunction bezierViaYOf(bezier) {\n\treturn objat(bezier, GBViaY);\n}\n\nfunction bezierViaYOfput(bezier, value) {\n\treturn objatput(bezier, GBViaY, value);\n}\n\nfunction bitmapCmSizeOf(bmFill) {\n\treturn objat(bmFill, GBColormapSize);\n}\n\nfunction bitmapCmSizeOfput(bmFill, value) {\n\treturn objatput(bmFill, GBColormapSize, value);\n}\n\nfunction bitmapDepthOf(bmFill) {\n\treturn objat(bmFill, GBBitmapDepth);\n}\n\nfunction bitmapDepthOfput(bmFill, value) {\n\treturn objatput(bmFill, GBBitmapDepth, value);\n}\n\nfunction bitmapHeightOf(bmFill) {\n\treturn objat(bmFill, GBBitmapHeight);\n}\n\nfunction bitmapHeightOfput(bmFill, value) {\n\treturn objatput(bmFill, GBBitmapHeight, value);\n}\n\nfunction bitmapRasterOf(bmFill) {\n\treturn objat(bmFill, GBBitmapRaster);\n}\n\nfunction bitmapRasterOfput(bmFill, value) {\n\treturn objatput(bmFill, GBBitmapRaster, value);\n}\n\nfunction bitmapSizeOf(bmFill) {\n\treturn objat(bmFill, GBBitmapSize);\n}\n\nfunction bitmapSizeOfput(bmFill, value) {\n\treturn objatput(bmFill, GBBitmapSize, value);\n}\n\nfunction bitmapTileFlagOf(bmFill) {\n\treturn objat(bmFill, GBTileFlag);\n}\n\nfunction bitmapTileFlagOfput(bmFill, value) {\n\treturn objatput(bmFill, GBTileFlag, value);\n}\n\nfunction bitmapValuebitsatXy(bmFill, bits, xp, yp) {\n\tvar a;\n\tvar b;\n\tvar bmDepth;\n\tvar bmRaster;\n\tvar cMask;\n\tvar g;\n\tvar r;\n\tvar rShift;\n\tvar value;\n\n\tbmDepth = bitmapDepthOf(bmFill);\n\tbmRaster = bitmapRasterOf(bmFill);\n\tif (bmDepth === 32) {\n\t\tvalue = (bits[(bmRaster * yp) + xp]|0);\n\t\tif ((value !== 0) && ((value & 4278190080) === 0)) {\n\t\t\tvalue = value | 4278190080;\n\t\t}\n\t\treturn uncheckedTransformColor(value);\n\t}\n\trShift = rShiftTable()[bmDepth];\n\n\t/* cMask - mask out the pixel from the word */\n\n\tvalue = bits[(bmRaster * yp) + (SHR(xp, rShift))];\n\n\t/* rShift - shift value to move the pixel in the word to the lowest bit position */\n\n\tcMask = (SHL(1, bmDepth)) - 1;\n\trShift = (32 - bmDepth) - ((xp & ((SHL(1, rShift)) - 1)) * bmDepth);\n\tvalue = (SHR(value, rShift)) & cMask;\n\tif (bmDepth === 16) {\n\n\t\t/* Must convert by expanding bits */\n\n\t\tif (value !== 0) {\n\t\t\tb = (value & 31) << 3;\n\t\t\tb += b >>> 5;\n\t\t\tg = ((value >>> 5) & 31) << 3;\n\t\t\tg += g >>> 5;\n\t\t\tr = ((value >>> 10) & 31) << 3;\n\t\t\tr += r >>> 5;\n\t\t\ta = 255;\n\t\t\tvalue = ((b + (g << 8)) + (r << 16)) + (a << 24);\n\t\t}\n\t} else {\n\n\t\t/* Must convert by using color map */\n\n\t\tif (bitmapCmSizeOf(bmFill) === 0) {\n\t\t\tvalue = 0;\n\t\t} else {\n\t\t\tvalue = colormapOf(bmFill)[value];\n\t\t}\n\t}\n\treturn uncheckedTransformColor(value);\n}\n\nfunction bitmapWidthOf(bmFill) {\n\treturn objat(bmFill, GBBitmapWidth);\n}\n\nfunction bitmapWidthOfput(bmFill, value) {\n\treturn objatput(bmFill, GBBitmapWidth, value);\n}\n\nfunction bzEndX(index) {\n\treturn wbStackValue((wbStackSize() - index) + 4);\n}\n\nfunction bzEndXput(index, value) {\n\treturn wbStackValueput((wbStackSize() - index) + 4, value);\n}\n\nfunction bzEndY(index) {\n\treturn wbStackValue((wbStackSize() - index) + 5);\n}\n\nfunction bzEndYput(index, value) {\n\treturn wbStackValueput((wbStackSize() - index) + 5, value);\n}\n\nfunction bzStartX(index) {\n\treturn wbStackValue((wbStackSize() - index) + 0);\n}\n\nfunction bzStartXput(index, value) {\n\treturn wbStackValueput((wbStackSize() - index) + 0, value);\n}\n\nfunction bzStartY(index) {\n\treturn wbStackValue((wbStackSize() - index) + 1);\n}\n\nfunction bzStartYput(index, value) {\n\treturn wbStackValueput((wbStackSize() - index) + 1, value);\n}\n\nfunction bzViaX(index) {\n\treturn wbStackValue((wbStackSize() - index) + 2);\n}\n\nfunction bzViaXput(index, value) {\n\treturn wbStackValueput((wbStackSize() - index) + 2, value);\n}\n\nfunction bzViaY(index) {\n\treturn wbStackValue((wbStackSize() - index) + 3);\n}\n\nfunction bzViaYput(index, value) {\n\treturn wbStackValueput((wbStackSize() - index) + 3, value);\n}\n\n\n/*\tCheck the fill indexes in the run-length encoded fillList */\n\nfunction checkCompressedFillIndexListmaxsegments(fillList, maxIndex, nSegs) {\n\tvar fillPtr;\n\tvar i;\n\tvar length;\n\tvar nFills;\n\tvar runLength;\n\tvar runValue;\n\n\tlength = SIZEOF(fillList);\n\tfillPtr = fillList.wordsAsInt32Array();\n\tnFills = 0;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trunLength = shortRunLengthAtfrom(i, fillPtr);\n\t\trunValue = shortRunValueAtfrom(i, fillPtr);\n\t\tif (!((runValue >= 0) && (runValue <= maxIndex))) {\n\t\t\treturn false;\n\t\t}\n\t\tnFills += runLength;\n\t}\n\treturn nFills === nSegs;\n}\n\n\n/*\tCheck if the indexList (containing fill handles) is okay. */\n\nfunction checkCompressedFills(indexList) {\n\tvar fillIndex;\n\tvar fillPtr;\n\tvar i;\n\tvar length;\n\n\n\t/* First check if the oops have the right format */\n\n\tif (!interpreterProxy.isWords(indexList)) {\n\t\treturn false;\n\t}\n\tlength = SIZEOF(indexList);\n\tfillPtr = indexList.wordsAsInt32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\n\t\t/* Make sure the fill is okay */\n\n\t\tfillIndex = fillPtr[i];\n\t\tif (!isFillOkay(fillIndex)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n/*\tCheck the run-length encoded lineWidthList matches nSegments */\n\nfunction checkCompressedLineWidthssegments(lineWidthList, nSegments) {\n\tvar i;\n\tvar length;\n\tvar nItems;\n\tvar ptr;\n\tvar runLength;\n\n\tlength = SIZEOF(lineWidthList);\n\tptr = lineWidthList.wordsAsInt32Array();\n\tnItems = 0;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trunLength = shortRunLengthAtfrom(i, ptr);\n\t\tnItems += runLength;\n\t}\n\treturn nItems === nSegments;\n}\n\n\n/*\tCheck if the given point array can be handled by the engine. */\n\nfunction checkCompressedPointssegments(points, nSegments) {\n\tvar pSize;\n\n\tif (!interpreterProxy.isWords(points)) {\n\t\treturn false;\n\t}\n\n\t/* The points must be either in PointArray format or ShortPointArray format.\n\tAlso, we currently handle only quadratic segments (e.g., 3 points each) and thus either\n\t\tpSize = nSegments * 3,\t\tfor ShortPointArrays or,\n\t\tpSize = nSegments * 6,\t\tfor PointArrays */\n\n\tpSize = SIZEOF(points);\n\tif (!((pSize === (nSegments * 3)) || (pSize === (nSegments * 6)))) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n/*\tCheck if the given shape can be handled by the engine. \n\tSince there are a number of requirements this is an extra method. */\n\nfunction checkCompressedShapesegmentsleftFillsrightFillslineWidthslineFillsfillIndexList(points, nSegments, leftFills, rightFills, lineWidths, lineFills, fillIndexList) {\n\tvar maxFillIndex;\n\n\tif (!checkCompressedPointssegments(points, nSegments)) {\n\t\treturn false;\n\t}\n\tif (!checkCompressedFills(fillIndexList)) {\n\t\treturn false;\n\t}\n\tmaxFillIndex = SIZEOF(fillIndexList);\n\tif (!checkCompressedFillIndexListmaxsegments(leftFills, maxFillIndex, nSegments)) {\n\t\treturn false;\n\t}\n\tif (!checkCompressedFillIndexListmaxsegments(rightFills, maxFillIndex, nSegments)) {\n\t\treturn false;\n\t}\n\tif (!checkCompressedFillIndexListmaxsegments(lineFills, maxFillIndex, nSegments)) {\n\t\treturn false;\n\t}\n\tif (!checkCompressedLineWidthssegments(lineWidths, nSegments)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n/*\tAdd the bezier to the global edge table if it intersects the clipping region */\n\nfunction checkedAddBezierToGET(bezier) {\n\tvar lineWidth;\n\n\tif (isWide(bezier)) {\n\t\tlineWidth = wideBezierExtentOf(bezier);\n\t} else {\n\t\tlineWidth = 0;\n\t}\n\tif ((bezierEndYOf(bezier) + lineWidth) < fillMinYGet()) {\n\t\treturn 0;\n\t}\n\tif (((edgeXValueOf(bezier) - lineWidth) >= fillMaxXGet()) && ((bezierEndXOf(bezier) - lineWidth) >= fillMaxXGet())) {\n\t\treturn 0;\n\t}\n\taddEdgeToGET(bezier);\n}\n\n\n/*\tAdd the edge to the global edge table.\n\tFor known edge types, check if the edge intersects the visible region */\n\nfunction checkedAddEdgeToGET(edge) {\n\tif (isLine(edge)) {\n\t\treturn checkedAddLineToGET(edge);\n\t}\n\tif (isBezier(edge)) {\n\t\treturn checkedAddBezierToGET(edge);\n\t}\n\taddEdgeToGET(edge);\n}\n\n\n/*\tAdd the line to the global edge table if it intersects the clipping region */\n\nfunction checkedAddLineToGET(line) {\n\tvar lineWidth;\n\n\tif (isWide(line)) {\n\t\tlineWidth = wideLineExtentOf(line);\n\t} else {\n\t\tlineWidth = 0;\n\t}\n\tif ((lineEndYOf(line) + lineWidth) < fillMinYGet()) {\n\t\treturn 0;\n\t}\n\tif (((edgeXValueOf(line) - lineWidth) >= fillMaxXGet()) && ((lineEndXOf(line) - lineWidth) >= fillMaxXGet())) {\n\t\treturn 0;\n\t}\n\taddEdgeToGET(line);\n}\n\nfunction circleCosTable() {\n\tvar theTable =\n\t\t[1.0, 0.98078528040323, 0.923879532511287, 0.831469612302545,\n\t\t0.7071067811865475, 0.555570233019602, 0.38268343236509, 0.1950903220161286,\n\t\t0.0, -0.1950903220161283, -0.3826834323650896, -0.555570233019602,\n\t\t-0.707106781186547, -0.831469612302545, -0.9238795325112865, -0.98078528040323,\n\t\t-1.0, -0.98078528040323, -0.923879532511287, -0.831469612302545,\n\t\t-0.707106781186548, -0.555570233019602, -0.3826834323650903, -0.1950903220161287,\n\t\t0.0, 0.1950903220161282, 0.38268343236509, 0.555570233019602,\n\t\t0.707106781186547, 0.831469612302545, 0.9238795325112865, 0.98078528040323,\n\t\t1.0 ];\n\n\treturn theTable;\n}\n\nfunction circleSinTable() {\n\tvar theTable =\n\t\t[0.0, 0.1950903220161282, 0.3826834323650897, 0.555570233019602,\n\t\t0.707106781186547, 0.831469612302545, 0.923879532511287, 0.98078528040323,\n\t\t1.0, 0.98078528040323, 0.923879532511287, 0.831469612302545,\n\t\t0.7071067811865475, 0.555570233019602, 0.38268343236509, 0.1950903220161286,\n\t\t0.0, -0.1950903220161283, -0.3826834323650896, -0.555570233019602,\n\t\t-0.707106781186547, -0.831469612302545, -0.9238795325112865, -0.98078528040323,\n\t\t-1.0, -0.98078528040323, -0.923879532511287, -0.831469612302545,\n\t\t-0.707106781186548, -0.555570233019602, -0.3826834323650903, -0.1950903220161287,\n\t\t 0.0 ];\n\n\treturn theTable;\n}\n\nfunction clampValuemax(value, maxValue) {\n\tif (value < 0) {\n\t\treturn 0;\n\t} else {\n\t\tif (value >= maxValue) {\n\t\t\treturn maxValue - 1;\n\t\t} else {\n\t\t\treturn value;\n\t\t}\n\t}\n}\n\n\n/*\tClear the current span buffer.\n\tThe span buffer is only cleared in the area that has been used by the previous scan line. */\n\nfunction clearSpanBuffer() {\n\tvar x0;\n\tvar x1;\n\n\tx0 = SHR(spanStartGet(), aaShiftGet());\n\tx1 = (SHR(spanEndGet(), aaShiftGet())) + 1;\n\tif (x0 < 0) {\n\t\tx0 = 0;\n\t}\n\tif (x1 > spanSizeGet()) {\n\t\tx1 = spanSizeGet();\n\t}\n\twhile (x0 < x1) {\n\t\tspanBuffer[x0] = 0;\n\t\t++x0;\n\t}\n\tspanStartPut(spanSizeGet());\n\tspanEndPut(0);\n}\n\nfunction clearSpanBufferGet() {\n\treturn workBuffer[GWClearSpanBuffer];\n}\n\nfunction clearSpanBufferPut(value) {\n\treturn workBuffer[GWClearSpanBuffer] = value;\n}\n\nfunction clipMaxXGet() {\n\treturn workBuffer[GWClipMaxX];\n}\n\nfunction clipMaxXPut(value) {\n\treturn workBuffer[GWClipMaxX] = value;\n}\n\nfunction clipMaxYGet() {\n\treturn workBuffer[GWClipMaxY];\n}\n\nfunction clipMaxYPut(value) {\n\treturn workBuffer[GWClipMaxY] = value;\n}\n\nfunction clipMinXGet() {\n\treturn workBuffer[GWClipMinX];\n}\n\nfunction clipMinXPut(value) {\n\treturn workBuffer[GWClipMinX] = value;\n}\n\nfunction clipMinYGet() {\n\treturn workBuffer[GWClipMinY];\n}\n\nfunction clipMinYPut(value) {\n\treturn workBuffer[GWClipMinY] = value;\n}\n\nfunction colorTransform() {\n\treturn FPTR_ADD(workBuffer, GWColorTransform);\n}\n\nfunction colormapOf(bmFill) {\n\treturn PTR_ADD(objBuffer, bmFill + GBColormapOffset);\n}\n\n\n/*\tSplit the bezier curve at the given parametric value.\n\tNote: Since this method is only invoked to make non-monoton\n\t\tbeziers monoton we must check for the resulting y values\n\t\tto be *really* between the start and end value. */\n\nfunction computeBeziersplitAt(index, param) {\n\tvar endX;\n\tvar endY;\n\tvar leftViaX;\n\tvar leftViaY;\n\tvar newIndex;\n\tvar rightViaX;\n\tvar rightViaY;\n\tvar sharedX;\n\tvar sharedY;\n\tvar startX;\n\tvar startY;\n\tvar viaX;\n\tvar viaY;\n\n\tleftViaX = (startX = bzStartX(index));\n\tleftViaY = (startY = bzStartY(index));\n\trightViaX = (viaX = bzViaX(index));\n\trightViaY = (viaY = bzViaY(index));\n\tendX = bzEndX(index);\n\n\t/* Compute intermediate points */\n\n\tendY = bzEndY(index);\n\tsharedX = (leftViaX += (((viaX - startX) * param)|0));\n\tsharedY = (leftViaY += (((viaY - startY) * param)|0));\n\trightViaX += (((endX - viaX) * param)|0);\n\n\t/* Compute new shared point */\n\n\trightViaY += (((endY - viaY) * param)|0);\n\tsharedX += (((rightViaX - leftViaX) * param)|0);\n\n\t/* Check the new via points */\n\n\tsharedY += (((rightViaY - leftViaY) * param)|0);\n\tleftViaY = assureValuebetweenand(leftViaY, startY, sharedY);\n\trightViaY = assureValuebetweenand(rightViaY, sharedY, endY);\n\tnewIndex = allocateBezierStackEntry();\n\tif (engineStopped) {\n\t\treturn 0;\n\t}\n\tbzViaXput(index, leftViaX);\n\tbzViaYput(index, leftViaY);\n\tbzEndXput(index, sharedX);\n\tbzEndYput(index, sharedY);\n\tbzStartXput(newIndex, sharedX);\n\tbzStartYput(newIndex, sharedY);\n\tbzViaXput(newIndex, rightViaX);\n\tbzViaYput(newIndex, rightViaY);\n\tbzEndXput(newIndex, endX);\n\tbzEndYput(newIndex, endY);\n\treturn newIndex;\n}\n\n\n/*\tSplit the bezier curve at 0.5. */\n\nfunction computeBezierSplitAtHalf(index) {\n\tvar endX;\n\tvar endY;\n\tvar leftViaX;\n\tvar leftViaY;\n\tvar newIndex;\n\tvar rightViaX;\n\tvar rightViaY;\n\tvar sharedX;\n\tvar sharedY;\n\tvar startX;\n\tvar startY;\n\tvar viaX;\n\tvar viaY;\n\n\tnewIndex = allocateBezierStackEntry();\n\tif (engineStopped) {\n\t\treturn 0;\n\t}\n\tleftViaX = (startX = bzStartX(index));\n\tleftViaY = (startY = bzStartY(index));\n\trightViaX = (viaX = bzViaX(index));\n\trightViaY = (viaY = bzViaY(index));\n\tendX = bzEndX(index);\n\n\t/* Compute intermediate points */\n\n\tendY = bzEndY(index);\n\tleftViaX += (viaX - startX) >> 1;\n\tleftViaY += (viaY - startY) >> 1;\n\tsharedX = (rightViaX += (endX - viaX) >> 1);\n\n\t/* Compute new shared point */\n\n\tsharedY = (rightViaY += (endY - viaY) >> 1);\n\tsharedX += (leftViaX - rightViaX) >> 1;\n\n\t/* Store the first part back */\n\n\tsharedY += (leftViaY - rightViaY) >> 1;\n\tbzViaXput(index, leftViaX);\n\tbzViaYput(index, leftViaY);\n\tbzEndXput(index, sharedX);\n\tbzEndYput(index, sharedY);\n\tbzStartXput(newIndex, sharedX);\n\tbzStartYput(newIndex, sharedY);\n\tbzViaXput(newIndex, rightViaX);\n\tbzViaYput(newIndex, rightViaY);\n\tbzEndXput(newIndex, endX);\n\tbzEndYput(newIndex, endY);\n\treturn newIndex;\n}\n\n\n/*\tGet both values from the two boundaries of the given bezier \n\tand compute the actual position/width of the line */\n\nfunction computeFinalWideBezierValueswidth(bezier, lineWidth) {\n\tvar leftX;\n\tvar rightX;\n\tvar temp;\n\n\tleftX = bezierUpdateDataOf(bezier)[GBUpdateX] >> 8;\n\trightX = wideBezierUpdateDataOf(bezier)[GBUpdateX] >> 8;\n\tif (leftX > rightX) {\n\t\ttemp = leftX;\n\t\tleftX = rightX;\n\t\trightX = temp;\n\t}\n\tedgeXValueOfput(bezier, leftX);\n\tif ((rightX - leftX) > lineWidth) {\n\t\twideBezierWidthOfput(bezier, rightX - leftX);\n\t} else {\n\t\twideBezierWidthOfput(bezier, lineWidth);\n\t}\n}\n\nfunction computeSqrt(length2) {\n\tif (length2 < 32) {\n\t\treturn smallSqrtTable()[length2];\n\t} else {\n\t\treturn ((Math.sqrt(length2) + 0.5)|0);\n\t}\n}\n\nfunction copyBitsFromtoat(x0, x1, yValue) {\n\tif (!copyBitsFn) {\n\n\t\t/* We need copyBits here so try to load it implicitly */\n\n\t\tif (!initialiseModule()) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn copyBitsFn(x0, x1, yValue);\n}\n\n\n/*\tCreate the global edge table */\n\nfunction createGlobalEdgeTable() {\n\tvar end;\n\tvar object;\n\n\tobject = 0;\n\tend = objUsed;\n\twhile (object < end) {\n\n\t\t/* Note: addEdgeToGET: may fail on insufficient space but that's not a problem here */\n\n\t\tif (isEdge(object)) {\n\n\t\t\t/* Check if the edge starts below fillMaxY. */\n\n\t\t\tif (!(edgeYValueOf(object) >= fillMaxYGet())) {\n\t\t\t\tcheckedAddEdgeToGET(object);\n\t\t\t}\n\t\t}\n\t\tobject += objectLengthOf(object);\n\t}\n}\n\nfunction currentYGet() {\n\treturn workBuffer[GWCurrentY];\n}\n\nfunction currentYPut(value) {\n\treturn workBuffer[GWCurrentY] = value;\n}\n\nfunction currentZGet() {\n\treturn workBuffer[GWCurrentZ];\n}\n\nfunction currentZPut(value) {\n\treturn workBuffer[GWCurrentZ] = value;\n}\n\nfunction destOffsetXGet() {\n\treturn workBuffer[GWDestOffsetX];\n}\n\nfunction destOffsetXPut(value) {\n\treturn workBuffer[GWDestOffsetX] = value;\n}\n\nfunction destOffsetYGet() {\n\treturn workBuffer[GWDestOffsetY];\n}\n\nfunction destOffsetYPut(value) {\n\treturn workBuffer[GWDestOffsetY] = value;\n}\n\n\n/*\tDisplay the span buffer at the current scan line. */\n\nfunction displaySpanBufferAt(y) {\n\tvar targetX0;\n\tvar targetX1;\n\tvar targetY;\n\n\n\t/* self aaLevelGet > 1 ifTrue:[self adjustAALevel]. */\n\n\ttargetX0 = SHR(spanStartGet(), aaShiftGet());\n\tif (targetX0 < clipMinXGet()) {\n\t\ttargetX0 = clipMinXGet();\n\t}\n\ttargetX1 = SHR(((spanEndGet() + aaLevelGet()) - 1), aaShiftGet());\n\tif (targetX1 > clipMaxXGet()) {\n\t\ttargetX1 = clipMaxXGet();\n\t}\n\ttargetY = SHR(y, aaShiftGet());\n\tif ((targetY < clipMinYGet()) || ((targetY >= clipMaxYGet()) || ((targetX1 < clipMinXGet()) || (targetX0 >= clipMaxXGet())))) {\n\t\treturn 0;\n\t}\n\tcopyBitsFromtoat(targetX0, targetX1, targetY);\n}\n\nfunction edgeFillsInvalidate(edge) {\n\treturn objectTypeOfput(edge, objectTypeOf(edge) | GEEdgeFillsInvalid);\n}\n\nfunction edgeFillsValidate(edge) {\n\treturn objectTypeOfput(edge, objectTypeOf(edge) & ~GEEdgeFillsInvalid);\n}\n\nfunction edgeLeftFillOf(edge) {\n\treturn objat(edge, GEFillIndexLeft);\n}\n\nfunction edgeLeftFillOfput(edge, value) {\n\treturn objatput(edge, GEFillIndexLeft, value);\n}\n\nfunction edgeNumLinesOf(edge) {\n\treturn objat(edge, GENumLines);\n}\n\nfunction edgeNumLinesOfput(edge, value) {\n\treturn objatput(edge, GENumLines, value);\n}\n\nfunction edgeRightFillOf(edge) {\n\treturn objat(edge, GEFillIndexRight);\n}\n\nfunction edgeRightFillOfput(edge, value) {\n\treturn objatput(edge, GEFillIndexRight, value);\n}\n\nfunction edgeTransform() {\n\treturn FPTR_ADD(workBuffer, GWEdgeTransform);\n}\n\n\n/*\tReturn the edge type (e.g., witout the wide edge flag) */\n\nfunction edgeTypeOf(edge) {\n\treturn objectTypeOf(edge) >>> 1;\n}\n\nfunction edgeXValueOf(edge) {\n\treturn objat(edge, GEXValue);\n}\n\nfunction edgeXValueOfput(edge, value) {\n\treturn objatput(edge, GEXValue, value);\n}\n\nfunction edgeYValueOf(edge) {\n\treturn objat(edge, GEYValue);\n}\n\nfunction edgeYValueOfput(edge, value) {\n\treturn objatput(edge, GEYValue, value);\n}\n\nfunction edgeZValueOf(edge) {\n\treturn objat(edge, GEZValue);\n}\n\nfunction edgeZValueOfput(edge, value) {\n\treturn objatput(edge, GEZValue, value);\n}\n\n\n/*\tIgnore dispatch errors when translating to C\n\t(since we have no entry point for #error in the VM proxy) */\n\nfunction errorWrongIndex() {\n\t;\n}\n\n\n/*\tFill the span buffer from leftX to rightX with the given fill. */\n\nfunction fillAllFromto(leftX, rightX) {\n\tvar fill;\n\tvar startX;\n\tvar stopX;\n\n\tfill = topFill();\n\tstartX = leftX;\n\tstopX = topRightX();\n\twhile (stopX < rightX) {\n\t\tfill = topFill();\n\t\tif (fill !== 0) {\n\t\t\tif (fillSpanfromto(fill, startX, stopX)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tquickRemoveInvalidFillsAt(stopX);\n\t\tstartX = stopX;\n\t\tstopX = topRightX();\n\t}\n\tfill = topFill();\n\tif (fill !== 0) {\n\t\treturn fillSpanfromto(fill, startX, rightX);\n\t}\n\treturn false;\n}\n\nfunction fillBitmapSpan() {\n\treturn fillBitmapSpanfromtoat(lastExportedFillGet(), lastExportedLeftXGet(), lastExportedRightXGet(), currentYGet());\n}\n\n\n/*\tFill the span buffer between leftEdge and rightEdge using the given bits.\n\tNote: We always start from zero - this avoids using huge bitmap buffers if the bitmap is to be displayed at the very far right hand side and also gives us a chance of using certain bitmaps (e.g., those with depth 32) directly. */\n\nfunction fillBitmapSpanfromto(bits, leftX, rightX) {\n\tvar baseShift;\n\tvar bitX;\n\tvar colorMask;\n\tvar colorShift;\n\tvar fillValue;\n\tvar x;\n\tvar x0;\n\tvar x1;\n\n\tx0 = leftX;\n\tx1 = rightX;\n\n\t/* Hack for pre-increment */\n\n\tbitX = -1;\n\tif (aaLevelGet() === 1) {\n\n\t\t/* Speedy version for no anti-aliasing */\n\n\t\twhile (x0 < x1) {\n\t\t\tfillValue = (bits[(++bitX)]|0);\n\t\t\tspanBuffer[x0] = fillValue;\n\t\t\t++x0;\n\t\t}\n\t} else {\n\n\t\t/* Generic version with anti-aliasing */\n\n\t\tcolorMask = aaColorMaskGet();\n\t\tcolorShift = aaColorShiftGet();\n\t\tbaseShift = aaShiftGet();\n\t\twhile (x0 < x1) {\n\t\t\tx = SHR(x0, baseShift);\n\t\t\tfillValue = (bits[(++bitX)]|0);\n\t\t\tfillValue = SHR((fillValue & colorMask), colorShift);\n\t\t\tspanBuffer[x] = (spanBuffer[x] + fillValue);\n\t\t\t++x0;\n\t\t}\n\t}\n\tif (x1 > spanEndGet()) {\n\t\tspanEndPut(x1);\n\t}\n\tif (x1 > spanEndAAGet()) {\n\t\tspanEndAAPut(x1);\n\t}\n}\n\nfunction fillBitmapSpanfromtoat(bmFill, leftX, rightX, yValue) {\n\tvar bits;\n\tvar bmHeight;\n\tvar bmWidth;\n\tvar deltaX;\n\tvar deltaY;\n\tvar ds;\n\tvar dsX;\n\tvar dt;\n\tvar dtX;\n\tvar fillValue;\n\tvar tileFlag;\n\tvar x;\n\tvar x1;\n\tvar xp;\n\tvar yp;\n\n\tif (aaLevelGet() !== 1) {\n\t\treturn fillBitmapSpanAAfromtoat(bmFill, leftX, rightX, yValue);\n\t}\n\tbits = loadBitsFrom(bmFill);\n\tif (!bits) {\n\t\treturn null;\n\t}\n\tbmWidth = bitmapWidthOf(bmFill);\n\tbmHeight = bitmapHeightOf(bmFill);\n\ttileFlag = bitmapTileFlagOf(bmFill) === 1;\n\tdeltaX = leftX - fillOriginXOf(bmFill);\n\tdeltaY = yValue - fillOriginYOf(bmFill);\n\tdsX = fillDirectionXOf(bmFill);\n\tdtX = fillNormalXOf(bmFill);\n\tds = (deltaX * dsX) + (deltaY * fillDirectionYOf(bmFill));\n\tdt = (deltaX * dtX) + (deltaY * fillNormalYOf(bmFill));\n\tx = leftX;\n\tx1 = rightX;\n\twhile (x < x1) {\n\t\tif (tileFlag) {\n\t\t\tds = repeatValuemax(ds, bmWidth << 16);\n\t\t\tdt = repeatValuemax(dt, bmHeight << 16);\n\t\t}\n\t\txp = ds >> 16;\n\t\typ = dt >> 16;\n\t\tif (!tileFlag) {\n\t\t\txp = clampValuemax(xp, bmWidth);\n\t\t\typ = clampValuemax(yp, bmHeight);\n\t\t}\n\t\tif ((xp >= 0) && ((yp >= 0) && ((xp < bmWidth) && (yp < bmHeight)))) {\n\t\t\tfillValue = bitmapValuebitsatXy(bmFill, bits, xp, yp);\n\t\t\tspanBuffer[x] = fillValue;\n\t\t}\n\t\tds += dsX;\n\t\tdt += dtX;\n\t\t++x;\n\t}\n}\n\nfunction fillBitmapSpanAAfromtoat(bmFill, leftX, rightX, yValue) {\n\tvar aaLevel;\n\tvar baseShift;\n\tvar bits;\n\tvar bmHeight;\n\tvar bmWidth;\n\tvar cMask;\n\tvar cShift;\n\tvar deltaX;\n\tvar deltaY;\n\tvar ds;\n\tvar dsX;\n\tvar dt;\n\tvar dtX;\n\tvar fillValue;\n\tvar firstPixel;\n\tvar idx;\n\tvar lastPixel;\n\tvar tileFlag;\n\tvar x;\n\tvar xp;\n\tvar yp;\n\n\tbits = loadBitsFrom(bmFill);\n\tif (!bits) {\n\t\treturn null;\n\t}\n\tbmWidth = bitmapWidthOf(bmFill);\n\tbmHeight = bitmapHeightOf(bmFill);\n\ttileFlag = bitmapTileFlagOf(bmFill) === 1;\n\tdeltaX = leftX - fillOriginXOf(bmFill);\n\tdeltaY = yValue - fillOriginYOf(bmFill);\n\tdsX = fillDirectionXOf(bmFill);\n\tdtX = fillNormalXOf(bmFill);\n\tds = (deltaX * dsX) + (deltaY * fillDirectionYOf(bmFill));\n\tdt = (deltaX * dtX) + (deltaY * fillNormalYOf(bmFill));\n\taaLevel = aaLevelGet();\n\tfirstPixel = aaFirstPixelFromto(leftX, rightX);\n\tlastPixel = aaLastPixelFromto(leftX, rightX);\n\tbaseShift = aaShiftGet();\n\tcMask = aaColorMaskGet();\n\tcShift = aaColorShiftGet();\n\tx = leftX;\n\twhile (x < firstPixel) {\n\t\tif (tileFlag) {\n\t\t\tds = repeatValuemax(ds, bmWidth << 16);\n\t\t\tdt = repeatValuemax(dt, bmHeight << 16);\n\t\t}\n\t\txp = ds >> 16;\n\t\typ = dt >> 16;\n\t\tif (!tileFlag) {\n\t\t\txp = clampValuemax(xp, bmWidth);\n\t\t\typ = clampValuemax(yp, bmHeight);\n\t\t}\n\t\tif ((xp >= 0) && ((yp >= 0) && ((xp < bmWidth) && (yp < bmHeight)))) {\n\t\t\tfillValue = bitmapValuebitsatXy(bmFill, bits, xp, yp);\n\t\t\tfillValue = SHR((fillValue & cMask), cShift);\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + fillValue);\n\t\t}\n\t\tds += dsX;\n\t\tdt += dtX;\n\t\t++x;\n\t}\n\tcMask = (SHR(aaColorMaskGet(), aaShiftGet())) | 4042322160;\n\tcShift = aaShiftGet();\n\twhile (x < lastPixel) {\n\t\tif (tileFlag) {\n\t\t\tds = repeatValuemax(ds, bmWidth << 16);\n\t\t\tdt = repeatValuemax(dt, bmHeight << 16);\n\t\t}\n\t\txp = ds >> 16;\n\t\typ = dt >> 16;\n\t\tif (!tileFlag) {\n\t\t\txp = clampValuemax(xp, bmWidth);\n\t\t\typ = clampValuemax(yp, bmHeight);\n\t\t}\n\t\tif ((xp >= 0) && ((yp >= 0) && ((xp < bmWidth) && (yp < bmHeight)))) {\n\t\t\tfillValue = bitmapValuebitsatXy(bmFill, bits, xp, yp);\n\t\t\tfillValue = SHR((fillValue & cMask), cShift);\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + fillValue);\n\t\t}\n\t\tds += SHL(dsX, cShift);\n\t\tdt += SHL(dtX, cShift);\n\t\tx += aaLevel;\n\t}\n\tcMask = aaColorMaskGet();\n\tcShift = aaColorShiftGet();\n\twhile (x < rightX) {\n\t\tif (tileFlag) {\n\t\t\tds = repeatValuemax(ds, bmWidth << 16);\n\t\t\tdt = repeatValuemax(dt, bmHeight << 16);\n\t\t}\n\t\txp = ds >> 16;\n\t\typ = dt >> 16;\n\t\tif (!tileFlag) {\n\t\t\txp = clampValuemax(xp, bmWidth);\n\t\t\typ = clampValuemax(yp, bmHeight);\n\t\t}\n\t\tif ((xp >= 0) && ((yp >= 0) && ((xp < bmWidth) && (yp < bmHeight)))) {\n\t\t\tfillValue = bitmapValuebitsatXy(bmFill, bits, xp, yp);\n\t\t\tfillValue = SHR((fillValue & cMask), cShift);\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + fillValue);\n\t\t}\n\t\tds += dsX;\n\t\tdt += dtX;\n\t\t++x;\n\t}\n}\n\n\n/*\tFill the span buffer between leftEdge and rightEdge with the given pixel value. */\n\nfunction fillColorSpanfromto(pixelValue32, leftX, rightX) {\n\tvar x0;\n\tvar x1;\n\n\n\t/* Use a unrolled version for anti-aliased fills... */\n\n\tif (aaLevelGet() !== 1) {\n\t\treturn fillColorSpanAAx0x1(pixelValue32, leftX, rightX);\n\t}\n\tx0 = leftX;\n\n\t/* Unroll the inner loop four times, since we're only storing data. */\n\n\tx1 = rightX;\n\twhile ((x0 + 4) < x1) {\n\t\tspanBuffer[x0] = pixelValue32;\n\t\tspanBuffer[x0 + 1] = pixelValue32;\n\t\tspanBuffer[x0 + 2] = pixelValue32;\n\t\tspanBuffer[x0 + 3] = pixelValue32;\n\t\tx0 += 4;\n\t}\n\twhile (x0 < x1) {\n\t\tspanBuffer[x0] = pixelValue32;\n\t\t++x0;\n\t}\n}\n\n\n/*\tThis is the inner loop for solid color fills with anti-aliasing.\n\tThis loop has been unrolled for speed and quality into three parts:\n\t\ta) copy all pixels that fall into the first full pixel.\n\t\tb) copy aaLevel pixels between the first and the last full pixel\n\t\tc) copy all pixels that fall in the last full pixel */\n\nfunction fillColorSpanAAx0x1(pixelValue32, leftX, rightX) {\n\tvar aaLevel;\n\tvar baseShift;\n\tvar colorMask;\n\tvar firstPixel;\n\tvar idx;\n\tvar lastPixel;\n\tvar pv32;\n\tvar x;\n\n\n\t/* Not now -- maybe later */\n\t/* Compute the pixel boundaries. */\n\n\tfirstPixel = aaFirstPixelFromto(leftX, rightX);\n\tlastPixel = aaLastPixelFromto(leftX, rightX);\n\taaLevel = aaLevelGet();\n\tbaseShift = aaShiftGet();\n\n\t/* Part a: Deal with the first n sub-pixels */\n\n\tx = leftX;\n\tif (x < firstPixel) {\n\t\tpv32 = SHR((pixelValue32 & aaColorMaskGet()), aaColorShiftGet());\n\t\twhile (x < firstPixel) {\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + pv32);\n\t\t\t++x;\n\t\t}\n\t}\n\tif (x < lastPixel) {\n\t\tcolorMask = (SHR(aaColorMaskGet(), aaShiftGet())) | 4042322160;\n\t\tpv32 = SHR((pixelValue32 & colorMask), aaShiftGet());\n\t\twhile (x < lastPixel) {\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + pv32);\n\t\t\tx += aaLevel;\n\t\t}\n\t}\n\tif (x < rightX) {\n\t\tpv32 = SHR((pixelValue32 & aaColorMaskGet()), aaColorShiftGet());\n\t\twhile (x < rightX) {\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + pv32);\n\t\t\t++x;\n\t\t}\n\t}\n}\n\nfunction fillDirectionXOf(fill) {\n\treturn objat(fill, GFDirectionX);\n}\n\nfunction fillDirectionXOfput(fill, value) {\n\treturn objatput(fill, GFDirectionX, value);\n}\n\nfunction fillDirectionYOf(fill) {\n\treturn objat(fill, GFDirectionY);\n}\n\nfunction fillDirectionYOfput(fill, value) {\n\treturn objatput(fill, GFDirectionY, value);\n}\n\nfunction fillLinearGradient() {\n\treturn fillLinearGradientfromtoat(lastExportedFillGet(), lastExportedLeftXGet(), lastExportedRightXGet(), currentYGet());\n}\n\n\n/*\tDraw a linear gradient fill. */\n\nfunction fillLinearGradientfromtoat(fill, leftX, rightX, yValue) {\n\tvar ds;\n\tvar dsX;\n\tvar ramp;\n\tvar rampIndex;\n\tvar rampSize;\n\tvar x;\n\tvar x0;\n\tvar x1;\n\n\tramp = gradientRampOf(fill);\n\trampSize = gradientRampLengthOf(fill);\n\tdsX = fillDirectionXOf(fill);\n\tds = ((leftX - fillOriginXOf(fill)) * dsX) + ((yValue - fillOriginYOf(fill)) * fillDirectionYOf(fill));\n\tx = (x0 = leftX);\n\n\t/* Note: The inner loop has been divided into three parts for speed */\n\t/* Part one: Fill everything outside the left boundary */\n\n\tx1 = rightX;\n\twhile (((((rampIndex = ds >> 16)) < 0) || (rampIndex >= rampSize)) && (x < x1)) {\n\t\t++x;\n\t\tds += dsX;\n\t}\n\tif (x > x0) {\n\t\tif (rampIndex < 0) {\n\t\t\trampIndex = 0;\n\t\t}\n\t\tif (rampIndex >= rampSize) {\n\t\t\trampIndex = rampSize - 1;\n\t\t}\n\t\tfillColorSpanfromto(ramp[rampIndex], x0, x);\n\t}\n\tif (aaLevelGet() === 1) {\n\n\t\t/* Fast version w/o anti-aliasing */\n\n\t\twhile (((((rampIndex = ds >> 16)) < rampSize) && (rampIndex >= 0)) && (x < x1)) {\n\t\t\tspanBuffer[x] = ramp[rampIndex];\n\t\t\t++x;\n\t\t\tds += dsX;\n\t\t}\n\t} else {\n\t\tx = fillLinearGradientAArampdsdsXfromto(fill, ramp, ds, dsX, x, rightX);\n\t}\n\tif (x < x1) {\n\t\tif (rampIndex < 0) {\n\t\t\trampIndex = 0;\n\t\t}\n\t\tif (rampIndex >= rampSize) {\n\t\t\trampIndex = rampSize - 1;\n\t\t}\n\t\tfillColorSpanfromto(ramp[rampIndex], x, x1);\n\t}\n}\n\n\n/*\tThis is the AA version of linear gradient filling. */\n\nfunction fillLinearGradientAArampdsdsXfromto(fill, ramp, deltaS, dsX, leftX, rightX) {\n\tvar aaLevel;\n\tvar baseShift;\n\tvar colorMask;\n\tvar colorShift;\n\tvar ds;\n\tvar firstPixel;\n\tvar idx;\n\tvar lastPixel;\n\tvar rampIndex;\n\tvar rampSize;\n\tvar rampValue;\n\tvar x;\n\n\taaLevel = aaLevelGet();\n\tbaseShift = aaShiftGet();\n\trampSize = gradientRampLengthOf(fill);\n\tds = deltaS;\n\tx = leftX;\n\trampIndex = ds >> 16;\n\tfirstPixel = aaFirstPixelFromto(leftX, rightX);\n\n\t/* Deal with the first n sub-pixels */\n\n\tlastPixel = aaLastPixelFromto(leftX, rightX);\n\tcolorMask = aaColorMaskGet();\n\tcolorShift = aaColorShiftGet();\n\twhile ((x < firstPixel) && ((rampIndex < rampSize) && (rampIndex >= 0))) {\n\t\trampValue = ramp[rampIndex];\n\n\t\t/* Copy as many pixels as possible */\n\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile ((x < firstPixel) && ((ds >> 16) === rampIndex)) {\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + rampValue);\n\t\t\t++x;\n\t\t\tds += dsX;\n\t\t}\n\t\trampIndex = ds >> 16;\n\t}\n\tcolorMask = (SHR(aaColorMaskGet(), aaShiftGet())) | 4042322160;\n\tcolorShift = aaShiftGet();\n\twhile ((x < lastPixel) && ((rampIndex < rampSize) && (rampIndex >= 0))) {\n\t\trampValue = ramp[rampIndex];\n\n\t\t/* Copy as many pixels as possible */\n\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile ((x < lastPixel) && ((ds >> 16) === rampIndex)) {\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + rampValue);\n\t\t\tx += aaLevel;\n\t\t\tds += SHL(dsX, colorShift);\n\t\t}\n\t\trampIndex = ds >> 16;\n\t}\n\tcolorMask = aaColorMaskGet();\n\tcolorShift = aaColorShiftGet();\n\twhile ((x < rightX) && ((rampIndex < rampSize) && (rampIndex >= 0))) {\n\t\trampValue = ramp[rampIndex];\n\n\t\t/* Copy as many pixels as possible */\n\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile ((x < rightX) && ((ds >> 16) === rampIndex)) {\n\t\t\tidx = SHR(x, baseShift);\n\t\t\tspanBuffer[idx] = (spanBuffer[idx] + rampValue);\n\t\t\t++x;\n\t\t\tds += dsX;\n\t\t}\n\t\trampIndex = ds >> 16;\n\t}\n\treturn x;\n}\n\nfunction fillMaxXGet() {\n\treturn workBuffer[GWFillMaxX];\n}\n\nfunction fillMaxXPut(value) {\n\treturn workBuffer[GWFillMaxX] = value;\n}\n\nfunction fillMaxYGet() {\n\treturn workBuffer[GWFillMaxY];\n}\n\nfunction fillMaxYPut(value) {\n\treturn workBuffer[GWFillMaxY] = value;\n}\n\nfunction fillMinXGet() {\n\treturn workBuffer[GWFillMinX];\n}\n\nfunction fillMinXPut(value) {\n\treturn workBuffer[GWFillMinX] = value;\n}\n\nfunction fillMinYGet() {\n\treturn workBuffer[GWFillMinY];\n}\n\nfunction fillMinYPut(value) {\n\treturn workBuffer[GWFillMinY] = value;\n}\n\nfunction fillNormalXOf(fill) {\n\treturn objat(fill, GFNormalX);\n}\n\nfunction fillNormalXOfput(fill, value) {\n\treturn objatput(fill, GFNormalX, value);\n}\n\nfunction fillNormalYOf(fill) {\n\treturn objat(fill, GFNormalY);\n}\n\nfunction fillNormalYOfput(fill, value) {\n\treturn objatput(fill, GFNormalY, value);\n}\n\nfunction fillOriginXOf(fill) {\n\treturn objat(fill, GFOriginX);\n}\n\nfunction fillOriginXOfput(fill, value) {\n\treturn objatput(fill, GFOriginX, value);\n}\n\nfunction fillOriginYOf(fill) {\n\treturn objat(fill, GFOriginY);\n}\n\nfunction fillOriginYOfput(fill, value) {\n\treturn objatput(fill, GFOriginY, value);\n}\n\n\n/*\tPart 2a) Compute the decreasing part of the ramp */\n\nfunction fillRadialDecreasingrampdeltaSTdsXdtXfromto(fill, ramp, deltaST, dsX, dtX, leftX, rightX) {\n\tvar ds;\n\tvar dt;\n\tvar length2;\n\tvar nextLength;\n\tvar rampIndex;\n\tvar rampValue;\n\tvar x;\n\tvar x1;\n\n\tds = (deltaST[0]|0);\n\tdt = (deltaST[1]|0);\n\trampIndex = accurateLengthOfwith(ds >> 16, dt >> 16);\n\trampValue = ramp[rampIndex];\n\tlength2 = (rampIndex - 1) * (rampIndex - 1);\n\tx = leftX;\n\tx1 = rightX;\n\tif (x1 > fillOriginXOf(fill)) {\n\t\tx1 = fillOriginXOf(fill);\n\t}\n\twhile (x < x1) {\n\n\t\t/* Try to copy the current value more than just once */\n\n\t\twhile ((x < x1) && (squaredLengthOfwith(ds >> 16, dt >> 16) >= length2)) {\n\t\t\tspanBuffer[x] = rampValue;\n\t\t\t++x;\n\t\t\tds += dsX;\n\t\t\tdt += dtX;\n\t\t}\n\t\tnextLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\t\twhile (nextLength < length2) {\n\t\t\t--rampIndex;\n\t\t\trampValue = ramp[rampIndex];\n\t\t\tlength2 = (rampIndex - 1) * (rampIndex - 1);\n\t\t}\n\t}\n\tdeltaST[0] = ds;\n\tdeltaST[1] = dt;\n\treturn x;\n}\n\n\n/*\tPart 2a) Compute the decreasing part of the ramp */\n\nfunction fillRadialDecreasingAArampdeltaSTdsXdtXfromto(fill, ramp, deltaST, dsX, dtX, leftX, rightX) {\n\tvar aaLevel;\n\tvar baseShift;\n\tvar colorMask;\n\tvar colorShift;\n\tvar ds;\n\tvar dt;\n\tvar firstPixel;\n\tvar index;\n\tvar lastPixel;\n\tvar length2;\n\tvar nextLength;\n\tvar rampIndex;\n\tvar rampValue;\n\tvar x;\n\tvar x1;\n\n\tds = (deltaST[0]|0);\n\tdt = (deltaST[1]|0);\n\taaLevel = aaLevelGet();\n\tbaseShift = aaShiftGet();\n\trampIndex = accurateLengthOfwith(ds >> 16, dt >> 16);\n\tlength2 = (rampIndex - 1) * (rampIndex - 1);\n\tx = leftX;\n\tx1 = fillOriginXOf(fill);\n\tif (x1 > rightX) {\n\t\tx1 = rightX;\n\t}\n\tfirstPixel = aaFirstPixelFromto(leftX, x1);\n\n\t/* Deal with the first n sub-pixels */\n\n\tlastPixel = aaLastPixelFromto(leftX, x1);\n\tif (x < firstPixel) {\n\t\tcolorMask = aaColorMaskGet();\n\t\tcolorShift = aaColorShiftGet();\n\t\trampValue = ramp[rampIndex];\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile (x < firstPixel) {\n\n\t\t\t/* Try to copy the current value more than just once */\n\n\t\t\twhile ((x < firstPixel) && (squaredLengthOfwith(ds >> 16, dt >> 16) >= length2)) {\n\t\t\t\tindex = SHR(x, baseShift);\n\t\t\t\tspanBuffer[index] = (spanBuffer[index] + rampValue);\n\t\t\t\t++x;\n\t\t\t\tds += dsX;\n\t\t\t\tdt += dtX;\n\t\t\t}\n\t\t\tnextLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\t\t\twhile (nextLength < length2) {\n\t\t\t\t--rampIndex;\n\t\t\t\trampValue = ramp[rampIndex];\n\t\t\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\t\t\tlength2 = (rampIndex - 1) * (rampIndex - 1);\n\t\t\t}\n\t\t}\n\t}\n\tif (x < lastPixel) {\n\t\tcolorMask = (SHR(aaColorMaskGet(), aaShiftGet())) | 4042322160;\n\t\tcolorShift = aaShiftGet();\n\t\trampValue = ramp[rampIndex];\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile (x < lastPixel) {\n\n\t\t\t/* Try to copy the current value more than just once */\n\n\t\t\twhile ((x < lastPixel) && (squaredLengthOfwith(ds >> 16, dt >> 16) >= length2)) {\n\t\t\t\tindex = SHR(x, baseShift);\n\t\t\t\tspanBuffer[index] = (spanBuffer[index] + rampValue);\n\t\t\t\tx += aaLevel;\n\t\t\t\tds += SHL(dsX, colorShift);\n\t\t\t\tdt += SHL(dtX, colorShift);\n\t\t\t}\n\t\t\tnextLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\t\t\twhile (nextLength < length2) {\n\t\t\t\t--rampIndex;\n\t\t\t\trampValue = ramp[rampIndex];\n\t\t\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\t\t\tlength2 = (rampIndex - 1) * (rampIndex - 1);\n\t\t\t}\n\t\t}\n\t}\n\tif (x < x1) {\n\t\tcolorMask = aaColorMaskGet();\n\t\tcolorShift = aaColorShiftGet();\n\t\trampValue = ramp[rampIndex];\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile (x < x1) {\n\n\t\t\t/* Try to copy the current value more than just once */\n\n\t\t\twhile ((x < x1) && (squaredLengthOfwith(ds >> 16, dt >> 16) >= length2)) {\n\t\t\t\tindex = SHR(x, baseShift);\n\t\t\t\tspanBuffer[index] = (spanBuffer[index] + rampValue);\n\t\t\t\t++x;\n\t\t\t\tds += dsX;\n\t\t\t\tdt += dtX;\n\t\t\t}\n\t\t\tnextLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\t\t\twhile (nextLength < length2) {\n\t\t\t\t--rampIndex;\n\t\t\t\trampValue = ramp[rampIndex];\n\t\t\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\t\t\tlength2 = (rampIndex - 1) * (rampIndex - 1);\n\t\t\t}\n\t\t}\n\t}\n\tdeltaST[0] = ds;\n\tdeltaST[1] = dt;\n\treturn x;\n}\n\nfunction fillRadialGradient() {\n\treturn fillRadialGradientfromtoat(lastExportedFillGet(), lastExportedLeftXGet(), lastExportedRightXGet(), currentYGet());\n}\n\n\n/*\tDraw a radial gradient fill. */\n\nfunction fillRadialGradientfromtoat(fill, leftX, rightX, yValue) {\n\tvar deltaST;\n\tvar deltaX;\n\tvar deltaY;\n\tvar ds;\n\tvar dsX;\n\tvar dt;\n\tvar dtX;\n\tvar length2;\n\tvar ramp;\n\tvar rampSize;\n\tvar x;\n\tvar x1;\n\n\tramp = gradientRampOf(fill);\n\trampSize = gradientRampLengthOf(fill);\n\tdeltaX = leftX - fillOriginXOf(fill);\n\tdeltaY = yValue - fillOriginYOf(fill);\n\tdsX = fillDirectionXOf(fill);\n\tdtX = fillNormalXOf(fill);\n\tds = (deltaX * dsX) + (deltaY * fillDirectionYOf(fill));\n\tdt = (deltaX * dtX) + (deltaY * fillNormalYOf(fill));\n\tx = leftX;\n\n\t/* Note: The inner loop has been divided into three parts for speed */\n\t/* Part one: Fill everything outside the left boundary */\n\n\tx1 = rightX;\n\n\t/* This is the upper bound */\n\n\tlength2 = (rampSize - 1) * (rampSize - 1);\n\twhile ((squaredLengthOfwith(ds >> 16, dt >> 16) >= length2) && (x < x1)) {\n\t\t++x;\n\t\tds += dsX;\n\t\tdt += dtX;\n\t}\n\tif (x > leftX) {\n\t\tfillColorSpanfromto(ramp[rampSize - 1], leftX, x);\n\t}\n\tdeltaST = point1Get();\n\tdeltaST[0] = ds;\n\tdeltaST[1] = dt;\n\tif (x < fillOriginXOf(fill)) {\n\n\t\t/* Draw the decreasing part */\n\n\t\tif (aaLevelGet() === 1) {\n\t\t\tx = fillRadialDecreasingrampdeltaSTdsXdtXfromto(fill, ramp, deltaST, dsX, dtX, x, x1);\n\t\t} else {\n\t\t\tx = fillRadialDecreasingAArampdeltaSTdsXdtXfromto(fill, ramp, deltaST, dsX, dtX, x, x1);\n\t\t}\n\t}\n\tif (x < x1) {\n\n\t\t/* Draw the increasing part */\n\n\t\tif (aaLevelGet() === 1) {\n\t\t\tx = fillRadialIncreasingrampdeltaSTdsXdtXfromto(fill, ramp, deltaST, dsX, dtX, x, x1);\n\t\t} else {\n\t\t\tx = fillRadialIncreasingAArampdeltaSTdsXdtXfromto(fill, ramp, deltaST, dsX, dtX, x, x1);\n\t\t}\n\t}\n\tif (x < rightX) {\n\t\tfillColorSpanfromto(ramp[rampSize - 1], x, rightX);\n\t}\n}\n\n\n/*\tPart 2b) Compute the increasing part of the ramp */\n\nfunction fillRadialIncreasingrampdeltaSTdsXdtXfromto(fill, ramp, deltaST, dsX, dtX, leftX, rightX) {\n\tvar ds;\n\tvar dt;\n\tvar lastLength;\n\tvar length2;\n\tvar nextLength;\n\tvar rampIndex;\n\tvar rampSize;\n\tvar rampValue;\n\tvar x;\n\tvar x1;\n\n\tds = (deltaST[0]|0);\n\tdt = (deltaST[1]|0);\n\trampIndex = accurateLengthOfwith(ds >> 16, dt >> 16);\n\trampValue = ramp[rampIndex];\n\trampSize = gradientRampLengthOf(fill);\n\n\t/* This is the upper bound */\n\n\tlength2 = (rampSize - 1) * (rampSize - 1);\n\tnextLength = (rampIndex + 1) * (rampIndex + 1);\n\tlastLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\tx = leftX;\n\tx1 = rightX;\n\twhile ((x < x1) && (lastLength < length2)) {\n\n\t\t/* Try to copy the current value more than once */\n\n\t\twhile ((x < x1) && (squaredLengthOfwith(ds >> 16, dt >> 16) <= nextLength)) {\n\t\t\tspanBuffer[x] = rampValue;\n\t\t\t++x;\n\t\t\tds += dsX;\n\t\t\tdt += dtX;\n\t\t}\n\t\tlastLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\t\twhile (lastLength > nextLength) {\n\t\t\t++rampIndex;\n\t\t\trampValue = ramp[rampIndex];\n\t\t\tnextLength = (rampIndex + 1) * (rampIndex + 1);\n\t\t}\n\t}\n\tdeltaST[0] = ds;\n\tdeltaST[1] = dt;\n\treturn x;\n}\n\n\n/*\tPart 2b) Compute the increasing part of the ramp */\n\nfunction fillRadialIncreasingAArampdeltaSTdsXdtXfromto(fill, ramp, deltaST, dsX, dtX, leftX, rightX) {\n\tvar aaLevel;\n\tvar baseShift;\n\tvar colorMask;\n\tvar colorShift;\n\tvar ds;\n\tvar dt;\n\tvar firstPixel;\n\tvar index;\n\tvar lastLength;\n\tvar lastPixel;\n\tvar length2;\n\tvar nextLength;\n\tvar rampIndex;\n\tvar rampSize;\n\tvar rampValue;\n\tvar x;\n\n\tds = (deltaST[0]|0);\n\tdt = (deltaST[1]|0);\n\taaLevel = aaLevelGet();\n\tbaseShift = aaShiftGet();\n\trampIndex = accurateLengthOfwith(ds >> 16, dt >> 16);\n\trampSize = gradientRampLengthOf(fill);\n\n\t/* This is the upper bound */\n\n\tlength2 = (rampSize - 1) * (rampSize - 1);\n\tnextLength = (rampIndex + 1) * (rampIndex + 1);\n\tlastLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\tx = leftX;\n\tfirstPixel = aaFirstPixelFromto(leftX, rightX);\n\n\t/* Deal with the first n subPixels */\n\n\tlastPixel = aaLastPixelFromto(leftX, rightX);\n\tif ((x < firstPixel) && (lastLength < length2)) {\n\t\tcolorMask = aaColorMaskGet();\n\t\tcolorShift = aaColorShiftGet();\n\t\trampValue = ramp[rampIndex];\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile ((x < firstPixel) && (lastLength < length2)) {\n\n\t\t\t/* Try to copy the current value more than once */\n\n\t\t\twhile ((x < firstPixel) && (squaredLengthOfwith(ds >> 16, dt >> 16) <= nextLength)) {\n\t\t\t\tindex = SHR(x, baseShift);\n\t\t\t\tspanBuffer[index] = (spanBuffer[index] + rampValue);\n\t\t\t\t++x;\n\t\t\t\tds += dsX;\n\t\t\t\tdt += dtX;\n\t\t\t}\n\t\t\tlastLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\t\t\twhile (lastLength > nextLength) {\n\t\t\t\t++rampIndex;\n\t\t\t\trampValue = ramp[rampIndex];\n\t\t\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\t\t\tnextLength = (rampIndex + 1) * (rampIndex + 1);\n\t\t\t}\n\t\t}\n\t}\n\tif ((x < lastPixel) && (lastLength < length2)) {\n\t\tcolorMask = (SHR(aaColorMaskGet(), aaShiftGet())) | 4042322160;\n\t\tcolorShift = aaShiftGet();\n\t\trampValue = ramp[rampIndex];\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile ((x < lastPixel) && (lastLength < length2)) {\n\n\t\t\t/* Try to copy the current value more than once */\n\n\t\t\twhile ((x < lastPixel) && (squaredLengthOfwith(ds >> 16, dt >> 16) <= nextLength)) {\n\t\t\t\tindex = SHR(x, baseShift);\n\t\t\t\tspanBuffer[index] = (spanBuffer[index] + rampValue);\n\t\t\t\tx += aaLevel;\n\t\t\t\tds += SHL(dsX, colorShift);\n\t\t\t\tdt += SHL(dtX, colorShift);\n\t\t\t}\n\t\t\tlastLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\t\t\twhile (lastLength > nextLength) {\n\t\t\t\t++rampIndex;\n\t\t\t\trampValue = ramp[rampIndex];\n\t\t\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\t\t\tnextLength = (rampIndex + 1) * (rampIndex + 1);\n\t\t\t}\n\t\t}\n\t}\n\tif ((x < rightX) && (lastLength < length2)) {\n\t\tcolorMask = aaColorMaskGet();\n\t\tcolorShift = aaColorShiftGet();\n\t\trampValue = ramp[rampIndex];\n\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\twhile ((x < rightX) && (lastLength < length2)) {\n\n\t\t\t/* Try to copy the current value more than once */\n\n\t\t\twhile ((x < rightX) && (squaredLengthOfwith(ds >> 16, dt >> 16) <= nextLength)) {\n\t\t\t\tindex = SHR(x, baseShift);\n\t\t\t\tspanBuffer[index] = (spanBuffer[index] + rampValue);\n\t\t\t\t++x;\n\t\t\t\tds += dsX;\n\t\t\t\tdt += dtX;\n\t\t\t}\n\t\t\tlastLength = squaredLengthOfwith(ds >> 16, dt >> 16);\n\t\t\twhile (lastLength > nextLength) {\n\t\t\t\t++rampIndex;\n\t\t\t\trampValue = ramp[rampIndex];\n\t\t\t\trampValue = SHR((rampValue & colorMask), colorShift);\n\t\t\t\tnextLength = (rampIndex + 1) * (rampIndex + 1);\n\t\t\t}\n\t\t}\n\t}\n\tdeltaST[0] = ds;\n\tdeltaST[1] = dt;\n\treturn x;\n}\n\n\n/*\tReturn true if fillEntry1 should be drawn before fillEntry2 */\n\nfunction fillSortsbefore(fillEntry1, fillEntry2) {\n\tvar diff;\n\n\n\t/* First check the depth value */\n\n\tdiff = stackFillDepth(fillEntry1) - stackFillDepth(fillEntry2);\n\tif (diff !== 0) {\n\t\treturn diff > 0;\n\t}\n\treturn (stackFillValue(fillEntry1)>>>0) < (stackFillValue(fillEntry2)>>>0);\n}\n\n\n/*\tFill the span buffer from leftX to rightX with the given fill.\n\tClip before performing any operations. Return true if the fill must\n\tbe handled by some Smalltalk code. */\n\nfunction fillSpanfromto(fill, leftX, rightX) {\n\tvar type;\n\tvar x0;\n\tvar x1;\n\n\tif (fill === 0) {\n\t\treturn false;\n\t}\n\tif (leftX < spanEndAAGet()) {\n\t\tx0 = spanEndAAGet();\n\t} else {\n\t\tx0 = leftX;\n\t}\n\tif (rightX > (SHL(spanSizeGet(), aaShiftGet()))) {\n\t\tx1 = SHL(spanSizeGet(), aaShiftGet());\n\t} else {\n\t\tx1 = rightX;\n\t}\n\tif (x0 < fillMinXGet()) {\n\t\tx0 = fillMinXGet();\n\t}\n\tif (x1 > fillMaxXGet()) {\n\t\tx1 = fillMaxXGet();\n\t}\n\tif (x0 < spanStartGet()) {\n\t\tspanStartPut(x0);\n\t}\n\tif (x1 > spanEndGet()) {\n\t\tspanEndPut(x1);\n\t}\n\tif (x1 > spanEndAAGet()) {\n\t\tspanEndAAPut(x1);\n\t}\n\tif (x0 >= x1) {\n\t\treturn false;\n\t}\n\tif (isFillColor(fill)) {\n\t\tfillColorSpanfromto(fill, x0, x1);\n\t} else {\n\n\t\t/* Store the values for the dispatch */\n\n\t\tlastExportedFillPut(fill);\n\t\tlastExportedLeftXPut(x0);\n\t\tlastExportedRightXPut(x1);\n\t\ttype = fillTypeOf(fill);\n\t\tif (type <= 1) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (type) {\n\t\tcase 0:\n\t\tcase 1:\n\t\t\terrorWrongIndex();\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tfillLinearGradient();\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tfillRadialGradient();\n\t\t\tbreak;\n\t\tcase 4:\n\t\tcase 5:\n\t\t\tfillBitmapSpan();\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction fillTypeOf(fill) {\n\treturn (objectTypeOf(fill) & GEPrimitiveFillMask) >>> 8;\n}\n\n\n/*\tCheck the global edge table for any entries that cannot be handled by the engine itself.\n\tIf there are any, return true. Otherwise, initialize the the edge and add it to the AET */\n\nfunction findNextExternalEntryFromGET() {\n\tvar edge;\n\tvar type;\n\tvar yValue;\n\n\n\t/* As long as we have entries in the GET */\n\n\tyValue = currentYGet();\n\twhile (getStartGet() < getUsedGet()) {\n\t\tedge = getBuffer[getStartGet()];\n\t\tif (edgeYValueOf(edge) > yValue) {\n\t\t\treturn false;\n\t\t}\n\t\ttype = objectTypeOf(edge);\n\t\tif ((type & GEPrimitiveWideMask) === GEPrimitiveEdge) {\n\t\t\treturn true;\n\t\t}\n\t\tif (!needAvailableSpace(1)) {\n\t\t\treturn false;\n\t\t}\n\t\tswitch (type) {\n\t\tcase 0:\n\t\tcase 1:\n\t\tcase 2:\n\t\tcase 3:\n\t\t\terrorWrongIndex();\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tstepToFirstLine();\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tstepToFirstWideLine();\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\tstepToFirstBezier();\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\tstepToFirstWideBezier();\n\t\t\tbreak;\n\t\t}\n\t\tinsertEdgeIntoAET(edge);\n\t\tgetStartPut(getStartGet() + 1);\n\t}\n\treturn false;\n}\n\n\n/*\tScan the active edge table. If there is any fill that cannot be handled by the engine itself, return true. Otherwise handle the fills and return false. */\n/*\tself currentYGet >= 680 ifTrue:[\nself printAET.\nself halt.\n]. */\n\nfunction findNextExternalFillFromAET() {\n\tvar leftEdge;\n\tvar leftX;\n\tvar rightEdge;\n\tvar rightX;\n\n\tleftX = (rightX = fillMaxXGet());\n\twhile (aetStartGet() < aetUsedGet()) {\n\n\t\t/* TODO: We should check if leftX from last operation \n\t\t\tis greater than leftX from next edge.\n\t\t\tCurrently, we rely here on spanEndAA\n\t\t\tfrom the span buffer fill. */\n\n\t\tleftEdge = (rightEdge = aetBuffer[aetStartGet()]);\n\t\tleftX = (rightX = edgeXValueOf(leftEdge));\n\t\tif (leftX >= fillMaxXGet()) {\n\t\t\treturn false;\n\t\t}\n\t\tquickRemoveInvalidFillsAt(leftX);\n\t\tif (isWide(leftEdge)) {\n\t\t\ttoggleWideFillOf(leftEdge);\n\t\t}\n\t\tif (areEdgeFillsValid(leftEdge)) {\n\t\t\ttoggleFillsOf(leftEdge);\n\t\t\tif (engineStopped) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\taetStartPut(aetStartGet() + 1);\n\t\tif (aetStartGet() < aetUsedGet()) {\n\t\t\trightEdge = aetBuffer[aetStartGet()];\n\t\t\trightX = edgeXValueOf(rightEdge);\n\t\t\tif (rightX >= fillMinXGet()) {\n\n\t\t\t\t/* This is the visible portion */\n\n\t\t\t\tfillAllFromto(leftX, rightX);\n\t\t\t}\n\t\t}\n\t}\n\tif (rightX < fillMaxXGet()) {\n\t\tfillAllFromto(rightX, fillMaxXGet());\n\t}\n\treturn false;\n}\n\n\n/*\tCheck the active edge table for any entries that cannot be handled by the engine itself.\n\tIf there are any, return true. Otherwise, step the the edge to the next y value. */\n\nfunction findNextExternalUpdateFromAET() {\n\tvar count;\n\tvar edge;\n\tvar type;\n\n\twhile (aetStartGet() < aetUsedGet()) {\n\t\tedge = aetBuffer[aetStartGet()];\n\t\tcount = edgeNumLinesOf(edge) - 1;\n\t\tif (count === 0) {\n\n\t\t\t/* Edge at end -- remove it */\n\n\t\t\tremoveFirstAETEntry();\n\t\t} else {\n\n\t\t\t/* Store remaining lines back */\n\n\t\t\tedgeNumLinesOfput(edge, count);\n\t\t\ttype = objectTypeOf(edge);\n\t\t\tif ((type & GEPrimitiveWideMask) === GEPrimitiveEdge) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tswitch (type) {\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\tcase 3:\n\t\t\t\terrorWrongIndex();\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tstepToNextLine();\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\tstepToNextWideLine();\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\tstepToNextBezier();\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\tstepToNextWideBezier();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresortFirstAETEntry();\n\t\t\taetStartPut(aetStartGet() + 1);\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction findStackFilldepth(fillIndex, depth) {\n\tvar index;\n\n\tindex = 0;\n\twhile ((index < stackFillSize()) && ((stackFillValue(index) !== fillIndex) || (stackFillDepth(index) !== depth))) {\n\t\tindex += stackFillEntryLength();\n\t}\n\tif (index >= stackFillSize()) {\n\t\treturn -1;\n\t} else {\n\t\treturn index;\n\t}\n}\n\n\n/*\tReturn true if processing is finished */\n\nfunction finishedProcessing() {\n\treturn stateGet() === GEStateCompleted;\n}\n\nfunction freeStackFillEntry() {\n\twbStackPop(stackFillEntryLength());\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\n\n/*\tReturn true if the edge at index i should sort before the edge at index j. */\n\nfunction getSortsbefore(edge1, edge2) {\n\tvar diff;\n\n\tif (edge1 === edge2) {\n\t\treturn true;\n\t}\n\tdiff = edgeYValueOf(edge1) - edgeYValueOf(edge2);\n\tif (diff !== 0) {\n\t\treturn diff < 0;\n\t}\n\tdiff = edgeXValueOf(edge1) - edgeXValueOf(edge2);\n\treturn diff < 0;\n}\n\nfunction getStartGet() {\n\treturn workBuffer[GWGETStart];\n}\n\nfunction getStartPut(value) {\n\treturn workBuffer[GWGETStart] = value;\n}\n\nfunction getUsedGet() {\n\treturn workBuffer[GWGETUsed];\n}\n\nfunction getUsedPut(value) {\n\treturn workBuffer[GWGETUsed] = value;\n}\n\nfunction gradientRampLengthOf(fill) {\n\treturn objat(fill, GFRampLength);\n}\n\nfunction gradientRampLengthOfput(fill, value) {\n\treturn objatput(fill, GFRampLength, value);\n}\n\nfunction gradientRampOf(fill) {\n\treturn PTR_ADD(objBuffer, fill + GFRampOffset);\n}\n\nfunction halt() {\n\t;\n}\n\nfunction hasColorTransform() {\n\treturn hasColorTransformGet() !== 0;\n}\n\nfunction hasColorTransformGet() {\n\treturn workBuffer[GWHasColorTransform];\n}\n\nfunction hasColorTransformPut(value) {\n\treturn workBuffer[GWHasColorTransform] = value;\n}\n\nfunction hasEdgeTransform() {\n\treturn hasEdgeTransformGet() !== 0;\n}\n\nfunction hasEdgeTransformGet() {\n\treturn workBuffer[GWHasEdgeTransform];\n}\n\nfunction hasEdgeTransformPut(value) {\n\treturn workBuffer[GWHasEdgeTransform] = value;\n}\n\n\n/*\tMake the fill style with the given index invisible */\n\nfunction hideFilldepth(fillIndex, depth) {\n\tvar index;\n\tvar newDepth;\n\tvar newRightX;\n\tvar newTop;\n\tvar newTopIndex;\n\n\tindex = findStackFilldepth(fillIndex, depth);\n\tif (index === -1) {\n\t\treturn false;\n\t}\n\tif (index === 0) {\n\t\tfreeStackFillEntry();\n\t\treturn true;\n\t}\n\tstackFillValueput(index, stackFillValue(0));\n\tstackFillDepthput(index, stackFillDepth(0));\n\tstackFillRightXput(index, stackFillRightX(0));\n\tfreeStackFillEntry();\n\tif (stackFillSize() <= stackFillEntryLength()) {\n\t\treturn true;\n\t}\n\tnewTopIndex = 0;\n\tindex = stackFillEntryLength();\n\twhile (index < stackFillSize()) {\n\t\tif (fillSortsbefore(index, newTopIndex)) {\n\t\t\tnewTopIndex = index;\n\t\t}\n\t\tindex += stackFillEntryLength();\n\t}\n\tif ((newTopIndex + stackFillEntryLength()) === stackFillSize()) {\n\t\treturn true;\n\t}\n\tnewTop = stackFillValue(newTopIndex);\n\tstackFillValueput(newTopIndex, topFillValue());\n\ttopFillValuePut(newTop);\n\tnewDepth = stackFillDepth(newTopIndex);\n\tstackFillDepthput(newTopIndex, topFillDepth());\n\ttopFillDepthPut(newDepth);\n\tnewRightX = stackFillRightX(newTopIndex);\n\tstackFillRightXput(newTopIndex, topFillRightX());\n\ttopFillRightXPut(newRightX);\n\treturn true;\n}\n\nfunction incrementStatby(statIndex, value) {\n\treturn workBuffer[statIndex] = (workBuffer[statIndex] + value);\n}\n\n\n/*\tFind insertion point for the given edge in the AET */\n\nfunction indexForInsertingIntoAET(edge) {\n\tvar index;\n\tvar initialX;\n\n\tinitialX = edgeXValueOf(edge);\n\tindex = 0;\n\twhile ((index < aetUsedGet()) && (edgeXValueOf(aetBuffer[index]) < initialX)) {\n\t\t++index;\n\t}\n\twhile ((index < aetUsedGet()) && ((edgeXValueOf(aetBuffer[index]) === initialX) && (getSortsbefore(aetBuffer[index], edge)))) {\n\t\t++index;\n\t}\n\treturn index;\n}\n\nfunction initColorTransform() {\n\tvar transform;\n\n\ttransform = colorTransform();\n\ttransform[0] = 1.0;\n\ttransform[1] = 0.0;\n\ttransform[2] = 1.0;\n\ttransform[3] = 0.0;\n\ttransform[4] = 1.0;\n\ttransform[5] = 0.0;\n\ttransform[6] = 1.0;\n\ttransform[7] = 0.0;\n\thasColorTransformPut(0);\n}\n\nfunction initEdgeTransform() {\n\tvar transform;\n\n\ttransform = edgeTransform();\n\ttransform[0] = 1.0;\n\ttransform[1] = 0.0;\n\ttransform[2] = 0.0;\n\ttransform[3] = 0.0;\n\ttransform[4] = 1.0;\n\ttransform[5] = 0.0;\n\thasEdgeTransformPut(0);\n}\n\nfunction initialiseModule() {\n\tloadBBFn = interpreterProxy.ioLoadFunctionFrom(\"loadBitBltFrom\", bbPluginName);\n\tcopyBitsFn = interpreterProxy.ioLoadFunctionFrom(\"copyBitsFromtoat\", bbPluginName);\n\treturn (!!loadBBFn) && (!!copyBitsFn);\n}\n\n\n/*\tInitialization stuff that needs to be done before any processing can take place. */\n/*\tMake sure aaLevel is initialized */\n\nfunction initializeGETProcessing() {\n\tsetAALevel(aaLevelGet());\n\tif (clipMinXGet() < 0) {\n\t\tclipMinXPut(0);\n\t}\n\tif (clipMaxXGet() > spanSizeGet()) {\n\t\tclipMaxXPut(spanSizeGet());\n\t}\n\tfillMinXPut(SHL(clipMinXGet(), aaShiftGet()));\n\tfillMinYPut(SHL(clipMinYGet(), aaShiftGet()));\n\tfillMaxXPut(SHL(clipMaxXGet(), aaShiftGet()));\n\tfillMaxYPut(SHL(clipMaxYGet(), aaShiftGet()));\n\tgetUsedPut(0);\n\taetUsedPut(0);\n\tgetBuffer = PTR_ADD(objBuffer, objUsed);\n\n\t/* Create the global edge table */\n\n\taetBuffer = PTR_ADD(objBuffer, objUsed);\n\tcreateGlobalEdgeTable();\n\tif (engineStopped) {\n\t\treturn null;\n\t}\n\tif (getUsedGet() === 0) {\n\n\t\t/* Nothing to do */\n\n\t\tcurrentYPut(fillMaxYGet());\n\t\treturn 0;\n\t}\n\tsortGlobalEdgeTable();\n\tcurrentYPut(edgeYValueOf(getBuffer[0]));\n\tif (currentYGet() < fillMinYGet()) {\n\t\tcurrentYPut(fillMinYGet());\n\t}\n\tspanStartPut(0);\n\tspanEndPut((SHL(spanSizeGet(), aaShiftGet())) - 1);\n\tclearSpanBuffer();\n}\n\n\n/*\tInsert the edge with the given index from the global edge table into the active edge table.\n\tThe edge has already been stepped to the initial yValue -- thus remainingLines and rasterX\n\tare both set. */\n\nfunction insertEdgeIntoAET(edge) {\n\tvar index;\n\n\n\t/* Check for the number of lines remaining */\n\n\tif (edgeNumLinesOf(edge) <= 0) {\n\t\treturn null;\n\t}\n\n\t/* And insert edge */\n\n\tindex = indexForInsertingIntoAET(edge);\n\tinsertToAETbeforeIndex(edge, index);\n}\n\n\n/*\tInsert the given edge into the AET. */\n\nfunction insertToAETbeforeIndex(edge, index) {\n\tvar i;\n\n\n\t/* Make sure we have space in the AET */\n\n\tif (!allocateAETEntry(1)) {\n\t\treturn null;\n\t}\n\ti = aetUsedGet() - 1;\n\twhile (!(i < index)) {\n\t\taetBuffer[i + 1] = aetBuffer[i];\n\t\t--i;\n\t}\n\taetBuffer[index] = edge;\n\taetUsedPut(aetUsedGet() + 1);\n}\n\nfunction isBezier(bezier) {\n\treturn (objectTypeOf(bezier) & GEPrimitiveWideMask) === GEPrimitiveBezier;\n}\n\nfunction isEdge(edge) {\n\tvar type;\n\n\ttype = objectTypeOf(edge);\n\tif (type > GEPrimitiveEdgeMask) {\n\t\treturn false;\n\t}\n\treturn (objectTypeOf(edge) & GEPrimitiveEdgeMask) !== 0;\n}\n\nfunction isFill(fill) {\n\treturn isFillColor(fill) || (isRealFill(fill));\n}\n\nfunction isFillColor(fill) {\n\treturn (fill & 4278190080) !== 0;\n}\n\nfunction isFillOkay(fill) {\n\treturn (fill === 0) || (isFillColor(fill) || (isObject(fill) && (isFill(fill))));\n}\n\nfunction isLine(line) {\n\treturn (objectTypeOf(line) & GEPrimitiveWideMask) === GEPrimitiveLine;\n}\n\nfunction isObject(obj) {\n\treturn (obj >= 0) && (obj < objUsed);\n}\n\nfunction isRealFill(fill) {\n\treturn (objectTypeOf(fill) & GEPrimitiveFillMask) !== 0;\n}\n\nfunction isWide(object) {\n\treturn (objectTypeOf(object) & GEPrimitiveWide) !== 0;\n}\n\nfunction lastExportedEdgeGet() {\n\treturn workBuffer[GWLastExportedEdge];\n}\n\nfunction lastExportedEdgePut(value) {\n\treturn workBuffer[GWLastExportedEdge] = value;\n}\n\nfunction lastExportedFillGet() {\n\treturn workBuffer[GWLastExportedFill];\n}\n\nfunction lastExportedFillPut(value) {\n\treturn workBuffer[GWLastExportedFill] = value;\n}\n\nfunction lastExportedLeftXGet() {\n\treturn workBuffer[GWLastExportedLeftX];\n}\n\nfunction lastExportedLeftXPut(value) {\n\treturn workBuffer[GWLastExportedLeftX] = value;\n}\n\nfunction lastExportedRightXGet() {\n\treturn workBuffer[GWLastExportedRightX];\n}\n\nfunction lastExportedRightXPut(value) {\n\treturn workBuffer[GWLastExportedRightX] = value;\n}\n\nfunction lineEndXOf(line) {\n\treturn objat(line, GLEndX);\n}\n\nfunction lineEndXOfput(line, value) {\n\treturn objatput(line, GLEndX, value);\n}\n\nfunction lineEndYOf(line) {\n\treturn objat(line, GLEndY);\n}\n\nfunction lineEndYOfput(line, value) {\n\treturn objatput(line, GLEndY, value);\n}\n\nfunction lineErrorAdjDownOf(line) {\n\treturn objat(line, GLErrorAdjDown);\n}\n\nfunction lineErrorAdjDownOfput(line, value) {\n\treturn objatput(line, GLErrorAdjDown, value);\n}\n\nfunction lineErrorAdjUpOf(line) {\n\treturn objat(line, GLErrorAdjUp);\n}\n\nfunction lineErrorAdjUpOfput(line, value) {\n\treturn objatput(line, GLErrorAdjUp, value);\n}\n\nfunction lineErrorOf(line) {\n\treturn objat(line, GLError);\n}\n\nfunction lineErrorOfput(line, value) {\n\treturn objatput(line, GLError, value);\n}\n\nfunction lineXDirectionOf(line) {\n\treturn objat(line, GLXDirection);\n}\n\nfunction lineXDirectionOfput(line, value) {\n\treturn objatput(line, GLXDirection, value);\n}\n\nfunction lineXIncrementOf(line) {\n\treturn objat(line, GLXIncrement);\n}\n\nfunction lineXIncrementOfput(line, value) {\n\treturn objatput(line, GLXIncrement, value);\n}\n\nfunction lineYDirectionOfput(line, value) {\n\treturn objatput(line, GLYDirection, value);\n}\n\n\n/*\tLoad and subdivide the bezier curve from point1/point2/point3.\n\tIf wideFlag is set then make sure the curve is monoton in X. */\n\nfunction loadAndSubdivideBezierFromviatoisWide(point1, point2, point3, wideFlag) {\n\tvar bz1;\n\tvar bz2;\n\tvar index;\n\tvar index1;\n\tvar index2;\n\n\tbz1 = allocateBezierStackEntry();\n\tif (engineStopped) {\n\t\treturn 0;\n\t}\n\tbzStartXput(bz1, point1[0]);\n\tbzStartYput(bz1, point1[1]);\n\tbzViaXput(bz1, point2[0]);\n\tbzViaYput(bz1, point2[1]);\n\tbzEndXput(bz1, point3[0]);\n\tbzEndYput(bz1, point3[1]);\n\tindex2 = (bz2 = subdivideToBeMonotoninX(bz1, wideFlag));\n\tfor (index = bz1; index <= bz2; index += 6) {\n\t\tindex1 = subdivideBezierFrom(index);\n\t\tif (index1 > index2) {\n\t\t\tindex2 = index1;\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn 0;\n\t\t}\n\t}\n\treturn DIV(index2, 6);\n}\n\nfunction loadArrayPolygonnPointsfilllineWidthlineFill(points, nPoints, fillIndex, lineWidth, lineFill) {\n\tvar i;\n\tvar x0;\n\tvar x1;\n\tvar y0;\n\tvar y1;\n\n\tloadPointfrom(point1Get(), interpreterProxy.fetchPointerofObject(0, points));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tx0 = point1Get()[0];\n\ty0 = point1Get()[1];\n\tfor (i = 1; i <= (nPoints - 1); i++) {\n\t\tloadPointfrom(point1Get(), interpreterProxy.fetchPointerofObject(i, points));\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tx1 = point1Get()[0];\n\t\ty1 = point1Get()[1];\n\t\tpoint1Get()[0] = x0;\n\t\tpoint1Get()[1] = y0;\n\t\tpoint2Get()[0] = x1;\n\t\tpoint2Get()[1] = y1;\n\t\ttransformPoints(2);\n\t\tloadWideLinefromtolineFillleftFillrightFill(lineWidth, point1Get(), point2Get(), lineFill, fillIndex, 0);\n\t\tif (engineStopped) {\n\t\t\treturn null;\n\t\t}\n\t\tx0 = x1;\n\t\ty0 = y1;\n\t}\n}\n\nfunction loadArrayShapenSegmentsfilllineWidthlineFill(points, nSegments, fillIndex, lineWidth, lineFill) {\n\tvar i;\n\tvar pointOop;\n\tvar segs;\n\tvar x0;\n\tvar x1;\n\tvar x2;\n\tvar y0;\n\tvar y1;\n\tvar y2;\n\n\tfor (i = 0; i <= (nSegments - 1); i++) {\n\t\tpointOop = interpreterProxy.fetchPointerofObject(i * 3, points);\n\t\tloadPointfrom(point1Get(), pointOop);\n\t\tpointOop = interpreterProxy.fetchPointerofObject((i * 3) + 1, points);\n\t\tloadPointfrom(point2Get(), pointOop);\n\t\tpointOop = interpreterProxy.fetchPointerofObject((i * 3) + 2, points);\n\t\tloadPointfrom(point3Get(), pointOop);\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\ttransformPoints(3);\n\t\tx0 = point1Get()[0];\n\t\ty0 = point1Get()[1];\n\t\tx1 = point2Get()[0];\n\t\ty1 = point2Get()[1];\n\t\tx2 = point3Get()[0];\n\n\t\t/* Check if we can use a line */\n\n\t\ty2 = point3Get()[1];\n\t\tif (((x0 === y0) && (x1 === y1)) || ((x1 === x2) && (y1 === y2))) {\n\t\t\tloadWideLinefromtolineFillleftFillrightFill(lineWidth, point1Get(), point3Get(), lineFill, fillIndex, 0);\n\t\t} else {\n\n\t\t\t/* Need bezier */\n\n\t\t\tsegs = loadAndSubdivideBezierFromviatoisWide(point1Get(), point2Get(), point3Get(), (lineWidth !== 0) && (lineFill !== 0));\n\t\t\tif (engineStopped) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tloadWideBezierlineFillleftFillrightFilln(lineWidth, lineFill, fillIndex, 0, segs);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n\n/*\tLoad a transformation from the given array. */\n\nfunction loadArrayTransformFromintolength(transformOop, destPtr, n) {\n\tvar i;\n\tvar value;\n\n\tfor (i = 0; i <= (n - 1); i++) {\n\t\tvalue = interpreterProxy.fetchPointerofObject(i, transformOop);\n\t\tif (!(typeof value === \"number\" || (value.isFloat))) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\tif (typeof value === \"number\") {\n\t\t\tdestPtr[i] = value;\n\t\t} else {\n\t\t\tdestPtr[i] = interpreterProxy.floatValueOf(value);\n\t\t}\n\t}\n}\n\n\n/*\tInitialize the bezier segment stored on the stack */\n\nfunction loadBeziersegmentleftFillrightFilloffset(bezier, index, leftFillIndex, rightFillIndex, yOffset) {\n\tif (bzEndY(index) >= bzStartY(index)) {\n\n\t\t/* Top to bottom */\n\n\t\tedgeXValueOfput(bezier, bzStartX(index));\n\t\tedgeYValueOfput(bezier, bzStartY(index) - yOffset);\n\t\tbezierViaXOfput(bezier, bzViaX(index));\n\t\tbezierViaYOfput(bezier, bzViaY(index) - yOffset);\n\t\tbezierEndXOfput(bezier, bzEndX(index));\n\t\tbezierEndYOfput(bezier, bzEndY(index) - yOffset);\n\t} else {\n\t\tedgeXValueOfput(bezier, bzEndX(index));\n\t\tedgeYValueOfput(bezier, bzEndY(index) - yOffset);\n\t\tbezierViaXOfput(bezier, bzViaX(index));\n\t\tbezierViaYOfput(bezier, bzViaY(index) - yOffset);\n\t\tbezierEndXOfput(bezier, bzStartX(index));\n\t\tbezierEndYOfput(bezier, bzStartY(index) - yOffset);\n\t}\n\tedgeZValueOfput(bezier, currentZGet());\n\tedgeLeftFillOfput(bezier, leftFillIndex);\n\tedgeRightFillOfput(bezier, rightFillIndex);\n}\n\nfunction loadBitBltFrom(bbObj) {\n\tif (!loadBBFn) {\n\n\t\t/* We need copyBits here so try to load it implicitly */\n\n\t\tif (!initialiseModule()) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn loadBBFn(bbObj);\n}\n\n\n/*\tLoad the bitmap fill. */\n\nfunction loadBitmapFillcolormaptilefromalongnormalxIndex(formOop, cmOop, tileFlag, point1, point2, point3, xIndex) {\n\tvar bmBits;\n\tvar bmBitsSize;\n\tvar bmDepth;\n\tvar bmFill;\n\tvar bmHeight;\n\tvar bmRaster;\n\tvar bmWidth;\n\tvar cmBits;\n\tvar cmSize;\n\tvar ppw;\n\n\tif (cmOop.isNil) {\n\t\tcmSize = 0;\n\t\tcmBits = null;\n\t} else {\n\t\tif (CLASSOF(cmOop) !== interpreterProxy.classBitmap()) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\tcmSize = SIZEOF(cmOop);\n\t\tcmBits = cmOop.wordsAsInt32Array();\n\t}\n\tif (typeof formOop === \"number\") {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!interpreterProxy.isPointers(formOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (SIZEOF(formOop) < 5) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tbmBits = interpreterProxy.fetchPointerofObject(0, formOop);\n\tif (CLASSOF(bmBits) !== interpreterProxy.classBitmap()) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tbmBitsSize = SIZEOF(bmBits);\n\tbmWidth = interpreterProxy.fetchIntegerofObject(1, formOop);\n\tbmHeight = interpreterProxy.fetchIntegerofObject(2, formOop);\n\tbmDepth = interpreterProxy.fetchIntegerofObject(3, formOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!((bmWidth >= 0) && (bmHeight >= 0))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!((((((bmDepth === 32) || (bmDepth === 8)) || (bmDepth === 16)) || (bmDepth === 1)) || (bmDepth === 2)) || (bmDepth === 4))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!((cmSize === 0) || (cmSize === (SHL(1, bmDepth))))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tppw = DIV(32, bmDepth);\n\tbmRaster = DIV((bmWidth + (ppw - 1)), ppw);\n\tif (bmBitsSize !== (bmRaster * bmHeight)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tbmFill = allocateBitmapFillcolormap(cmSize, cmBits);\n\tif (engineStopped) {\n\t\treturn null;\n\t}\n\tbitmapWidthOfput(bmFill, bmWidth);\n\tbitmapHeightOfput(bmFill, bmHeight);\n\tbitmapDepthOfput(bmFill, bmDepth);\n\tbitmapRasterOfput(bmFill, bmRaster);\n\tbitmapSizeOfput(bmFill, bmBitsSize);\n\tbitmapTileFlagOfput(bmFill, tileFlag);\n\tobjectIndexOfput(bmFill, xIndex);\n\tloadFillOrientationfromalongnormalwidthheight(bmFill, point1, point2, point3, bmWidth, bmHeight);\n\treturn bmFill;\n}\n\n\n/*\tNote: Assumes that the contents of formArray has been checked before */\n\nfunction loadBitsFrom(bmFill) {\n\tvar bitsLen;\n\tvar bitsOop;\n\tvar formOop;\n\tvar xIndex;\n\n\txIndex = objectIndexOf(bmFill);\n\tif (xIndex > SIZEOF(formArray)) {\n\t\treturn null;\n\t}\n\tformOop = interpreterProxy.fetchPointerofObject(xIndex, formArray);\n\tbitsOop = interpreterProxy.fetchPointerofObject(0, formOop);\n\tbitsLen = SIZEOF(bitsOop);\n\tif (bitsLen !== bitmapSizeOf(bmFill)) {\n\t\treturn null;\n\t}\n\treturn bitsOop.wordsAsInt32Array();\n}\n\n\n/*\tLoad a 2x3 transformation matrix from the given oop.\n\tReturn true if the matrix is not nil, false otherwise */\n\nfunction loadColorTransformFrom(transformOop) {\n\tvar okay;\n\tvar transform;\n\n\ttransform = colorTransform();\n\thasColorTransformPut(0);\n\tokay = loadTransformFromintolength(transformOop, transform, 8);\n\tif (!okay) {\n\t\treturn false;\n\t}\n\thasColorTransformPut(1);\n\ttransform[1] = (transform[1] * 256.0);\n\ttransform[3] = (transform[3] * 256.0);\n\ttransform[5] = (transform[5] * 256.0);\n\ttransform[7] = (transform[7] * 256.0);\n\treturn okay;\n}\n\n\n/*\tLoad the compressed segment identified by segment index */\n\nfunction loadCompressedSegmentfromshortleftFillrightFilllineWidthlineColor(segmentIndex, points, pointsShort, leftFill, rightFill, lineWidth, lineFill) {\n\tvar index;\n\tvar segs;\n\tvar x0;\n\tvar x1;\n\tvar x2;\n\tvar y0;\n\tvar y1;\n\tvar y2;\n\n\n\t/* Check if have anything to do at all */\n\n\tif ((leftFill === rightFill) && ((lineWidth === 0) || (lineFill === 0))) {\n\t\treturn null;\n\t}\n\n\t/* 3 points with x/y each */\n\n\tindex = segmentIndex * 6;\n\tif (pointsShort) {\n\n\t\t/* Load short points */\n\n\t\tx0 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[index + 0];\n\t\ty0 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[index + 1];\n\t\tx1 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[index + 2];\n\t\ty1 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[index + 3];\n\t\tx2 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[index + 4];\n\t\ty2 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[index + 5];\n\t} else {\n\t\tx0 = (points[(index + 0)]|0);\n\t\ty0 = (points[(index + 1)]|0);\n\t\tx1 = (points[(index + 2)]|0);\n\t\ty1 = (points[(index + 3)]|0);\n\t\tx2 = (points[(index + 4)]|0);\n\t\ty2 = (points[(index + 5)]|0);\n\t}\n\tif (((x0 === x1) && (y0 === y1)) || ((x1 === x2) && (y1 === y2))) {\n\n\t\t/* We can use a line from x0/y0 to x2/y2 */\n\n\t\tif ((x0 === x2) && (y0 === y2)) {\n\t\t\treturn null;\n\t\t}\n\t\tpoint1Get()[0] = x0;\n\t\tpoint1Get()[1] = y0;\n\t\tpoint2Get()[0] = x2;\n\t\tpoint2Get()[1] = y2;\n\t\ttransformPoints(2);\n\t\treturn loadWideLinefromtolineFillleftFillrightFill(lineWidth, point1Get(), point2Get(), lineFill, leftFill, rightFill);\n\t}\n\tpoint1Get()[0] = x0;\n\tpoint1Get()[1] = y0;\n\tpoint2Get()[0] = x1;\n\tpoint2Get()[1] = y1;\n\tpoint3Get()[0] = x2;\n\tpoint3Get()[1] = y2;\n\ttransformPoints(3);\n\tsegs = loadAndSubdivideBezierFromviatoisWide(point1Get(), point2Get(), point3Get(), (lineWidth !== 0) && (lineFill !== 0));\n\tif (engineStopped) {\n\t\treturn null;\n\t}\n\tloadWideBezierlineFillleftFillrightFilln(lineWidth, lineFill, leftFill, rightFill, segs);\n}\n\n\n/*\tLoad a compressed shape into the engine.\n\t\tWARNING: THIS METHOD NEEDS THE FULL FRAME SIZE!!!!\n\t */\n\nfunction loadCompressedShapesegmentsleftFillsrightFillslineWidthslineFillsfillIndexListpointShort(points, nSegments, leftFills, rightFills, lineWidths, lineFills, fillIndexList, pointsShort) {\n\tvar i;\n\tvar leftLength;\n\tvar leftRun;\n\tvar leftValue;\n\tvar lineFillLength;\n\tvar lineFillRun;\n\tvar lineFillValue;\n\tvar rightLength;\n\tvar rightRun;\n\tvar rightValue;\n\tvar widthLength;\n\tvar widthRun;\n\tvar widthValue;\n\n\tif (nSegments === 0) {\n\t\treturn 0;\n\t}\n\tleftRun = (rightRun = (widthRun = (lineFillRun = -1)));\n\tleftLength = (rightLength = (widthLength = (lineFillLength = 1)));\n\tleftValue = (rightValue = (widthValue = (lineFillValue = 0)));\n\tfor (i = 1; i <= nSegments; i++) {\n\n\t\t/* Decrement current run length and load new stuff */\n\n\t\tif (((--leftLength)) <= 0) {\n\t\t\t++leftRun;\n\t\t\tleftLength = shortRunLengthAtfrom(leftRun, leftFills);\n\t\t\tleftValue = shortRunValueAtfrom(leftRun, leftFills);\n\t\t\tif (leftValue !== 0) {\n\t\t\t\tleftValue = fillIndexList[leftValue - 1];\n\t\t\t\tleftValue = transformColor(leftValue);\n\t\t\t\tif (engineStopped) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (((--rightLength)) <= 0) {\n\t\t\t++rightRun;\n\t\t\trightLength = shortRunLengthAtfrom(rightRun, rightFills);\n\t\t\trightValue = shortRunValueAtfrom(rightRun, rightFills);\n\t\t\tif (rightValue !== 0) {\n\t\t\t\trightValue = fillIndexList[rightValue - 1];\n\t\t\t\trightValue = transformColor(rightValue);\n\t\t\t}\n\t\t}\n\t\tif (((--widthLength)) <= 0) {\n\t\t\t++widthRun;\n\t\t\twidthLength = shortRunLengthAtfrom(widthRun, lineWidths);\n\t\t\twidthValue = shortRunValueAtfrom(widthRun, lineWidths);\n\t\t\tif (widthValue !== 0) {\n\t\t\t\twidthValue = transformWidth(widthValue);\n\t\t\t}\n\t\t}\n\t\tif (((--lineFillLength)) <= 0) {\n\t\t\t++lineFillRun;\n\t\t\tlineFillLength = shortRunLengthAtfrom(lineFillRun, lineFills);\n\t\t\tlineFillValue = shortRunValueAtfrom(lineFillRun, lineFills);\n\t\t\tif (lineFillValue !== 0) {\n\t\t\t\tlineFillValue = fillIndexList[lineFillValue - 1];\n\t\t\t}\n\t\t}\n\t\tloadCompressedSegmentfromshortleftFillrightFilllineWidthlineColor(i - 1, points, pointsShort, leftValue, rightValue, widthValue, lineFillValue);\n\t\tif (engineStopped) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\nfunction loadEdgeStateFrom(edgeOop) {\n\tvar edge;\n\n\tedge = lastExportedEdgeGet();\n\tif (SIZEOF(edgeOop) < ETBalloonEdgeDataSize) {\n\t\treturn null;\n\t}\n\tedgeXValueOfput(edge, interpreterProxy.fetchIntegerofObject(ETXValueIndex, edgeOop));\n\tedgeYValueOfput(edge, interpreterProxy.fetchIntegerofObject(ETYValueIndex, edgeOop));\n\tedgeZValueOfput(edge, interpreterProxy.fetchIntegerofObject(ETZValueIndex, edgeOop));\n\tedgeNumLinesOfput(edge, interpreterProxy.fetchIntegerofObject(ETLinesIndex, edgeOop));\n\treturn edge;\n}\n\n\n/*\tLoad a 2x3 transformation matrix from the given oop.\n\tReturn true if the matrix is not nil, false otherwise */\n\nfunction loadEdgeTransformFrom(transformOop) {\n\tvar okay;\n\tvar transform;\n\n\thasEdgeTransformPut(0);\n\ttransform = edgeTransform();\n\tokay = loadTransformFromintolength(transformOop, transform, 6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!okay) {\n\t\treturn false;\n\t}\n\thasEdgeTransformPut(1);\n\ttransform[2] = (transform[2] + destOffsetXGet());\n\ttransform[5] = (transform[5] + destOffsetYGet());\n\treturn true;\n}\n\n\n/*\tTransform the points */\n\nfunction loadFillOrientationfromalongnormalwidthheight(fill, point1, point2, point3, fillWidth, fillHeight) {\n\tvar dirX;\n\tvar dirY;\n\tvar dsLength2;\n\tvar dsX;\n\tvar dsY;\n\tvar dtLength2;\n\tvar dtX;\n\tvar dtY;\n\tvar nrmX;\n\tvar nrmY;\n\n\tpoint2[0] = (point2[0] + point1[0]);\n\tpoint2[1] = (point2[1] + point1[1]);\n\tpoint3[0] = (point3[0] + point1[0]);\n\tpoint3[1] = (point3[1] + point1[1]);\n\ttransformPoint(point1);\n\ttransformPoint(point2);\n\ttransformPoint(point3);\n\tdirX = point2[0] - point1[0];\n\tdirY = point2[1] - point1[1];\n\tnrmX = point3[0] - point1[0];\n\n\t/* Compute the scale from direction/normal into ramp size */\n\n\tnrmY = point3[1] - point1[1];\n\tdsLength2 = (dirX * dirX) + (dirY * dirY);\n\tif (dsLength2 > 0) {\n\t\tdsX = ((((dirX * fillWidth) * 65536.0) / dsLength2)|0);\n\t\tdsY = ((((dirY * fillWidth) * 65536.0) / dsLength2)|0);\n\t} else {\n\t\tdsX = 0;\n\t\tdsY = 0;\n\t}\n\tdtLength2 = (nrmX * nrmX) + (nrmY * nrmY);\n\tif (dtLength2 > 0) {\n\t\tdtX = ((((nrmX * fillHeight) * 65536.0) / dtLength2)|0);\n\t\tdtY = ((((nrmY * fillHeight) * 65536.0) / dtLength2)|0);\n\t} else {\n\t\tdtX = 0;\n\t\tdtY = 0;\n\t}\n\tfillOriginXOfput(fill, point1[0]);\n\tfillOriginYOfput(fill, point1[1]);\n\tfillDirectionXOfput(fill, dsX);\n\tfillDirectionYOfput(fill, dsY);\n\tfillNormalXOfput(fill, dtX);\n\tfillNormalYOfput(fill, dtY);\n}\n\n\n/*\tCheck all the forms from arrayOop. */\n\nfunction loadFormsFrom(arrayOop) {\n\tvar bmBits;\n\tvar bmBitsSize;\n\tvar bmDepth;\n\tvar bmHeight;\n\tvar bmRaster;\n\tvar bmWidth;\n\tvar formOop;\n\tvar i;\n\tvar ppw;\n\n\tif (!interpreterProxy.isArray(arrayOop)) {\n\t\treturn false;\n\t}\n\tformArray = arrayOop;\n\tfor (i = 0; i <= (SIZEOF(formArray) - 1); i++) {\n\t\tformOop = interpreterProxy.fetchPointerofObject(i, formArray);\n\t\tif (typeof formOop === \"number\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (!interpreterProxy.isPointers(formOop)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (SIZEOF(formOop) < 5) {\n\t\t\treturn false;\n\t\t}\n\t\tbmBits = interpreterProxy.fetchPointerofObject(0, formOop);\n\t\tif (CLASSOF(bmBits) !== interpreterProxy.classBitmap()) {\n\t\t\treturn false;\n\t\t}\n\t\tbmBitsSize = SIZEOF(bmBits);\n\t\tbmWidth = interpreterProxy.fetchIntegerofObject(1, formOop);\n\t\tbmHeight = interpreterProxy.fetchIntegerofObject(2, formOop);\n\t\tbmDepth = interpreterProxy.fetchIntegerofObject(3, formOop);\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!((bmWidth >= 0) && (bmHeight >= 0))) {\n\t\t\treturn false;\n\t\t}\n\t\tppw = DIV(32, bmDepth);\n\t\tbmRaster = DIV((bmWidth + (ppw - 1)), ppw);\n\t\tif (bmBitsSize !== (bmRaster * bmHeight)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n\n/*\tLoad the gradient fill as defined by the color ramp. */\n\nfunction loadGradientFillfromalongnormalisRadial(rampOop, point1, point2, point3, isRadial) {\n\tvar fill;\n\tvar rampWidth;\n\n\tif (CLASSOF(rampOop) !== interpreterProxy.classBitmap()) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\trampWidth = SIZEOF(rampOop);\n\tfill = allocateGradientFillrampWidthisRadial(rampOop.wordsAsInt32Array(), rampWidth, isRadial);\n\tif (engineStopped) {\n\t\treturn null;\n\t}\n\tloadFillOrientationfromalongnormalwidthheight(fill, point1, point2, point3, rampWidth, rampWidth);\n\treturn fill;\n}\n\n\n/*\tLoad the line defined by point1 and point2. */\n\nfunction loadLinefromtooffsetleftFillrightFill(line, point1, point2, yOffset, leftFill, rightFill) {\n\tvar p1;\n\tvar p2;\n\tvar yDir;\n\n\tif (point1[1] <= point2[1]) {\n\t\tp1 = point1;\n\t\tp2 = point2;\n\t\tyDir = 1;\n\t} else {\n\t\tp1 = point2;\n\t\tp2 = point1;\n\t\tyDir = -1;\n\t}\n\tedgeXValueOfput(line, p1[0]);\n\tedgeYValueOfput(line, p1[1] - yOffset);\n\tedgeZValueOfput(line, currentZGet());\n\tedgeLeftFillOfput(line, leftFill);\n\tedgeRightFillOfput(line, rightFill);\n\tlineEndXOfput(line, p2[0]);\n\tlineEndYOfput(line, p2[1] - yOffset);\n\tlineYDirectionOfput(line, yDir);\n}\n\n\n/*\tLoad a rectangular oval currently defined by point1/point2 */\n\nfunction loadOvallineFillleftFillrightFill(lineWidth, lineFill, leftFill, rightFill) {\n\tvar cx;\n\tvar cy;\n\tvar h;\n\tvar i;\n\tvar nSegments;\n\tvar w;\n\n\tw = (point2Get()[0] - point1Get()[0]) >> 1;\n\th = (point2Get()[1] - point1Get()[1]) >> 1;\n\tcx = (point2Get()[0] + point1Get()[0]) >> 1;\n\tcy = (point2Get()[1] + point1Get()[1]) >> 1;\n\tfor (i = 0; i <= 15; i++) {\n\t\tloadOvalSegmentwhcxcy(i, w, h, cx, cy);\n\t\ttransformPoints(3);\n\t\tnSegments = loadAndSubdivideBezierFromviatoisWide(point1Get(), point2Get(), point3Get(), (lineWidth !== 0) && (lineFill !== 0));\n\t\tif (engineStopped) {\n\t\t\treturn null;\n\t\t}\n\t\tloadWideBezierlineFillleftFillrightFilln(lineWidth, lineFill, leftFill, rightFill, nSegments);\n\t\tif (engineStopped) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\nfunction loadOvalSegmentwhcxcy(seg, w, h, cx, cy) {\n\tvar x0;\n\tvar x1;\n\tvar x2;\n\tvar y0;\n\tvar y1;\n\tvar y2;\n\n\n\t/* Load start point of segment */\n\n\tx0 = (((circleCosTable()[(seg * 2) + 0] * w) + cx)|0);\n\ty0 = (((circleSinTable()[(seg * 2) + 0] * h) + cy)|0);\n\tpoint1Get()[0] = x0;\n\tpoint1Get()[1] = y0;\n\tx2 = (((circleCosTable()[(seg * 2) + 2] * w) + cx)|0);\n\ty2 = (((circleSinTable()[(seg * 2) + 2] * h) + cy)|0);\n\tpoint3Get()[0] = x2;\n\tpoint3Get()[1] = y2;\n\tx1 = (((circleCosTable()[(seg * 2) + 1] * w) + cx)|0);\n\n\t/* NOTE: The intermediate point is the point ON the curve\n\tand not yet the control point (which is OFF the curve) */\n\n\ty1 = (((circleSinTable()[(seg * 2) + 1] * h) + cy)|0);\n\tx1 = (x1 * 2) - ((x0 + x2) >> 1);\n\ty1 = (y1 * 2) - ((y0 + y2) >> 1);\n\tpoint2Get()[0] = x1;\n\tpoint2Get()[1] = y1;\n}\n\n\n/*\tLoad the contents of pointOop into pointArray */\n\nfunction loadPointfrom(pointArray, pointOop) {\n\tvar value;\n\n\tif (CLASSOF(pointOop) !== interpreterProxy.classPoint()) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tvalue = interpreterProxy.fetchPointerofObject(0, pointOop);\n\tif (!(typeof value === \"number\" || (value.isFloat))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (typeof value === \"number\") {\n\t\tpointArray[0] = value;\n\t} else {\n\t\tpointArray[0] = (interpreterProxy.floatValueOf(value)|0);\n\t}\n\tvalue = interpreterProxy.fetchPointerofObject(1, pointOop);\n\tif (!(typeof value === \"number\" || (value.isFloat))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (typeof value === \"number\") {\n\t\tpointArray[1] = value;\n\t} else {\n\t\tpointArray[1] = (interpreterProxy.floatValueOf(value)|0);\n\t}\n}\n\nfunction loadPolygonnPointsfilllineWidthlineFillpointsShort(points, nPoints, fillIndex, lineWidth, lineFill, isShort) {\n\tvar i;\n\tvar x0;\n\tvar x1;\n\tvar y0;\n\tvar y1;\n\n\tif (isShort) {\n\t\tx0 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[0];\n\t\ty0 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[1];\n\t} else {\n\t\tx0 = (points[0]|0);\n\t\ty0 = (points[1]|0);\n\t}\n\tfor (i = 1; i <= (nPoints - 1); i++) {\n\t\tif (isShort) {\n\t\t\tx1 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[i * 2];\n\t\t\ty1 = (points.int16Array || (points.int16Array = new Int16Array(points.buffer, points.byteOffset)))[(i * 2) + 1];\n\t\t} else {\n\t\t\tx1 = (points[(i * 2)]|0);\n\t\t\ty1 = (points[((i * 2) + 1)]|0);\n\t\t}\n\t\tpoint1Get()[0] = x0;\n\t\tpoint1Get()[1] = y0;\n\t\tpoint2Get()[0] = x1;\n\t\tpoint2Get()[1] = y1;\n\t\ttransformPoints(2);\n\t\tloadWideLinefromtolineFillleftFillrightFill(lineWidth, point1Get(), point2Get(), lineFill, fillIndex, 0);\n\t\tif (engineStopped) {\n\t\t\treturn null;\n\t\t}\n\t\tx0 = x1;\n\t\ty0 = y1;\n\t}\n}\n\n\n/*\tLoad a rectangle currently defined by point1-point4 */\n\nfunction loadRectanglelineFillleftFillrightFill(lineWidth, lineFill, leftFill, rightFill) {\n\tloadWideLinefromtolineFillleftFillrightFill(lineWidth, point1Get(), point2Get(), lineFill, leftFill, rightFill);\n\tloadWideLinefromtolineFillleftFillrightFill(lineWidth, point2Get(), point3Get(), lineFill, leftFill, rightFill);\n\tloadWideLinefromtolineFillleftFillrightFill(lineWidth, point3Get(), point4Get(), lineFill, leftFill, rightFill);\n\tloadWideLinefromtolineFillleftFillrightFill(lineWidth, point4Get(), point1Get(), lineFill, leftFill, rightFill);\n}\n\n\n/*\tLoad the entire state from the interpreter for the rendering primitives.\n\t Answer 0 on success or a non-zero failure code on failure. */\n\nfunction loadRenderingState() {\n\tvar edgeOop;\n\tvar failCode;\n\tvar fillOop;\n\tvar state;\n\n\tif (interpreterProxy.methodArgumentCount() !== 2) {\n\t\treturn PrimErrBadNumArgs;\n\t}\n\tif (((failCode = quickLoadEngineFrom(interpreterProxy.stackValue(2)))) !== 0) {\n\t\treturn failCode;\n\t}\n\tfillOop = interpreterProxy.stackObjectValue(0);\n\tedgeOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn PrimErrBadArgument;\n\t}\n\tif (((failCode = loadSpanBufferFrom(interpreterProxy.fetchPointerofObject(BESpanIndex, engine)))) !== 0) {\n\t\treturn failCode;\n\t}\n\tif (!loadBitBltFrom(interpreterProxy.fetchPointerofObject(BEBitBltIndex, engine))) {\n\t\treturn GEFBitBltLoadFailed;\n\t}\n\tif (!loadFormsFrom(interpreterProxy.fetchPointerofObject(BEFormsIndex, engine))) {\n\t\treturn GEFFormLoadFailed;\n\t}\n\tif (SIZEOF(edgeOop) < ETBalloonEdgeDataSize) {\n\t\treturn GEFEdgeDataTooSmall;\n\t}\n\tif (SIZEOF(fillOop) < FTBalloonFillDataSize) {\n\t\treturn GEFFillDataTooSmall;\n\t}\n\tstate = stateGet();\n\tif ((state === GEStateWaitingForEdge) || ((state === GEStateWaitingForFill) || (state === GEStateWaitingChange))) {\n\t\treturn GEFWrongState;\n\t}\n\treturn 0;\n}\n\nfunction loadShapenSegmentsfilllineWidthlineFillpointsShort(points, nSegments, fillIndex, lineWidth, lineFill, pointsShort) {\n\tvar i;\n\n\tfor (i = 1; i <= nSegments; i++) {\n\t\tloadCompressedSegmentfromshortleftFillrightFilllineWidthlineColor(i - 1, points, pointsShort, fillIndex, 0, lineWidth, lineFill);\n\t\tif (engineStopped) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n\n/*\tLoad the span buffer from the given oop.\n\t Answer 0 on success or a non-zero failure code on failure. */\n\nfunction loadSpanBufferFrom(spanOop) {\n\tif (CLASSOF(spanOop) !== interpreterProxy.classBitmap()) {\n\t\treturn GEFClassMismatch;\n\t}\n\n\t/* Leave last entry unused to avoid complications */\n\n\tspanBuffer = spanOop.words;\n\tspanSizePut(SIZEOF(spanOop) - 1);\n\treturn 0;\n}\n\n\n/*\tLoad a transformation from transformOop into the float array\n\tdefined by destPtr. The transformation is assumed to be either\n\tan array or a FloatArray of length n. */\n\nfunction loadTransformFromintolength(transformOop, destPtr, n) {\n\tif (transformOop.isNil) {\n\t\treturn false;\n\t}\n\tif (typeof transformOop === \"number\") {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (SIZEOF(transformOop) !== n) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (interpreterProxy.isWords(transformOop)) {\n\t\tloadWordTransformFromintolength(transformOop, destPtr, n);\n\t} else {\n\t\tloadArrayTransformFromintolength(transformOop, destPtr, n);\n\t}\n\treturn true;\n}\n\n\n/*\tLoad the (possibly wide) bezier from the segments currently on the bezier stack. */\n\nfunction loadWideBezierlineFillleftFillrightFilln(lineWidth, lineFill, leftFill, rightFill, nSegments) {\n\tvar bezier;\n\tvar index;\n\tvar offset;\n\tvar wide;\n\n\tif ((lineWidth === 0) || (lineFill === 0)) {\n\t\twide = false;\n\t\toffset = 0;\n\t} else {\n\t\twide = true;\n\t\toffset = offsetFromWidth(lineWidth);\n\t}\n\tindex = nSegments * 6;\n\twhile (index > 0) {\n\t\tif (wide) {\n\t\t\tbezier = allocateWideBezier();\n\t\t} else {\n\t\t\tbezier = allocateBezier();\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn 0;\n\t\t}\n\t\tloadBeziersegmentleftFillrightFilloffset(bezier, index, leftFill, rightFill, offset);\n\t\tif (wide) {\n\t\t\twideBezierFillOfput(bezier, lineFill);\n\t\t\twideBezierWidthOfput(bezier, lineWidth);\n\t\t\twideBezierExtentOfput(bezier, lineWidth);\n\t\t}\n\t\tindex -= 6;\n\t}\n\twbStackClear();\n}\n\n\n/*\tLoad a (possibly wide) line defined by the points p1 and p2 */\n\nfunction loadWideLinefromtolineFillleftFillrightFill(lineWidth, p1, p2, lineFill, leftFill, rightFill) {\n\tvar line;\n\tvar offset;\n\n\tif ((lineWidth === 0) || (lineFill === 0)) {\n\t\tline = allocateLine();\n\t\toffset = 0;\n\t} else {\n\t\tline = allocateWideLine();\n\t\toffset = offsetFromWidth(lineWidth);\n\t}\n\tif (engineStopped) {\n\t\treturn 0;\n\t}\n\tloadLinefromtooffsetleftFillrightFill(line, p1, p2, offset, leftFill, rightFill);\n\tif (isWide(line)) {\n\t\twideLineFillOfput(line, lineFill);\n\t\twideLineWidthOfput(line, lineWidth);\n\t\twideLineExtentOfput(line, lineWidth);\n\t}\n}\n\n\n/*\tLoad a float array transformation from the given oop */\n\nfunction loadWordTransformFromintolength(transformOop, destPtr, n) {\n\tvar i;\n\tvar srcPtr;\n\n\tsrcPtr = transformOop.wordsAsFloat32Array();\n\tfor (i = 0; i <= (n - 1); i++) {\n\t\tdestPtr[i] = srcPtr[i];\n\t}\n}\n\n\n/*\tLoad the working buffer from the given oop */\n\nfunction loadWorkBufferFrom(wbOop) {\n\tif (typeof wbOop === \"number\") {\n\t\treturn GEFWorkBufferIsInteger;\n\t}\n\tif (!interpreterProxy.isWords(wbOop)) {\n\t\treturn GEFWorkBufferIsPointers;\n\t}\n\tif (SIZEOF(wbOop) < GWMinimalSize) {\n\t\treturn GEFWorkBufferTooSmall;\n\t}\n\tworkBufferPut(wbOop);\n\tif (magicNumberGet() !== GWMagicNumber) {\n\t\treturn GEFWorkBufferBadMagic;\n\t}\n\tif (wbSizeGet() !== SIZEOF(wbOop)) {\n\t\treturn GEFWorkBufferWrongSize;\n\t}\n\tif (objStartGet() !== GWHeaderSize) {\n\t\treturn GEFWorkBufferStartWrong;\n\t}\n\tobjBuffer = PTR_ADD(workBuffer, objStartGet());\n\tgetBuffer = PTR_ADD(objBuffer, objUsedGet());\n\n\t/* Make sure we don't exceed the work buffer */\n\n\taetBuffer = PTR_ADD(getBuffer, getUsedGet());\n\tif ((((GWHeaderSize + objUsedGet()) + getUsedGet()) + aetUsedGet()) > wbSizeGet()) {\n\t\treturn GEFWorkTooBig;\n\t}\n\treturn 0;\n}\n\nfunction magicNumberGet() {\n\treturn workBuffer[GWMagicIndex];\n}\n\nfunction magicNumberPut(value) {\n\treturn workBuffer[GWMagicIndex] = value;\n}\n\n\n/*\tThe module with the given name was just unloaded.\n\tMake sure we have no dangling references. */\n\nfunction moduleUnloaded(aModuleName) {\n\tif (strcmp(aModuleName, bbPluginName) === 0) {\n\n\t\t/* BitBlt just shut down. How nasty. */\n\n\t\tloadBBFn = 0;\n\t\tcopyBitsFn = 0;\n\t}\n}\n\n\n/*\tThe entry at index is not in the right position of the AET. \n\tMove it to the left until the position is okay. */\n\nfunction moveAETEntryFromedgex(index, edge, xValue) {\n\tvar newIndex;\n\n\tnewIndex = index;\n\twhile ((newIndex > 0) && (edgeXValueOf(aetBuffer[newIndex - 1]) > xValue)) {\n\t\taetBuffer[newIndex] = aetBuffer[newIndex - 1];\n\t\t--newIndex;\n\t}\n\taetBuffer[newIndex] = edge;\n}\n\n\n/*\tCheck if we have n slots available */\n\nfunction needAvailableSpace(nSlots) {\n\tif (((((GWHeaderSize + objUsed) + getUsedGet()) + aetUsedGet()) + nSlots) > wbTopGet()) {\n\t\tstopBecauseOf(GErrorNoMoreSpace);\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction needsFlush() {\n\treturn needsFlushGet() !== 0;\n}\n\nfunction needsFlushGet() {\n\treturn workBuffer[GWNeedsFlush];\n}\n\nfunction needsFlushPut(value) {\n\treturn workBuffer[GWNeedsFlush] = value;\n}\n\nfunction objat(object, index) {\n\treturn objBuffer[object + index];\n}\n\nfunction objatput(object, index, value) {\n\treturn objBuffer[object + index] = value;\n}\n\nfunction objStartGet() {\n\treturn workBuffer[GWObjStart];\n}\n\nfunction objStartPut(value) {\n\treturn workBuffer[GWObjStart] = value;\n}\n\nfunction objUsedGet() {\n\treturn workBuffer[GWObjUsed];\n}\n\nfunction objUsedPut(value) {\n\treturn workBuffer[GWObjUsed] = value;\n}\n\nfunction objectHeaderOf(obj) {\n\treturn objat(obj, GEObjectType);\n}\n\nfunction objectIndexOf(obj) {\n\treturn objat(obj, GEObjectIndex);\n}\n\nfunction objectIndexOfput(obj, value) {\n\treturn objatput(obj, GEObjectIndex, value);\n}\n\nfunction objectLengthOf(obj) {\n\treturn objat(obj, GEObjectLength);\n}\n\nfunction objectLengthOfput(obj, value) {\n\treturn objatput(obj, GEObjectLength, value);\n}\n\nfunction objectTypeOf(obj) {\n\treturn objat(obj, GEObjectType) & GEPrimitiveTypeMask;\n}\n\nfunction objectTypeOfput(obj, value) {\n\treturn objatput(obj, GEObjectType, value);\n}\n\n\n/*\tCommon function so that we don't compute that wrong in any place\n\tand can easily find all the places where we deal with one-pixel offsets. */\n\nfunction offsetFromWidth(lineWidth) {\n\treturn lineWidth >> 1;\n}\n\nfunction point1Get() {\n\treturn PTR_ADD(workBuffer, GWPoint1);\n}\n\nfunction point2Get() {\n\treturn PTR_ADD(workBuffer, GWPoint2);\n}\n\nfunction point3Get() {\n\treturn PTR_ADD(workBuffer, GWPoint3);\n}\n\nfunction point4Get() {\n\treturn PTR_ADD(workBuffer, GWPoint4);\n}\n\n\n/*\tWe have just blitted a scan line to the screen.\n\tDo whatever seems to be a good idea here. */\n/*\tNote: In the future we may check the time needed for this scan line and interrupt processing to give the Smalltalk code a chance to run at a certain time. */\n/*\tCheck if there is any more work to do. */\n\nfunction postDisplayAction() {\n\tif ((getStartGet() >= getUsedGet()) && (aetUsedGet() === 0)) {\n\n\t\t/* No more entries to process */\n\n\t\tstatePut(GEStateCompleted);\n\t}\n\tif (currentYGet() >= fillMaxYGet()) {\n\n\t\t/* Out of clipping range */\n\n\t\tstatePut(GEStateCompleted);\n\t}\n}\n\nfunction primitiveAbortProcessing() {\n\tvar failureCode;\n\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(0)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tstatePut(GEStateCompleted);\n\tstoreEngineStateInto(engine);\n}\n\n\n/*\tNote: No need to load either bitBlt or spanBuffer */\n\nfunction primitiveAddActiveEdgeEntry() {\n\tvar edge;\n\tvar edgeOop;\n\tvar failureCode;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateWaitingForEdge))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tedgeOop = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tedge = loadEdgeStateFrom(edgeOop);\n\tif (!edge) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEdgeDataTooSmall);\n\t}\n\tif (!needAvailableSpace(1)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWorkTooBig);\n\t}\n\tif (edgeNumLinesOf(edge) > 0) {\n\t\tinsertEdgeIntoAET(edge);\n\t}\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tstatePut(GEStateAddingFromGET);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountAddAETEntry, 1);\n\t\tincrementStatby(GWTimeAddAETEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\nfunction primitiveAddBezier() {\n\tvar endOop;\n\tvar failureCode;\n\tvar leftFill;\n\tvar nSegments;\n\tvar rightFill;\n\tvar startOop;\n\tvar viaOop;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 5) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\trightFill = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(0));\n\tleftFill = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(1));\n\tviaOop = interpreterProxy.stackObjectValue(2);\n\tendOop = interpreterProxy.stackObjectValue(3);\n\tstartOop = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(5), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (!(isFillOkay(leftFill) && (isFillOkay(rightFill)))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tif ((leftFill === rightFill) && false) {\n\t\treturn interpreterProxy.pop(6);\n\t}\n\tloadPointfrom(point1Get(), startOop);\n\tloadPointfrom(point2Get(), viaOop);\n\tloadPointfrom(point3Get(), endOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\ttransformPoints(3);\n\tnSegments = loadAndSubdivideBezierFromviatoisWide(point1Get(), point2Get(), point3Get(), false);\n\tneedAvailableSpace(nSegments * GBBaseSize);\n\tif (!engineStopped) {\n\t\tleftFill = transformColor(leftFill);\n\t\trightFill = transformColor(rightFill);\n\t}\n\tif (!engineStopped) {\n\t\tloadWideBezierlineFillleftFillrightFilln(0, 0, leftFill, rightFill, nSegments);\n\t}\n\tif (engineStopped) {\n\n\t\t/* Make sure the stack is okay */\n\n\t\twbStackClear();\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(5);\n}\n\nfunction primitiveAddBezierShape() {\n\tvar failureCode;\n\tvar fillIndex;\n\tvar length;\n\tvar lineFill;\n\tvar lineWidth;\n\tvar nSegments;\n\tvar points;\n\tvar pointsIsArray;\n\tvar segSize;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 5) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tlineFill = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(0));\n\tlineWidth = interpreterProxy.stackIntegerValue(1);\n\tfillIndex = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(2));\n\tnSegments = interpreterProxy.stackIntegerValue(3);\n\tpoints = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(5), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tlength = SIZEOF(points);\n\tif (interpreterProxy.isWords(points)) {\n\n\t\t/* Either PointArray or ShortPointArray */\n\n\t\tpointsIsArray = false;\n\t\tif (!((length === (nSegments * 3)) || (length === (nSegments * 6)))) {\n\t\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t\t}\n\t} else {\n\n\t\t/* Must be Array of points */\n\n\t\tif (!interpreterProxy.isArray(points)) {\n\t\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t\t}\n\t\tif (length !== (nSegments * 3)) {\n\t\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t\t}\n\t\tpointsIsArray = true;\n\t}\n\tif ((lineWidth === 0) || (lineFill === 0)) {\n\t\tsegSize = GLBaseSize;\n\t} else {\n\t\tsegSize = GLWideSize;\n\t}\n\tif (!needAvailableSpace(segSize * nSegments)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWorkTooBig);\n\t}\n\tif (!(isFillOkay(lineFill) && (isFillOkay(fillIndex)))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tlineFill = transformColor(lineFill);\n\tfillIndex = transformColor(fillIndex);\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (((lineFill === 0) || (lineWidth === 0)) && (fillIndex === 0)) {\n\t\treturn interpreterProxy.pop(5);\n\t}\n\tif (lineWidth !== 0) {\n\t\tlineWidth = transformWidth(lineWidth);\n\t\tif (lineWidth < 1) {\n\t\t\tlineWidth = 1;\n\t\t}\n\t}\n\tif (pointsIsArray) {\n\t\tloadArrayShapenSegmentsfilllineWidthlineFill(points, nSegments, fillIndex, lineWidth, lineFill);\n\t} else {\n\t\tloadShapenSegmentsfilllineWidthlineFillpointsShort(points.wordsAsInt32Array(), nSegments, fillIndex, lineWidth, lineFill, (nSegments * 3) === length);\n\t}\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tneedsFlushPut(1);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(5);\n}\n\nfunction primitiveAddBitmapFill() {\n\tvar cmOop;\n\tvar dirOop;\n\tvar failureCode;\n\tvar fill;\n\tvar formOop;\n\tvar nrmOop;\n\tvar originOop;\n\tvar tileFlag;\n\tvar xIndex;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 7) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\txIndex = interpreterProxy.stackIntegerValue(0);\n\tif (xIndex <= 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tnrmOop = interpreterProxy.stackObjectValue(1);\n\tdirOop = interpreterProxy.stackObjectValue(2);\n\toriginOop = interpreterProxy.stackObjectValue(3);\n\ttileFlag = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(4));\n\tcmOop = interpreterProxy.stackObjectValue(5);\n\tformOop = interpreterProxy.stackObjectValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(7), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tloadPointfrom(point1Get(), originOop);\n\tloadPointfrom(point2Get(), dirOop);\n\tloadPointfrom(point3Get(), nrmOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFBadPoint);\n\t}\n\tfill = loadBitmapFillcolormaptilefromalongnormalxIndex(formOop, cmOop, (tileFlag\n\t\t? 1\n\t\t: 0), point1Get(), point2Get(), point3Get(), xIndex - 1);\n\tif (engineStopped) {\n\n\t\t/* Make sure the stack is okay */\n\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.popthenPush(8, interpreterProxy.positive32BitIntegerFor(fill));\n}\n\nfunction primitiveAddCompressedShape() {\n\tvar failureCode;\n\tvar fillIndexList;\n\tvar leftFills;\n\tvar lineFills;\n\tvar lineWidths;\n\tvar nSegments;\n\tvar points;\n\tvar pointsShort;\n\tvar rightFills;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 7) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tfillIndexList = interpreterProxy.stackObjectValue(0);\n\tlineFills = interpreterProxy.stackObjectValue(1);\n\tlineWidths = interpreterProxy.stackObjectValue(2);\n\trightFills = interpreterProxy.stackObjectValue(3);\n\tleftFills = interpreterProxy.stackObjectValue(4);\n\tnSegments = interpreterProxy.stackIntegerValue(5);\n\tpoints = interpreterProxy.stackObjectValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(7), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (!checkCompressedShapesegmentsleftFillsrightFillslineWidthslineFillsfillIndexList(points, nSegments, leftFills, rightFills, lineWidths, lineFills, fillIndexList)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityCheckFailed);\n\t}\n\tif (!needAvailableSpace(Math.max(GBBaseSize, GLBaseSize) * nSegments)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWorkTooBig);\n\t}\n\n\t/* Then actually load the compressed shape */\n\n\tpointsShort = SIZEOF(points) === (nSegments * 3);\n\tloadCompressedShapesegmentsleftFillsrightFillslineWidthslineFillsfillIndexListpointShort(points.wordsAsInt32Array(), nSegments, leftFills.wordsAsInt32Array(), rightFills.wordsAsInt32Array(), lineWidths.wordsAsInt32Array(), lineFills.wordsAsInt32Array(), fillIndexList.wordsAsInt32Array(), pointsShort);\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tneedsFlushPut(1);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(7);\n}\n\nfunction primitiveAddGradientFill() {\n\tvar dirOop;\n\tvar failureCode;\n\tvar fill;\n\tvar isRadial;\n\tvar nrmOop;\n\tvar originOop;\n\tvar rampOop;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 5) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tisRadial = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(0));\n\tnrmOop = interpreterProxy.stackValue(1);\n\tdirOop = interpreterProxy.stackValue(2);\n\toriginOop = interpreterProxy.stackValue(3);\n\trampOop = interpreterProxy.stackValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(5), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tloadPointfrom(point1Get(), originOop);\n\tloadPointfrom(point2Get(), dirOop);\n\tloadPointfrom(point3Get(), nrmOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFBadPoint);\n\t}\n\tfill = loadGradientFillfromalongnormalisRadial(rampOop, point1Get(), point2Get(), point3Get(), isRadial);\n\tif (engineStopped) {\n\n\t\t/* Make sure the stack is okay */\n\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.popthenPush(6, interpreterProxy.positive32BitIntegerFor(fill));\n}\n\nfunction primitiveAddLine() {\n\tvar endOop;\n\tvar failureCode;\n\tvar leftFill;\n\tvar rightFill;\n\tvar startOop;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 4) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\trightFill = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(0));\n\tleftFill = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(1));\n\tendOop = interpreterProxy.stackObjectValue(2);\n\tstartOop = interpreterProxy.stackObjectValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(4), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (!(isFillOkay(leftFill) && (isFillOkay(rightFill)))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tloadPointfrom(point1Get(), startOop);\n\tloadPointfrom(point2Get(), endOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFBadPoint);\n\t}\n\ttransformPoints(2);\n\tleftFill = transformColor(leftFill);\n\trightFill = transformColor(rightFill);\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tloadWideLinefromtolineFillleftFillrightFill(0, point1Get(), point2Get(), 0, leftFill, rightFill);\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(4);\n}\n\nfunction primitiveAddOval() {\n\tvar borderIndex;\n\tvar borderWidth;\n\tvar endOop;\n\tvar failureCode;\n\tvar fillIndex;\n\tvar startOop;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 5) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tborderIndex = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(0));\n\tborderWidth = interpreterProxy.stackIntegerValue(1);\n\tfillIndex = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(2));\n\tendOop = interpreterProxy.stackObjectValue(3);\n\tstartOop = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(5), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (!(isFillOkay(borderIndex) && (isFillOkay(fillIndex)))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tfillIndex = transformColor(fillIndex);\n\tborderIndex = transformColor(borderIndex);\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif ((fillIndex === 0) && ((borderIndex === 0) || (borderWidth <= 0))) {\n\t\treturn interpreterProxy.pop(5);\n\t}\n\tif (!needAvailableSpace(16 * GBBaseSize)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWorkTooBig);\n\t}\n\tif ((borderWidth > 0) && (borderIndex !== 0)) {\n\t\tborderWidth = transformWidth(borderWidth);\n\t} else {\n\t\tborderWidth = 0;\n\t}\n\tloadPointfrom(point1Get(), startOop);\n\tloadPointfrom(point2Get(), endOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFBadPoint);\n\t}\n\tloadOvallineFillleftFillrightFill(borderWidth, borderIndex, 0, fillIndex);\n\tif (engineStopped) {\n\t\twbStackClear();\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tneedsFlushPut(1);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(5);\n}\n\nfunction primitiveAddPolygon() {\n\tvar failureCode;\n\tvar fillIndex;\n\tvar length;\n\tvar lineFill;\n\tvar lineWidth;\n\tvar nPoints;\n\tvar points;\n\tvar pointsIsArray;\n\tvar segSize;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 5) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tlineFill = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(0));\n\tlineWidth = interpreterProxy.stackIntegerValue(1);\n\tfillIndex = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(2));\n\tnPoints = interpreterProxy.stackIntegerValue(3);\n\tpoints = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(5), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tlength = SIZEOF(points);\n\tif (interpreterProxy.isWords(points)) {\n\n\t\t/* Either PointArray or ShortPointArray */\n\n\t\tpointsIsArray = false;\n\t\tif (!((length === nPoints) || ((nPoints * 2) === length))) {\n\t\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t\t}\n\t} else {\n\n\t\t/* Must be Array of points */\n\n\t\tif (!interpreterProxy.isArray(points)) {\n\t\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t\t}\n\t\tif (length !== nPoints) {\n\t\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t\t}\n\t\tpointsIsArray = true;\n\t}\n\tif ((lineWidth === 0) || (lineFill === 0)) {\n\t\tsegSize = GLBaseSize;\n\t} else {\n\t\tsegSize = GLWideSize;\n\t}\n\tif (!needAvailableSpace(segSize * nPoints)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!(isFillOkay(lineFill) && (isFillOkay(fillIndex)))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tlineFill = transformColor(lineFill);\n\tfillIndex = transformColor(fillIndex);\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (((lineFill === 0) || (lineWidth === 0)) && (fillIndex === 0)) {\n\t\treturn interpreterProxy.pop(5);\n\t}\n\tif (lineWidth !== 0) {\n\t\tlineWidth = transformWidth(lineWidth);\n\t}\n\tif (pointsIsArray) {\n\t\tloadArrayPolygonnPointsfilllineWidthlineFill(points, nPoints, fillIndex, lineWidth, lineFill);\n\t} else {\n\t\tloadPolygonnPointsfilllineWidthlineFillpointsShort(points.wordsAsInt32Array(), nPoints, fillIndex, lineWidth, lineFill, nPoints === length);\n\t}\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tneedsFlushPut(1);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(5);\n}\n\nfunction primitiveAddRect() {\n\tvar borderIndex;\n\tvar borderWidth;\n\tvar endOop;\n\tvar failureCode;\n\tvar fillIndex;\n\tvar startOop;\n\n\n\t/* Fail if we have the wrong number of arguments */\n\n\tif (interpreterProxy.methodArgumentCount() !== 5) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tborderIndex = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(0));\n\tborderWidth = interpreterProxy.stackIntegerValue(1);\n\tfillIndex = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(2));\n\tendOop = interpreterProxy.stackObjectValue(3);\n\tstartOop = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(5), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (!(isFillOkay(borderIndex) && (isFillOkay(fillIndex)))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tborderIndex = transformColor(borderIndex);\n\tfillIndex = transformColor(fillIndex);\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif ((fillIndex === 0) && ((borderIndex === 0) || (borderWidth === 0))) {\n\t\treturn interpreterProxy.pop(5);\n\t}\n\tif (!needAvailableSpace(4 * GLBaseSize)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWorkTooBig);\n\t}\n\tif ((borderWidth > 0) && (borderIndex !== 0)) {\n\t\tborderWidth = transformWidth(borderWidth);\n\t} else {\n\t\tborderWidth = 0;\n\t}\n\tloadPointfrom(point1Get(), startOop);\n\tloadPointfrom(point3Get(), endOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFBadPoint);\n\t}\n\tpoint2Get()[0] = point3Get()[0];\n\tpoint2Get()[1] = point1Get()[1];\n\tpoint4Get()[0] = point1Get()[0];\n\tpoint4Get()[1] = point3Get()[1];\n\ttransformPoints(4);\n\tloadRectanglelineFillleftFillrightFill(borderWidth, borderIndex, 0, fillIndex);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tneedsFlushPut(1);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(5);\n}\n\n\n/*\tNote: No need to load either bitBlt or spanBuffer */\n\nfunction primitiveChangedActiveEdgeEntry() {\n\tvar edge;\n\tvar edgeOop;\n\tvar failureCode;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateWaitingChange))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tedgeOop = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tedge = loadEdgeStateFrom(edgeOop);\n\tif (!edge) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEdgeDataTooSmall);\n\t}\n\tif (edgeNumLinesOf(edge) === 0) {\n\t\tremoveFirstAETEntry();\n\t} else {\n\t\tresortFirstAETEntry();\n\t\taetStartPut(aetStartGet() + 1);\n\t}\n\tstatePut(GEStateUpdateEdges);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountChangeAETEntry, 1);\n\t\tincrementStatby(GWTimeChangeAETEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\nfunction primitiveCopyBuffer() {\n\tvar buf1;\n\tvar buf2;\n\tvar diff;\n\tvar dst;\n\tvar failCode;\n\tvar i;\n\tvar src;\n\tvar iLimiT;\n\n\tif (interpreterProxy.methodArgumentCount() !== 2) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tbuf2 = interpreterProxy.stackValue(0);\n\n\t/* Make sure the old buffer is properly initialized */\n\n\tbuf1 = interpreterProxy.stackValue(1);\n\tif (((failCode = loadWorkBufferFrom(buf1))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failCode);\n\t}\n\tif (CLASSOF(buf1) !== CLASSOF(buf2)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFClassMismatch);\n\t}\n\tdiff = SIZEOF(buf2) - SIZEOF(buf1);\n\tif (diff < 0) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFSizeMismatch);\n\t}\n\tsrc = workBuffer;\n\tdst = buf2.wordsAsInt32Array();\n\tfor (i = 0, iLimiT = (wbTopGet() - 1); i <= iLimiT; i++) {\n\t\tdst[i] = src[i];\n\t}\n\tdst[GWBufferTop] = (wbTopGet() + diff);\n\tdst[GWSize] = (wbSizeGet() + diff);\n\tsrc = PTR_ADD(src, wbTopGet());\n\tdst = PTR_ADD(dst, wbTopGet() + diff);\n\tfor (i = 0, iLimiT = ((wbSizeGet() - wbTopGet()) - 1); i <= iLimiT; i++) {\n\t\tdst[i] = src[i];\n\t}\n\tif (((failCode = loadWorkBufferFrom(buf2))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failCode);\n\t}\n\tinterpreterProxy.pop(2);\n}\n\n\n/*\tNote: Must load bitBlt and spanBuffer */\n\nfunction primitiveDisplaySpanBuffer() {\n\tvar failureCode;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(0), GEStateBlitBuffer))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (((failureCode = loadSpanBufferFrom(interpreterProxy.fetchPointerofObject(BESpanIndex, engine)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (!loadBitBltFrom(interpreterProxy.fetchPointerofObject(BEBitBltIndex, engine))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFBitBltLoadFailed);\n\t}\n\tif ((currentYGet() & aaScanMaskGet()) === aaScanMaskGet()) {\n\t\tdisplaySpanBufferAt(currentYGet());\n\t\tpostDisplayAction();\n\t}\n\tif (!finishedProcessing()) {\n\t\taetStartPut(0);\n\t\tcurrentYPut(currentYGet() + 1);\n\t\tstatePut(GEStateUpdateEdges);\n\t}\n\tstoreEngineStateInto(engine);\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountDisplaySpan, 1);\n\t\tincrementStatby(GWTimeDisplaySpan, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\n\n/*\tTurn on/off profiling. Return the old value of the flag. */\n\nfunction primitiveDoProfileStats() {\n\tvar newValue;\n\tvar oldValue;\n\n\toldValue = doProfileStats;\n\tnewValue = interpreterProxy.stackObjectValue(0);\n\tnewValue = interpreterProxy.booleanValueOf(newValue);\n\tif (!interpreterProxy.failed()) {\n\t\tdoProfileStats = newValue;\n\t\tinterpreterProxy.pop(2);\n\t\tinterpreterProxy.pushBool(oldValue);\n\t}\n}\n\nfunction primitiveFinishedProcessing() {\n\tvar failureCode;\n\tvar finished;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(0)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tfinished = finishedProcessing();\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n\tinterpreterProxy.pushBool(finished);\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountFinishTest, 1);\n\t\tincrementStatby(GWTimeFinishTest, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\nfunction primitiveGetAALevel() {\n\tvar failureCode;\n\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(0)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tinterpreterProxy.pop(1);\n\tinterpreterProxy.pushInteger(aaLevelGet());\n}\n\nfunction primitiveGetBezierStats() {\n\tvar failureCode;\n\tvar statOop;\n\tvar stats;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(1)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tstatOop = interpreterProxy.stackObjectValue(0);\n\tif (!(!interpreterProxy.failed() && (interpreterProxy.isWords(statOop) && (SIZEOF(statOop) >= 4)))) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tstats = statOop.wordsAsInt32Array();\n\tstats[0] = (stats[0] + workBuffer[GWBezierMonotonSubdivisions]);\n\tstats[1] = (stats[1] + workBuffer[GWBezierHeightSubdivisions]);\n\tstats[2] = (stats[2] + workBuffer[GWBezierOverflowSubdivisions]);\n\tstats[3] = (stats[3] + workBuffer[GWBezierLineConversions]);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveGetClipRect() {\n\tvar failureCode;\n\tvar pointOop;\n\tvar rectOop;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(1)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\trectOop = interpreterProxy.stackObjectValue(0);\n\tif (!(!interpreterProxy.failed() && (interpreterProxy.isPointers(rectOop) && (SIZEOF(rectOop) >= 2)))) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tinterpreterProxy.pushRemappableOop(rectOop);\n\tpointOop = interpreterProxy.makePointwithxValueyValue(clipMinXGet(), clipMinYGet());\n\tinterpreterProxy.storePointerofObjectwithValue(0, interpreterProxy.topRemappableOop(), pointOop);\n\tpointOop = interpreterProxy.makePointwithxValueyValue(clipMaxXGet(), clipMaxYGet());\n\trectOop = interpreterProxy.popRemappableOop();\n\tinterpreterProxy.storePointerofObjectwithValue(1, rectOop, pointOop);\n\tinterpreterProxy.popthenPush(2, rectOop);\n}\n\nfunction primitiveGetCounts() {\n\tvar failureCode;\n\tvar statOop;\n\tvar stats;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(1)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tstatOop = interpreterProxy.stackObjectValue(0);\n\tif (!(!interpreterProxy.failed() && (interpreterProxy.isWords(statOop) && (SIZEOF(statOop) >= 9)))) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tstats = statOop.wordsAsInt32Array();\n\tstats[0] = (stats[0] + workBuffer[GWCountInitializing]);\n\tstats[1] = (stats[1] + workBuffer[GWCountFinishTest]);\n\tstats[2] = (stats[2] + workBuffer[GWCountNextGETEntry]);\n\tstats[3] = (stats[3] + workBuffer[GWCountAddAETEntry]);\n\tstats[4] = (stats[4] + workBuffer[GWCountNextFillEntry]);\n\tstats[5] = (stats[5] + workBuffer[GWCountMergeFill]);\n\tstats[6] = (stats[6] + workBuffer[GWCountDisplaySpan]);\n\tstats[7] = (stats[7] + workBuffer[GWCountNextAETEntry]);\n\tstats[8] = (stats[8] + workBuffer[GWCountChangeAETEntry]);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveGetDepth() {\n\tvar failureCode;\n\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(0)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tinterpreterProxy.pop(1);\n\tinterpreterProxy.pushInteger(currentZGet());\n}\n\n\n/*\tReturn the reason why the last operation failed. */\n\nfunction primitiveGetFailureReason() {\n\tvar failCode;\n\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\n\t/* Note -- don't call loadEngineFrom here because this will override the stopReason with Zero */\n\n\tengine = interpreterProxy.stackValue(0);\n\tif (typeof engine === \"number\") {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineIsInteger);\n\t}\n\tif (!interpreterProxy.isPointers(engine)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineIsWords);\n\t}\n\tif (SIZEOF(engine) < BEBalloonEngineSize) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineTooSmall);\n\t}\n\tif (((failCode = loadWorkBufferFrom(interpreterProxy.fetchPointerofObject(BEWorkBufferIndex, engine)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failCode);\n\t}\n\tinterpreterProxy.pop(1);\n\tinterpreterProxy.pushInteger(stopReasonGet());\n}\n\nfunction primitiveGetOffset() {\n\tvar failureCode;\n\tvar pointOop;\n\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(0)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tpointOop = interpreterProxy.makePointwithxValueyValue(destOffsetXGet(), destOffsetYGet());\n\tinterpreterProxy.popthenPush(1, pointOop);\n}\n\nfunction primitiveGetTimes() {\n\tvar failureCode;\n\tvar statOop;\n\tvar stats;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(1)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tstatOop = interpreterProxy.stackObjectValue(0);\n\tif (!(!interpreterProxy.failed() && (interpreterProxy.isWords(statOop) && (SIZEOF(statOop) >= 9)))) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tstats = statOop.wordsAsInt32Array();\n\tstats[0] = (stats[0] + workBuffer[GWTimeInitializing]);\n\tstats[1] = (stats[1] + workBuffer[GWTimeFinishTest]);\n\tstats[2] = (stats[2] + workBuffer[GWTimeNextGETEntry]);\n\tstats[3] = (stats[3] + workBuffer[GWTimeAddAETEntry]);\n\tstats[4] = (stats[4] + workBuffer[GWTimeNextFillEntry]);\n\tstats[5] = (stats[5] + workBuffer[GWTimeMergeFill]);\n\tstats[6] = (stats[6] + workBuffer[GWTimeDisplaySpan]);\n\tstats[7] = (stats[7] + workBuffer[GWTimeNextAETEntry]);\n\tstats[8] = (stats[8] + workBuffer[GWTimeChangeAETEntry]);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveInitializeBuffer() {\n\tvar size;\n\tvar wbOop;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\twbOop = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(wbOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (((size = SIZEOF(wbOop))) < GWMinimalSize) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tworkBufferPut(wbOop);\n\tobjBuffer = PTR_ADD(workBuffer, GWHeaderSize);\n\tmagicNumberPut(GWMagicNumber);\n\twbSizePut(size);\n\twbTopPut(size);\n\tstatePut(GEStateUnlocked);\n\tobjStartPut(GWHeaderSize);\n\tobjUsedPut(4);\n\tobjectTypeOfput(0, GEPrimitiveFill);\n\tobjectLengthOfput(0, 4);\n\tobjectIndexOfput(0, 0);\n\tgetStartPut(0);\n\tgetUsedPut(0);\n\taetStartPut(0);\n\taetUsedPut(0);\n\tstopReasonPut(0);\n\tneedsFlushPut(0);\n\tclipMinXPut(0);\n\tclipMaxXPut(0);\n\tclipMinYPut(0);\n\tclipMaxYPut(0);\n\tcurrentZPut(0);\n\tresetGraphicsEngineStats();\n\tinitEdgeTransform();\n\tinitColorTransform();\n\tinterpreterProxy.pop(2);\n\tinterpreterProxy.push(wbOop);\n}\n\n\n/*\tNote: No need to load bitBlt but must load spanBuffer */\n\nfunction primitiveInitializeProcessing() {\n\tvar failureCode;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(0), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (((failureCode = loadSpanBufferFrom(interpreterProxy.fetchPointerofObject(BESpanIndex, engine)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tinitializeGETProcessing();\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tstatePut(GEStateAddingFromGET);\n\tif (!interpreterProxy.failed()) {\n\t\tstoreEngineStateInto(engine);\n\t}\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountInitializing, 1);\n\t\tincrementStatby(GWTimeInitializing, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\n\n/*\tNote: No need to load bitBlt but must load spanBuffer */\n\nfunction primitiveMergeFillFrom() {\n\tvar bitsOop;\n\tvar failureCode;\n\tvar fillOop;\n\tvar value;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 2) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(2), GEStateWaitingForFill))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (((failureCode = loadSpanBufferFrom(interpreterProxy.fetchPointerofObject(BESpanIndex, engine)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tfillOop = interpreterProxy.stackObjectValue(0);\n\n\t/* Check bitmap */\n\n\tbitsOop = interpreterProxy.stackObjectValue(1);\n\tif (!(!interpreterProxy.failed() && (CLASSOF(bitsOop) === interpreterProxy.classBitmap()))) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (SIZEOF(fillOop) < FTBalloonFillDataSize) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFFillDataTooSmall);\n\t}\n\tvalue = interpreterProxy.fetchIntegerofObject(FTIndexIndex, fillOop);\n\tif (objectIndexOf(lastExportedFillGet()) !== value) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tvalue = interpreterProxy.fetchIntegerofObject(FTMinXIndex, fillOop);\n\tif (lastExportedLeftXGet() !== value) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tvalue = interpreterProxy.fetchIntegerofObject(FTMaxXIndex, fillOop);\n\tif (lastExportedRightXGet() !== value) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tif (SIZEOF(bitsOop) < (lastExportedRightXGet() - lastExportedLeftXGet())) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfillBitmapSpanfromto(bitsOop.wordsAsInt32Array(), lastExportedLeftXGet(), lastExportedRightXGet());\n\tstatePut(GEStateScanningAET);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(2);\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountMergeFill, 1);\n\t\tincrementStatby(GWTimeMergeFill, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\nfunction primitiveNeedsFlush() {\n\tvar failureCode;\n\tvar needFlush;\n\n\tif (interpreterProxy.methodArgumentCount() !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(0)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tneedFlush = needsFlush();\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n\tinterpreterProxy.pushBool(needFlush);\n}\n\nfunction primitiveNeedsFlushPut() {\n\tvar failureCode;\n\tvar needFlush;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFrom(interpreterProxy.stackValue(1)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tneedFlush = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(0));\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (needFlush === true) {\n\t\tneedsFlushPut(1);\n\t} else {\n\t\tneedsFlushPut(0);\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tNote: No need to load either bitBlt or spanBuffer */\n\nfunction primitiveNextActiveEdgeEntry() {\n\tvar edge;\n\tvar edgeOop;\n\tvar failureCode;\n\tvar hasEdge;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredStateor(interpreterProxy.stackValue(1), GEStateUpdateEdges, GEStateCompleted))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tedgeOop = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\thasEdge = false;\n\tif (stateGet() !== GEStateCompleted) {\n\t\thasEdge = findNextExternalUpdateFromAET();\n\t\tif (hasEdge) {\n\t\t\tedge = aetBuffer[aetStartGet()];\n\t\t\tstoreEdgeStateFrominto(edge, edgeOop);\n\t\t\tstatePut(GEStateWaitingChange);\n\t\t} else {\n\t\t\tstatePut(GEStateAddingFromGET);\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(2);\n\tinterpreterProxy.pushBool(!hasEdge);\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountNextAETEntry, 1);\n\t\tincrementStatby(GWTimeNextAETEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\n\n/*\tNote: No need to load bitBlt but must load spanBuffer */\n\nfunction primitiveNextFillEntry() {\n\tvar failureCode;\n\tvar fillOop;\n\tvar hasFill;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateScanningAET))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (((failureCode = loadSpanBufferFrom(interpreterProxy.fetchPointerofObject(BESpanIndex, engine)))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tif (!loadFormsFrom(interpreterProxy.fetchPointerofObject(BEFormsIndex, engine))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFFormLoadFailed);\n\t}\n\tif (clearSpanBufferGet() !== 0) {\n\t\tif ((currentYGet() & aaScanMaskGet()) === 0) {\n\t\t\tclearSpanBuffer();\n\t\t}\n\t\tclearSpanBufferPut(0);\n\t}\n\tfillOop = interpreterProxy.stackObjectValue(0);\n\thasFill = findNextExternalFillFromAET();\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (hasFill) {\n\t\tstoreFillStateInto(fillOop);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tif (hasFill) {\n\t\tstatePut(GEStateWaitingForFill);\n\t} else {\n\t\twbStackClear();\n\t\tspanEndAAPut(0);\n\t\tstatePut(GEStateBlitBuffer);\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(2);\n\tinterpreterProxy.pushBool(!hasFill);\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountNextFillEntry, 1);\n\t\tincrementStatby(GWTimeNextFillEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\n\n/*\tNote: No need to load either bitBlt or spanBuffer */\n\nfunction primitiveNextGlobalEdgeEntry() {\n\tvar edge;\n\tvar edgeOop;\n\tvar failureCode;\n\tvar hasEdge;\n\n\tif (doProfileStats) {\n\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t}\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateAddingFromGET))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tedgeOop = interpreterProxy.stackObjectValue(0);\n\thasEdge = findNextExternalEntryFromGET();\n\tif (hasEdge) {\n\t\tedge = getBuffer[getStartGet()];\n\t\tstoreEdgeStateFrominto(edge, edgeOop);\n\t\tgetStartPut(getStartGet() + 1);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongEdge);\n\t}\n\tif (hasEdge) {\n\t\tstatePut(GEStateWaitingForEdge);\n\t} else {\n\n\t\t/* Start scanning the AET */\n\n\t\tstatePut(GEStateScanningAET);\n\t\tclearSpanBufferPut(1);\n\t\taetStartPut(0);\n\t\twbStackClear();\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(2);\n\tinterpreterProxy.pushBool(!hasEdge);\n\tif (doProfileStats) {\n\t\tincrementStatby(GWCountNextGETEntry, 1);\n\t\tincrementStatby(GWTimeNextGETEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t}\n}\n\nfunction primitiveRegisterExternalEdge() {\n\tvar edge;\n\tvar failureCode;\n\tvar index;\n\tvar initialX;\n\tvar initialY;\n\tvar initialZ;\n\tvar leftFillIndex;\n\tvar rightFillIndex;\n\n\tif (interpreterProxy.methodArgumentCount() !== 6) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(6), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\trightFillIndex = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(0));\n\tleftFillIndex = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(1));\n\tinitialZ = interpreterProxy.stackIntegerValue(2);\n\tinitialY = interpreterProxy.stackIntegerValue(3);\n\tinitialX = interpreterProxy.stackIntegerValue(4);\n\tindex = interpreterProxy.stackIntegerValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tif (!allocateObjEntry(GEBaseEdgeSize)) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWorkTooBig);\n\t}\n\tif (!(isFillOkay(leftFillIndex) && (isFillOkay(rightFillIndex)))) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFWrongFill);\n\t}\n\tedge = objUsed;\n\n\t/* Install type and length */\n\n\tobjUsed = edge + GEBaseEdgeSize;\n\tobjectTypeOfput(edge, GEPrimitiveEdge);\n\tobjectLengthOfput(edge, GEBaseEdgeSize);\n\tobjectIndexOfput(edge, index);\n\tedgeXValueOfput(edge, initialX);\n\tedgeYValueOfput(edge, initialY);\n\tedgeZValueOfput(edge, initialZ);\n\tedgeLeftFillOfput(edge, transformColor(leftFillIndex));\n\tedgeRightFillOfput(edge, transformColor(rightFillIndex));\n\tif (engineStopped) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEngineStopped);\n\t}\n\tif (!interpreterProxy.failed()) {\n\t\tstoreEngineStateInto(engine);\n\t\tinterpreterProxy.pop(6);\n\t}\n}\n\nfunction primitiveRegisterExternalFill() {\n\tvar failureCode;\n\tvar fill;\n\tvar index;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tindex = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tfill = 0;\n\twhile (fill === 0) {\n\t\tif (!allocateObjEntry(GEBaseEdgeSize)) {\n\t\t\treturn interpreterProxy.primitiveFailFor(GEFWorkTooBig);\n\t\t}\n\t\tfill = objUsed;\n\n\t\t/* Install type and length */\n\n\t\tobjUsed = fill + GEBaseFillSize;\n\t\tobjectTypeOfput(fill, GEPrimitiveFill);\n\t\tobjectLengthOfput(fill, GEBaseFillSize);\n\t\tobjectIndexOfput(fill, index);\n\t}\n\tif (!interpreterProxy.failed()) {\n\t\tstoreEngineStateInto(engine);\n\t\tinterpreterProxy.pop(2);\n\t\tinterpreterProxy.pushInteger(fill);\n\t}\n}\n\n\n/*\tStart/Proceed rendering the entire image */\n\nfunction primitiveRenderImage() {\n\tvar failCode;\n\n\tif (((failCode = loadRenderingState())) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failCode);\n\t}\n\tproceedRenderingScanline();\n\tif (engineStopped) {\n\t\treturn storeRenderingState();\n\t}\n\tproceedRenderingImage();\n\tstoreRenderingState();\n}\n\n\n/*\tStart rendering the entire image */\n\nfunction primitiveRenderScanline() {\n\tvar failCode;\n\n\tif (((failCode = loadRenderingState())) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failCode);\n\t}\n\tproceedRenderingScanline();\n\tstoreRenderingState();\n}\n\nfunction primitiveSetAALevel() {\n\tvar failureCode;\n\tvar level;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tlevel = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tsetAALevel(level);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tPrimitive. Set the BitBlt plugin to use. */\n\nfunction primitiveSetBitBltPlugin() {\n\tvar i;\n\tvar length;\n\tvar needReload;\n\tvar pluginName;\n\tvar ptr;\n\n\n\t/* Must be string to work */\n\n\tpluginName = interpreterProxy.stackValue(0);\n\tif (!interpreterProxy.isBytes(pluginName)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tlength = BYTESIZEOF(pluginName);\n\tif (length >= 256) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tptr = pluginName.bytes;\n\tneedReload = false;\n\n // JS hack: can't copy bytes as in the C version\n var newPluginName = pluginName.bytesAsString();\n if (newPluginName !== bbPluginName) {\n bbPluginName = newPluginName;\n needReload = true;\n }\n\n\tif (needReload) {\n\t\tif (!initialiseModule()) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t}\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveSetClipRect() {\n\tvar failureCode;\n\tvar rectOop;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\trectOop = interpreterProxy.stackObjectValue(0);\n\tif (!(!interpreterProxy.failed() && (interpreterProxy.isPointers(rectOop) && (SIZEOF(rectOop) >= 2)))) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tloadPointfrom(point1Get(), interpreterProxy.fetchPointerofObject(0, rectOop));\n\tloadPointfrom(point2Get(), interpreterProxy.fetchPointerofObject(1, rectOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tclipMinXPut(point1Get()[0]);\n\tclipMinYPut(point1Get()[1]);\n\tclipMaxXPut(point2Get()[0]);\n\tclipMaxYPut(point2Get()[1]);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveSetColorTransform() {\n\tvar failureCode;\n\tvar transformOop;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\ttransformOop = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tloadColorTransformFrom(transformOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(GEFEntityLoadFailed);\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveSetDepth() {\n\tvar depth;\n\tvar failureCode;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tdepth = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tcurrentZPut(depth);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveSetEdgeTransform() {\n\tvar failureCode;\n\tvar transformOop;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\ttransformOop = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tloadEdgeTransformFrom(transformOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveSetOffset() {\n\tvar failureCode;\n\tvar pointOop;\n\n\tif (interpreterProxy.methodArgumentCount() !== 1) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadNumArgs);\n\t}\n\tif (((failureCode = quickLoadEngineFromrequiredState(interpreterProxy.stackValue(1), GEStateUnlocked))) !== 0) {\n\t\treturn interpreterProxy.primitiveFailFor(failureCode);\n\t}\n\tpointOop = interpreterProxy.stackValue(0);\n\tif (CLASSOF(pointOop) !== interpreterProxy.classPoint()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tloadPointfrom(point1Get(), pointOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFailFor(PrimErrBadArgument);\n\t}\n\tdestOffsetXPut(point1Get()[0]);\n\tdestOffsetYPut(point1Get()[1]);\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tThis is the main rendering entry */\n\nfunction proceedRenderingImage() {\n\tvar external;\n\n\twhile (!(finishedProcessing())) {\n\t\tif (doProfileStats) {\n\t\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t\t}\n\t\texternal = findNextExternalEntryFromGET();\n\t\tif (doProfileStats) {\n\t\t\tincrementStatby(GWCountNextGETEntry, 1);\n\t\t\tincrementStatby(GWTimeNextGETEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn statePut(GEStateAddingFromGET);\n\t\t}\n\t\tif (external) {\n\t\t\tstatePut(GEStateWaitingForEdge);\n\t\t\treturn stopBecauseOf(GErrorGETEntry);\n\t\t}\n\t\taetStartPut(0);\n\t\twbStackClear();\n\t\tclearSpanBufferPut(1);\n\t\tif (doProfileStats) {\n\t\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t\t}\n\t\tif ((clearSpanBufferGet() !== 0) && ((currentYGet() & aaScanMaskGet()) === 0)) {\n\t\t\tclearSpanBuffer();\n\t\t}\n\t\tclearSpanBufferPut(0);\n\t\texternal = findNextExternalFillFromAET();\n\t\tif (doProfileStats) {\n\t\t\tincrementStatby(GWCountNextFillEntry, 1);\n\t\t\tincrementStatby(GWTimeNextFillEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn statePut(GEStateScanningAET);\n\t\t}\n\t\tif (external) {\n\t\t\tstatePut(GEStateWaitingForFill);\n\t\t\treturn stopBecauseOf(GErrorFillEntry);\n\t\t}\n\t\twbStackClear();\n\t\tspanEndAAPut(0);\n\t\tif (doProfileStats) {\n\t\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t\t}\n\t\tif ((currentYGet() & aaScanMaskGet()) === aaScanMaskGet()) {\n\t\t\tdisplaySpanBufferAt(currentYGet());\n\t\t\tpostDisplayAction();\n\t\t}\n\t\tif (doProfileStats) {\n\t\t\tincrementStatby(GWCountDisplaySpan, 1);\n\t\t\tincrementStatby(GWTimeDisplaySpan, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn statePut(GEStateBlitBuffer);\n\t\t}\n\t\tif (finishedProcessing()) {\n\t\t\treturn 0;\n\t\t}\n\t\taetStartPut(0);\n\t\tcurrentYPut(currentYGet() + 1);\n\t\tif (doProfileStats) {\n\t\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t\t}\n\t\texternal = findNextExternalUpdateFromAET();\n\t\tif (doProfileStats) {\n\t\t\tincrementStatby(GWCountNextAETEntry, 1);\n\t\t\tincrementStatby(GWTimeNextAETEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn statePut(GEStateUpdateEdges);\n\t\t}\n\t\tif (external) {\n\t\t\tstatePut(GEStateWaitingChange);\n\t\t\treturn stopBecauseOf(GErrorAETEntry);\n\t\t}\n\t}\n}\n\n\n/*\tProceed rendering the current scan line.\n\tThis method may be called after some Smalltalk code has been executed inbetween. */\n/*\tThis is the main rendering entry */\n\nfunction proceedRenderingScanline() {\n\tvar external;\n\tvar state;\n\n\tstate = stateGet();\n\tif (state === GEStateUnlocked) {\n\t\tinitializeGETProcessing();\n\t\tif (engineStopped) {\n\t\t\treturn 0;\n\t\t}\n\t\tstate = GEStateAddingFromGET;\n\t}\n\tif (state === GEStateAddingFromGET) {\n\t\tif (doProfileStats) {\n\t\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t\t}\n\t\texternal = findNextExternalEntryFromGET();\n\t\tif (doProfileStats) {\n\t\t\tincrementStatby(GWCountNextGETEntry, 1);\n\t\t\tincrementStatby(GWTimeNextGETEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn statePut(GEStateAddingFromGET);\n\t\t}\n\t\tif (external) {\n\t\t\tstatePut(GEStateWaitingForEdge);\n\t\t\treturn stopBecauseOf(GErrorGETEntry);\n\t\t}\n\t\taetStartPut(0);\n\t\twbStackClear();\n\t\tclearSpanBufferPut(1);\n\t\tstate = GEStateScanningAET;\n\t}\n\tif (state === GEStateScanningAET) {\n\t\tif (doProfileStats) {\n\t\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t\t}\n\t\tif ((clearSpanBufferGet() !== 0) && ((currentYGet() & aaScanMaskGet()) === 0)) {\n\t\t\tclearSpanBuffer();\n\t\t}\n\t\tclearSpanBufferPut(0);\n\t\texternal = findNextExternalFillFromAET();\n\t\tif (doProfileStats) {\n\t\t\tincrementStatby(GWCountNextFillEntry, 1);\n\t\t\tincrementStatby(GWTimeNextFillEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn statePut(GEStateScanningAET);\n\t\t}\n\t\tif (external) {\n\t\t\tstatePut(GEStateWaitingForFill);\n\t\t\treturn stopBecauseOf(GErrorFillEntry);\n\t\t}\n\t\tstate = GEStateBlitBuffer;\n\t\twbStackClear();\n\t\tspanEndAAPut(0);\n\t}\n\tif (state === GEStateBlitBuffer) {\n\t\tif (doProfileStats) {\n\t\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t\t}\n\t\tif ((currentYGet() & aaScanMaskGet()) === aaScanMaskGet()) {\n\t\t\tdisplaySpanBufferAt(currentYGet());\n\t\t\tpostDisplayAction();\n\t\t}\n\t\tif (doProfileStats) {\n\t\t\tincrementStatby(GWCountDisplaySpan, 1);\n\t\t\tincrementStatby(GWTimeDisplaySpan, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn statePut(GEStateBlitBuffer);\n\t\t}\n\t\tif (finishedProcessing()) {\n\t\t\treturn 0;\n\t\t}\n\t\tstate = GEStateUpdateEdges;\n\t\taetStartPut(0);\n\t\tcurrentYPut(currentYGet() + 1);\n\t}\n\tif (state === GEStateUpdateEdges) {\n\t\tif (doProfileStats) {\n\t\t\tgeProfileTime = interpreterProxy.ioMicroMSecs();\n\t\t}\n\t\texternal = findNextExternalUpdateFromAET();\n\t\tif (doProfileStats) {\n\t\t\tincrementStatby(GWCountNextAETEntry, 1);\n\t\t\tincrementStatby(GWTimeNextAETEntry, interpreterProxy.ioMicroMSecs() - geProfileTime);\n\t\t}\n\t\tif (engineStopped) {\n\t\t\treturn statePut(GEStateUpdateEdges);\n\t\t}\n\t\tif (external) {\n\t\t\tstatePut(GEStateWaitingChange);\n\t\t\treturn stopBecauseOf(GErrorAETEntry);\n\t\t}\n\t\tstatePut(GEStateAddingFromGET);\n\t}\n}\n\n\n/*\tLoad the minimal required state from the engineOop, e.g., just the work buffer.\n\t Answer 0 on success or non-zero a failure code on failure */\n\nfunction quickLoadEngineFrom(engineOop) {\n\tvar failCode;\n\n\tif (interpreterProxy.failed()) {\n\t\treturn GEFAlreadyFailed;\n\t}\n\tif (typeof engineOop === \"number\") {\n\t\treturn GEFEngineIsInteger;\n\t}\n\tif (!interpreterProxy.isPointers(engineOop)) {\n\t\treturn GEFEngineIsWords;\n\t}\n\tif (SIZEOF(engineOop) < BEBalloonEngineSize) {\n\t\treturn GEFEngineTooSmall;\n\t}\n\tengine = engineOop;\n\tif (((failCode = loadWorkBufferFrom(interpreterProxy.fetchPointerofObject(BEWorkBufferIndex, engineOop)))) !== 0) {\n\t\treturn failCode;\n\t}\n\tstopReasonPut(0);\n\tobjUsed = objUsedGet();\n\tengineStopped = false;\n\treturn 0;\n}\n\nfunction quickLoadEngineFromrequiredState(oop, requiredState) {\n\tvar failureCode;\n\n\tif (((failureCode = quickLoadEngineFrom(oop))) !== 0) {\n\t\treturn failureCode;\n\t}\n\tif (stateGet() === requiredState) {\n\t\treturn 0;\n\t}\n\tstopReasonPut(GErrorBadState);\n\treturn GEFWrongState;\n}\n\nfunction quickLoadEngineFromrequiredStateor(oop, requiredState, alternativeState) {\n\tvar failureCode;\n\n\tif (((failureCode = quickLoadEngineFrom(oop))) !== 0) {\n\t\treturn failureCode;\n\t}\n\tif (stateGet() === requiredState) {\n\t\treturn 0;\n\t}\n\tif (stateGet() === alternativeState) {\n\t\treturn 0;\n\t}\n\tstopReasonPut(GErrorBadState);\n\treturn GEFWrongState;\n}\n\n\n/*\tRemove any top fills if they have become invalid. */\n\nfunction quickRemoveInvalidFillsAt(leftX) {\n\tif (stackFillSize() === 0) {\n\t\treturn null;\n\t}\n\twhile (topRightX() <= leftX) {\n\t\thideFilldepth(topFill(), topDepth());\n\t\tif (stackFillSize() === 0) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n\n/*\tSort elements i through j of self to be nondescending according to\n\tsortBlock. */\n/*\tNote: The original loop has been heavily re-written for C translation */\n\nfunction quickSortGlobalEdgeTablefromto(array, i, j) {\n\tvar again;\n\tvar before;\n\tvar di;\n\tvar dij;\n\tvar dj;\n\tvar ij;\n\tvar k;\n\tvar l;\n\tvar n;\n\tvar tmp;\n\tvar tt;\n\n\n\t/* The prefix d means the data at that index. */\n\n\tif (((n = (j + 1) - i)) <= 1) {\n\t\treturn 0;\n\t}\n\tdi = array[i];\n\tdj = array[j];\n\n\t/* i.e., should di precede dj? */\n\n\tbefore = getSortsbefore(di, dj);\n\tif (!before) {\n\t\ttmp = array[i];\n\t\tarray[i] = array[j];\n\t\tarray[j] = tmp;\n\t\ttt = di;\n\t\tdi = dj;\n\t\tdj = tt;\n\t}\n\tif (n <= 2) {\n\t\treturn 0;\n\t}\n\n\t/* ij is the midpoint of i and j. */\n\n\tij = (i + j) >> 1;\n\n\t/* Sort di,dij,dj. Make dij be their median. */\n\n\tdij = array[ij];\n\n\t/* i.e. should di precede dij? */\n\n\tbefore = getSortsbefore(di, dij);\n\tif (before) {\n\n\t\t/* i.e., should dij precede dj? */\n\n\t\tbefore = getSortsbefore(dij, dj);\n\t\tif (!before) {\n\n\t\t\t/* i.e., should dij precede dj? */\n\n\t\t\ttmp = array[j];\n\t\t\tarray[j] = array[ij];\n\t\t\tarray[ij] = tmp;\n\t\t\tdij = dj;\n\t\t}\n\t} else {\n\n\t\t/* i.e. di should come after dij */\n\n\t\ttmp = array[i];\n\t\tarray[i] = array[ij];\n\t\tarray[ij] = tmp;\n\t\tdij = di;\n\t}\n\tif (n <= 3) {\n\t\treturn 0;\n\t}\n\tk = i;\n\tl = j;\n\tagain = true;\n\twhile (again) {\n\t\tbefore = true;\n\t\twhile (before) {\n\t\t\tif (k <= ((--l))) {\n\t\t\t\ttmp = array[l];\n\t\t\t\tbefore = getSortsbefore(dij, tmp);\n\t\t\t} else {\n\t\t\t\tbefore = false;\n\t\t\t}\n\t\t}\n\t\tbefore = true;\n\t\twhile (before) {\n\t\t\tif (((++k)) <= l) {\n\t\t\t\ttmp = array[k];\n\t\t\t\tbefore = getSortsbefore(tmp, dij);\n\t\t\t} else {\n\t\t\t\tbefore = false;\n\t\t\t}\n\t\t}\n\t\tagain = k <= l;\n\t\tif (again) {\n\t\t\ttmp = array[k];\n\t\t\tarray[k] = array[l];\n\t\t\tarray[l] = tmp;\n\t\t}\n\t}\n\tquickSortGlobalEdgeTablefromto(array, i, l);\n\tquickSortGlobalEdgeTablefromto(array, k, j);\n}\n\nfunction rShiftTable() {\n\tvar theTable =\n\t\t[0, 5, 4, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1];\n\n\treturn theTable;\n}\n\nfunction removeFirstAETEntry() {\n\tvar index;\n\n\tindex = aetStartGet();\n\taetUsedPut(aetUsedGet() - 1);\n\twhile (index < aetUsedGet()) {\n\t\taetBuffer[index] = aetBuffer[index + 1];\n\t\t++index;\n\t}\n}\n\nfunction repeatValuemax(delta, maxValue) {\n\tvar newDelta;\n\n\tnewDelta = delta;\n\twhile (newDelta < 0) {\n\t\tnewDelta += maxValue;\n\t}\n\twhile (newDelta >= maxValue) {\n\t\tnewDelta -= maxValue;\n\t}\n\treturn newDelta;\n}\n\nfunction resetGraphicsEngineStats() {\n\tworkBuffer[GWTimeInitializing] = 0;\n\tworkBuffer[GWTimeFinishTest] = 0;\n\tworkBuffer[GWTimeNextGETEntry] = 0;\n\tworkBuffer[GWTimeAddAETEntry] = 0;\n\tworkBuffer[GWTimeNextFillEntry] = 0;\n\tworkBuffer[GWTimeMergeFill] = 0;\n\tworkBuffer[GWTimeDisplaySpan] = 0;\n\tworkBuffer[GWTimeNextAETEntry] = 0;\n\tworkBuffer[GWTimeChangeAETEntry] = 0;\n\tworkBuffer[GWCountInitializing] = 0;\n\tworkBuffer[GWCountFinishTest] = 0;\n\tworkBuffer[GWCountNextGETEntry] = 0;\n\tworkBuffer[GWCountAddAETEntry] = 0;\n\tworkBuffer[GWCountNextFillEntry] = 0;\n\tworkBuffer[GWCountMergeFill] = 0;\n\tworkBuffer[GWCountDisplaySpan] = 0;\n\tworkBuffer[GWCountNextAETEntry] = 0;\n\tworkBuffer[GWCountChangeAETEntry] = 0;\n\tworkBuffer[GWBezierMonotonSubdivisions] = 0;\n\tworkBuffer[GWBezierHeightSubdivisions] = 0;\n\tworkBuffer[GWBezierOverflowSubdivisions] = 0;\n\tworkBuffer[GWBezierLineConversions] = 0;\n}\n\nfunction resortFirstAETEntry() {\n\tvar edge;\n\tvar leftEdge;\n\tvar xValue;\n\n\tif (aetStartGet() === 0) {\n\t\treturn null;\n\t}\n\tedge = aetBuffer[aetStartGet()];\n\txValue = edgeXValueOf(edge);\n\tleftEdge = aetBuffer[aetStartGet() - 1];\n\tif (edgeXValueOf(leftEdge) <= xValue) {\n\t\treturn null;\n\t}\n\tmoveAETEntryFromedgex(aetStartGet(), edge, xValue);\n}\n\nfunction returnWideBezierFill() {\n\treturn (dispatchReturnValue = wideBezierFillOf(dispatchedValue));\n}\n\nfunction returnWideBezierWidth() {\n\treturn (dispatchReturnValue = wideBezierWidthOf(dispatchedValue));\n}\n\n\n/*\tReturn the fill of the (wide) line - this method is called from a case. */\n\nfunction returnWideLineFill() {\n\treturn (dispatchReturnValue = wideLineFillOf(dispatchedValue));\n}\n\n\n/*\tReturn the width of the (wide) line - this method is called from a case. */\n\nfunction returnWideLineWidth() {\n\treturn (dispatchReturnValue = wideLineWidthOf(dispatchedValue));\n}\n\n\n/*\tSet the anti-aliasing level. Three levels are supported:\n\t\t1 - No antialiasing\n\t\t2 - 2x2 unweighted anti-aliasing\n\t\t4 - 4x4 unweighted anti-aliasing.\n\t */\n\nfunction setAALevel(level) {\n\tvar aaLevel;\n\n\tif (level >= 4) {\n\t\taaLevel = 4;\n\t}\n\tif ((level >= 2) && (level < 4)) {\n\t\taaLevel = 2;\n\t}\n\tif (level < 2) {\n\t\taaLevel = 1;\n\t}\n\taaLevelPut(aaLevel);\n\tif (aaLevel === 1) {\n\t\taaShiftPut(0);\n\t\taaColorMaskPut(4294967295);\n\t\taaScanMaskPut(0);\n\t}\n\tif (aaLevel === 2) {\n\t\taaShiftPut(1);\n\t\taaColorMaskPut(4244438268);\n\t\taaScanMaskPut(1);\n\t}\n\tif (aaLevel === 4) {\n\t\taaShiftPut(2);\n\t\taaColorMaskPut(4042322160);\n\t\taaScanMaskPut(3);\n\t}\n\taaColorShiftPut(aaShiftGet() * 2);\n\taaHalfPixelPut(aaShiftGet());\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\n/*\tReturn the run-length value from the given ShortRunArray. */\n\nfunction shortRunLengthAtfrom(i, runArray) {\n\treturn (runArray[i]|0) >>> 16;\n}\n\n\n/*\tReturn the run-length value from the given ShortRunArray.\n\tNote: We don't need any coercion to short/int here, since\n\twe deal basically only with unsigned values. */\n\nfunction shortRunValueAtfrom(i, runArray) {\n\treturn (runArray[i]|0) & 65535;\n}\n\nfunction showFilldepthrightX(fillIndex, depth, rightX) {\n\tif (!allocateStackFillEntry()) {\n\t\treturn null;\n\t}\n\tstackFillValueput(0, fillIndex);\n\tstackFillDepthput(0, depth);\n\tstackFillRightXput(0, rightX);\n\tif (stackFillSize() === stackFillEntryLength()) {\n\t\treturn null;\n\t}\n\tif (fillSortsbefore(0, stackFillSize() - stackFillEntryLength())) {\n\n\t\t/* New top fill */\n\n\t\tstackFillValueput(0, topFillValue());\n\t\tstackFillDepthput(0, topFillDepth());\n\t\tstackFillRightXput(0, topFillRightX());\n\t\ttopFillValuePut(fillIndex);\n\t\ttopFillDepthPut(depth);\n\t\ttopFillRightXPut(rightX);\n\t}\n}\n\nfunction smallSqrtTable() {\n\tvar theTable = \n\t[0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6];\n\n\treturn theTable;\n}\n\n\n/*\tSort the entire global edge table */\n\nfunction sortGlobalEdgeTable() {\n\tquickSortGlobalEdgeTablefromto(getBuffer, 0, getUsedGet() - 1);\n}\n\nfunction spanEndAAGet() {\n\treturn workBuffer[GWSpanEndAA];\n}\n\nfunction spanEndAAPut(value) {\n\treturn workBuffer[GWSpanEndAA] = value;\n}\n\nfunction spanEndGet() {\n\treturn workBuffer[GWSpanEnd];\n}\n\nfunction spanEndPut(value) {\n\treturn workBuffer[GWSpanEnd] = value;\n}\n\nfunction spanSizeGet() {\n\treturn workBuffer[GWSpanSize];\n}\n\nfunction spanSizePut(value) {\n\treturn workBuffer[GWSpanSize] = value;\n}\n\nfunction spanStartGet() {\n\treturn workBuffer[GWSpanStart];\n}\n\nfunction spanStartPut(value) {\n\treturn workBuffer[GWSpanStart] = value;\n}\n\nfunction squaredLengthOfwith(deltaX, deltaY) {\n\treturn (deltaX * deltaX) + (deltaY * deltaY);\n}\n\nfunction stackFillDepth(index) {\n\treturn wbStackValue(index + 1);\n}\n\nfunction stackFillDepthput(index, value) {\n\treturn wbStackValueput(index + 1, value);\n}\n\nfunction stackFillEntryLength() {\n\treturn 3;\n}\n\nfunction stackFillRightX(index) {\n\treturn wbStackValue(index + 2);\n}\n\nfunction stackFillRightXput(index, value) {\n\treturn wbStackValueput(index + 2, value);\n}\n\nfunction stackFillSize() {\n\treturn wbStackSize();\n}\n\nfunction stackFillValue(index) {\n\treturn wbStackValue(index);\n}\n\nfunction stackFillValueput(index, value) {\n\treturn wbStackValueput(index, value);\n}\n\nfunction stateGet() {\n\treturn workBuffer[GWState];\n}\n\nfunction statePut(value) {\n\treturn workBuffer[GWState] = value;\n}\n\n\n/*\tInitialize the current entry in the GET by stepping to the current scan line */\n\nfunction stepToFirstBezier() {\n\treturn stepToFirstBezierInat(getBuffer[getStartGet()], currentYGet());\n}\n\n\n/*\tInitialize the bezier at yValue.\n\tTODO: Check if reducing maxSteps from 2*deltaY to deltaY \n\t\tbrings a *significant* performance improvement.\n\t\tIn theory this should make for double step performance\n\t\tbut will cost in quality. Might be that the AA stuff will\n\t\tcompensate for this - but I'm not really sure. */\n\nfunction stepToFirstBezierInat(bezier, yValue) {\n\tvar deltaY;\n\tvar endX;\n\tvar endY;\n\tvar fwDDx;\n\tvar fwDDy;\n\tvar fwDx;\n\tvar fwDy;\n\tvar fwX1;\n\tvar fwX2;\n\tvar fwY1;\n\tvar fwY2;\n\tvar maxSteps;\n\tvar scaledStepSize;\n\tvar squaredStepSize;\n\tvar startX;\n\tvar startY;\n\tvar updateData;\n\tvar viaX;\n\tvar viaY;\n\n\n\t/* Do a quick check if there is anything at all to do */\n\n\tif (!isWide(bezier) && (yValue >= bezierEndYOf(bezier))) {\n\t\treturn edgeNumLinesOfput(bezier, 0);\n\t}\n\tstartX = edgeXValueOf(bezier);\n\tstartY = edgeYValueOf(bezier);\n\tviaX = bezierViaXOf(bezier);\n\tviaY = bezierViaYOf(bezier);\n\tendX = bezierEndXOf(bezier);\n\tendY = bezierEndYOf(bezier);\n\n\t/* Initialize integer forward differencing */\n\n\tdeltaY = endY - startY;\n\tfwX1 = (viaX - startX) * 2;\n\tfwX2 = (startX + endX) - (viaX * 2);\n\tfwY1 = (viaY - startY) * 2;\n\tfwY2 = (startY + endY) - (viaY * 2);\n\tmaxSteps = deltaY * 2;\n\tif (maxSteps < 2) {\n\t\tmaxSteps = 2;\n\t}\n\tscaledStepSize = DIV(16777216, maxSteps);\n\tsquaredStepSize = absoluteSquared8Dot24(scaledStepSize);\n\tfwDx = fwX1 * scaledStepSize;\n\tfwDDx = (fwX2 * squaredStepSize) * 2;\n\tfwDx += fwDDx >> 1;\n\tfwDy = fwY1 * scaledStepSize;\n\tfwDDy = (fwY2 * squaredStepSize) * 2;\n\n\t/* Store the values */\n\n\tfwDy += fwDDy >> 1;\n\tedgeNumLinesOfput(bezier, deltaY);\n\tupdateData = bezierUpdateDataOf(bezier);\n\tupdateData[GBUpdateX] = (startX * 256);\n\tupdateData[GBUpdateY] = (startY * 256);\n\tupdateData[GBUpdateDX] = fwDx;\n\tupdateData[GBUpdateDY] = fwDy;\n\tupdateData[GBUpdateDDX] = fwDDx;\n\tupdateData[GBUpdateDDY] = fwDDy;\n\tif (((startY = edgeYValueOf(bezier))) !== yValue) {\n\t\tstepToNextBezierInat(bezier, yValue);\n\t\tedgeNumLinesOfput(bezier, deltaY - (yValue - startY));\n\t}\n}\n\n\n/*\tInitialize the current entry in the GET by stepping to the current scan line */\n\nfunction stepToFirstLine() {\n\treturn stepToFirstLineInat(getBuffer[getStartGet()], currentYGet());\n}\n\n\n/*\tInitialize the line at yValue */\n\nfunction stepToFirstLineInat(line, yValue) {\n\tvar deltaX;\n\tvar deltaY;\n\tvar error;\n\tvar errorAdjUp;\n\tvar i;\n\tvar startY;\n\tvar widthX;\n\tvar xDir;\n\tvar xInc;\n\n\n\t/* Do a quick check if there is anything at all to do */\n\n\tif (!isWide(line) && (yValue >= lineEndYOf(line))) {\n\t\treturn edgeNumLinesOfput(line, 0);\n\t}\n\tdeltaX = lineEndXOf(line) - edgeXValueOf(line);\n\n\t/* Check if edge goes left to right */\n\n\tdeltaY = lineEndYOf(line) - edgeYValueOf(line);\n\tif (deltaX >= 0) {\n\t\txDir = 1;\n\t\twidthX = deltaX;\n\t\terror = 0;\n\t} else {\n\t\txDir = -1;\n\t\twidthX = 0 - deltaX;\n\t\terror = 1 - deltaY;\n\t}\n\tif (deltaY === 0) {\n\n\t\t/* No error for horizontal edges */\n\n\t\terror = 0;\n\n\t\t/* Encodes width and direction */\n\n\t\txInc = deltaX;\n\t\terrorAdjUp = 0;\n\t} else {\n\n\t\t/* Check if edge is y-major */\n\n\t\tif (deltaY > widthX) {\n\n\t\t\t/* Note: The '>' instead of '>=' could be important here... */\n\n\t\t\txInc = 0;\n\t\t\terrorAdjUp = widthX;\n\t\t} else {\n\t\t\txInc = (DIV(widthX, deltaY)) * xDir;\n\t\t\terrorAdjUp = MOD(widthX, deltaY);\n\t\t}\n\t}\n\tedgeNumLinesOfput(line, deltaY);\n\tlineXDirectionOfput(line, xDir);\n\tlineXIncrementOfput(line, xInc);\n\tlineErrorOfput(line, error);\n\tlineErrorAdjUpOfput(line, errorAdjUp);\n\tlineErrorAdjDownOfput(line, deltaY);\n\tif (((startY = edgeYValueOf(line))) !== yValue) {\n\t\tfor (i = startY; i <= (yValue - 1); i++) {\n\t\t\tstepToNextLineInat(line, i);\n\t\t}\n\t\tedgeNumLinesOfput(line, deltaY - (yValue - startY));\n\t}\n}\n\n\n/*\tInitialize the current entry in the GET by stepping to the current scan line */\n\nfunction stepToFirstWideBezier() {\n\treturn stepToFirstWideBezierInat(getBuffer[getStartGet()], currentYGet());\n}\n\n\n/*\tInitialize the bezier at yValue */\n\nfunction stepToFirstWideBezierInat(bezier, yValue) {\n\tvar endX;\n\tvar i;\n\tvar lineOffset;\n\tvar lineWidth;\n\tvar nLines;\n\tvar startY;\n\tvar xDir;\n\tvar yEntry;\n\tvar yExit;\n\n\n\t/* Get some values */\n\n\tlineWidth = wideBezierExtentOf(bezier);\n\n\t/* Compute the incremental values of the bezier */\n\n\tlineOffset = offsetFromWidth(lineWidth);\n\tendX = bezierEndXOf(bezier);\n\tstartY = edgeYValueOf(bezier);\n\tstepToFirstBezierInat(bezier, startY);\n\n\t/* Copy the incremental update data */\n\n\tnLines = edgeNumLinesOf(bezier);\n\tfor (i = 0; i <= 5; i++) {\n\t\twideBezierUpdateDataOf(bezier)[i] = bezierUpdateDataOf(bezier)[i];\n\t}\n\txDir = bezierUpdateDataOf(bezier)[GBUpdateDX];\n\tif (xDir === 0) {\n\t\tbezierUpdateDataOf(bezier)[GBUpdateDDX];\n\t}\n\tif (xDir >= 0) {\n\t\txDir = 1;\n\t} else {\n\t\txDir = -1;\n\t}\n\tif (xDir < 0) {\n\t\tadjustWideBezierLeftwidthoffsetendX(bezier, lineWidth, lineOffset, endX);\n\t} else {\n\t\tadjustWideBezierRightwidthoffsetendX(bezier, lineWidth, lineOffset, endX);\n\t}\n\tif (nLines === 0) {\n\t\tbezierUpdateDataOf(bezier)[GBUpdateX] = (bezierFinalXOf(bezier) * 256);\n\t}\n\tedgeNumLinesOfput(bezier, nLines + lineWidth);\n\n\t/* turned on at lineOffset */\n\n\tyEntry = 0;\n\n\t/* turned off at zero */\n\n\tyExit = (0 - nLines) - lineOffset;\n\twideBezierEntryOfput(bezier, yEntry);\n\twideBezierExitOfput(bezier, yExit);\n\tif ((yEntry >= lineOffset) && (yExit < 0)) {\n\t\tedgeFillsValidate(bezier);\n\t} else {\n\t\tedgeFillsInvalidate(bezier);\n\t}\n\tcomputeFinalWideBezierValueswidth(bezier, lineWidth);\n\tif (startY !== yValue) {\n\n\t\t/* Note: Must single step here so that entry/exit works */\n\n\t\tfor (i = startY; i <= (yValue - 1); i++) {\n\t\t\tstepToNextWideBezierInat(bezier, i);\n\t\t}\n\t\tedgeNumLinesOfput(bezier, edgeNumLinesOf(bezier) - (yValue - startY));\n\t}\n}\n\n\n/*\tInitialize the current entry in the GET by stepping to the current scan line */\n\nfunction stepToFirstWideLine() {\n\treturn stepToFirstWideLineInat(getBuffer[getStartGet()], currentYGet());\n}\n\n\n/*\tInitialize the wide line at yValue. */\n\nfunction stepToFirstWideLineInat(line, yValue) {\n\tvar i;\n\tvar lineOffset;\n\tvar lineWidth;\n\tvar nLines;\n\tvar startX;\n\tvar startY;\n\tvar xDir;\n\tvar yEntry;\n\tvar yExit;\n\n\n\t/* Get some values */\n\n\tlineWidth = wideLineExtentOf(line);\n\n\t/* Compute the incremental values of the line */\n\n\tlineOffset = offsetFromWidth(lineWidth);\n\tstartX = edgeXValueOf(line);\n\tstartY = edgeYValueOf(line);\n\tstepToFirstLineInat(line, startY);\n\tnLines = edgeNumLinesOf(line);\n\n\t/* Adjust the line to start at the correct X position */\n\n\txDir = lineXDirectionOf(line);\n\tedgeXValueOfput(line, startX - lineOffset);\n\tedgeNumLinesOfput(line, nLines + lineWidth);\n\tif (xDir > 0) {\n\t\twideLineWidthOfput(line, lineXIncrementOf(line) + lineWidth);\n\t} else {\n\t\twideLineWidthOfput(line, lineWidth - lineXIncrementOf(line));\n\t\tedgeXValueOfput(line, edgeXValueOf(line) + lineXIncrementOf(line));\n\t}\n\n\t/* turned on at lineOffset */\n\n\tyEntry = 0;\n\n\t/* turned off at zero */\n\n\tyExit = (0 - nLines) - lineOffset;\n\twideLineEntryOfput(line, yEntry);\n\twideLineExitOfput(line, yExit);\n\tif ((yEntry >= lineOffset) && (yExit < 0)) {\n\t\tedgeFillsValidate(line);\n\t} else {\n\t\tedgeFillsInvalidate(line);\n\t}\n\tif (startY !== yValue) {\n\t\tfor (i = startY; i <= (yValue - 1); i++) {\n\t\t\tstepToNextWideLineInat(line, i);\n\t\t}\n\t\tedgeNumLinesOfput(line, edgeNumLinesOf(line) - (yValue - startY));\n\t}\n}\n\n\n/*\tProcess the current entry in the AET by stepping to the next scan line */\n\nfunction stepToNextBezier() {\n\treturn stepToNextBezierInat(aetBuffer[aetStartGet()], currentYGet());\n}\n\n\n/*\tIncrementally step to the next scan line in the given bezier update data. */\n\nfunction stepToNextBezierForwardat(updateData, yValue) {\n\tvar fwDx;\n\tvar fwDy;\n\tvar lastX;\n\tvar lastY;\n\tvar minY;\n\n\tlastX = updateData[GBUpdateX];\n\tlastY = updateData[GBUpdateY];\n\tfwDx = updateData[GBUpdateDX];\n\tfwDy = updateData[GBUpdateDY];\n\n\t/* Step as long as we haven't yet reached minY and also\n\tas long as fwDy is greater than zero thus stepping down.\n\tNote: The test for fwDy should not be necessary in theory\n\t\tbut is a good insurance in practice. */\n\n\tminY = yValue * 256;\n\twhile ((minY > lastY) && (fwDy >= 0)) {\n\t\tlastX += (fwDx + 32768) >> 16;\n\t\tlastY += (fwDy + 32768) >> 16;\n\t\tfwDx += updateData[GBUpdateDDX];\n\t\tfwDy += updateData[GBUpdateDDY];\n\t}\n\tupdateData[GBUpdateX] = lastX;\n\tupdateData[GBUpdateY] = lastY;\n\tupdateData[GBUpdateDX] = fwDx;\n\tupdateData[GBUpdateDY] = fwDy;\n\treturn lastX >> 8;\n}\n\n\n/*\tIncrementally step to the next scan line in the given bezier */\n\nfunction stepToNextBezierInat(bezier, yValue) {\n\tvar xValue;\n\n\txValue = stepToNextBezierForwardat(bezierUpdateDataOf(bezier), yValue);\n\tedgeXValueOfput(bezier, xValue);\n}\n\n\n/*\tProcess the current entry in the AET by stepping to the next scan line */\n\nfunction stepToNextLine() {\n\treturn stepToNextLineInat(aetBuffer[aetStartGet()], currentYGet());\n}\n\n\n/*\tIncrementally step to the next scan line in the given line */\n\nfunction stepToNextLineInat(line, yValue) {\n\tvar err;\n\tvar x;\n\n\tx = edgeXValueOf(line) + lineXIncrementOf(line);\n\terr = lineErrorOf(line) + lineErrorAdjUpOf(line);\n\tif (err > 0) {\n\t\tx += lineXDirectionOf(line);\n\t\terr -= lineErrorAdjDownOf(line);\n\t}\n\tlineErrorOfput(line, err);\n\tedgeXValueOfput(line, x);\n}\n\n\n/*\tInitialize the current entry in the GET by stepping to the current scan line */\n\nfunction stepToNextWideBezier() {\n\tstepToNextWideBezierInat(aetBuffer[aetStartGet()], currentYGet());\n}\n\n\n/*\tIncrementally step to the next scan line in the given wide bezier */\n\nfunction stepToNextWideBezierInat(bezier, yValue) {\n\tvar lineOffset;\n\tvar lineWidth;\n\tvar yEntry;\n\tvar yExit;\n\n\n\t/* Don't inline this */\n\n\tlineWidth = wideBezierExtentOf(bezier);\n\tlineOffset = offsetFromWidth(lineWidth);\n\tyEntry = wideBezierEntryOf(bezier) + 1;\n\tyExit = wideBezierExitOf(bezier) + 1;\n\twideBezierEntryOfput(bezier, yEntry);\n\twideBezierExitOfput(bezier, yExit);\n\tif (yEntry >= lineOffset) {\n\t\tedgeFillsValidate(bezier);\n\t}\n\tif (yExit >= 0) {\n\t\tedgeFillsInvalidate(bezier);\n\t}\n\tif ((yExit + lineOffset) < 0) {\n\t\tstepToNextBezierForwardat(bezierUpdateDataOf(bezier), yValue);\n\t} else {\n\n\t\t/* Adjust the last x value to the final x recorded previously */\n\n\t\tbezierUpdateDataOf(bezier)[GBUpdateX] = (bezierFinalXOf(bezier) * 256);\n\t}\n\tstepToNextBezierForwardat(wideBezierUpdateDataOf(bezier), yValue);\n\tcomputeFinalWideBezierValueswidth(bezier, lineWidth);\n}\n\n\n/*\tProcess the current entry in the AET by stepping to the next scan line */\n\nfunction stepToNextWideLine() {\n\treturn stepToNextWideLineInat(aetBuffer[aetStartGet()], currentYGet());\n}\n\n\n/*\tIncrementally step to the next scan line in the given wide line */\n\nfunction stepToNextWideLineInat(line, yValue) {\n\tvar lastX;\n\tvar lineOffset;\n\tvar lineWidth;\n\tvar nextX;\n\tvar yEntry;\n\tvar yExit;\n\n\n\t/* Adjust entry/exit values */\n\n\tyEntry = wideLineEntryOf(line) + 1;\n\tyExit = wideLineExitOf(line) + 1;\n\twideLineEntryOfput(line, yEntry);\n\twideLineExitOfput(line, yExit);\n\tlineWidth = wideLineExtentOf(line);\n\tlineOffset = offsetFromWidth(lineWidth);\n\tif (yEntry >= lineOffset) {\n\t\tedgeFillsValidate(line);\n\t}\n\tif (yExit >= 0) {\n\t\tedgeFillsInvalidate(line);\n\t}\n\tlastX = edgeXValueOf(line);\n\tstepToNextLineInat(line, yValue);\n\n\t/* Check for special start/end adjustments */\n\n\tnextX = edgeXValueOf(line);\n\tif ((yEntry <= lineWidth) || ((yExit + lineOffset) >= 0)) {\n\n\t\t/* Yes, need an update */\n\n\t\tadjustWideLineafterSteppingFromto(line, lastX, nextX);\n\t}\n}\n\nfunction stopBecauseOf(stopReason) {\n\tstopReasonPut(stopReason);\n\tengineStopped = true;\n}\n\nfunction stopReasonGet() {\n\treturn workBuffer[GWStopReason];\n}\n\nfunction stopReasonPut(value) {\n\treturn workBuffer[GWStopReason] = value;\n}\n\nfunction storeEdgeStateFrominto(edge, edgeOop) {\n\tif (SIZEOF(edgeOop) < ETBalloonEdgeDataSize) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(ETIndexIndex, edgeOop, objectIndexOf(edge));\n\tinterpreterProxy.storeIntegerofObjectwithValue(ETXValueIndex, edgeOop, edgeXValueOf(edge));\n\tinterpreterProxy.storeIntegerofObjectwithValue(ETYValueIndex, edgeOop, currentYGet());\n\tinterpreterProxy.storeIntegerofObjectwithValue(ETZValueIndex, edgeOop, edgeZValueOf(edge));\n\tinterpreterProxy.storeIntegerofObjectwithValue(ETLinesIndex, edgeOop, edgeNumLinesOf(edge));\n\tlastExportedEdgePut(edge);\n}\n\nfunction storeEngineStateInto(oop) {\n\tobjUsedPut(objUsed);\n}\n\nfunction storeFillStateInto(fillOop) {\n\tvar fillIndex;\n\tvar leftX;\n\tvar rightX;\n\n\tfillIndex = lastExportedFillGet();\n\tleftX = lastExportedLeftXGet();\n\trightX = lastExportedRightXGet();\n\tif (SIZEOF(fillOop) < FTBalloonFillDataSize) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(FTIndexIndex, fillOop, objectIndexOf(fillIndex));\n\tinterpreterProxy.storeIntegerofObjectwithValue(FTMinXIndex, fillOop, leftX);\n\tinterpreterProxy.storeIntegerofObjectwithValue(FTMaxXIndex, fillOop, rightX);\n\tinterpreterProxy.storeIntegerofObjectwithValue(FTYValueIndex, fillOop, currentYGet());\n}\n\nfunction storeRenderingState() {\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (engineStopped) {\n\n\t\t/* Check the stop reason and store the required information */\n\n\t\tstoreStopStateIntoEdgefill(interpreterProxy.stackObjectValue(1), interpreterProxy.stackObjectValue(0));\n\t}\n\tstoreEngineStateInto(engine);\n\tinterpreterProxy.pop(3);\n\tinterpreterProxy.pushInteger(stopReasonGet());\n}\n\nfunction storeStopStateIntoEdgefill(edgeOop, fillOop) {\n\tvar edge;\n\tvar reason;\n\n\treason = stopReasonGet();\n\tif (reason === GErrorGETEntry) {\n\t\tedge = getBuffer[getStartGet()];\n\t\tstoreEdgeStateFrominto(edge, edgeOop);\n\t\tgetStartPut(getStartGet() + 1);\n\t}\n\tif (reason === GErrorFillEntry) {\n\t\tstoreFillStateInto(fillOop);\n\t}\n\tif (reason === GErrorAETEntry) {\n\t\tedge = aetBuffer[aetStartGet()];\n\t\tstoreEdgeStateFrominto(edge, edgeOop);\n\t}\n}\n\n\n/*\tSubdivide the given bezier curve if necessary */\n\nfunction subdivideBezier(index) {\n\tvar deltaX;\n\tvar deltaY;\n\tvar endX;\n\tvar endY;\n\tvar startX;\n\tvar startY;\n\n\tstartY = bzStartY(index);\n\n\t/* If the receiver is horizontal, don't do anything */\n\n\tendY = bzEndY(index);\n\tif (endY === startY) {\n\t\treturn index;\n\t}\n\tdeltaY = endY - startY;\n\tif (deltaY < 0) {\n\t\tdeltaY = 0 - deltaY;\n\t}\n\tif (deltaY > 255) {\n\t\tincrementStatby(GWBezierHeightSubdivisions, 1);\n\t\treturn computeBezierSplitAtHalf(index);\n\t}\n\tstartX = bzStartX(index);\n\tendX = bzEndX(index);\n\tdeltaX = endX - startX;\n\tif (deltaX < 0) {\n\t\tdeltaX = 0 - deltaX;\n\t}\n\tif ((deltaY * 32) < deltaX) {\n\t\tincrementStatby(GWBezierOverflowSubdivisions, 1);\n\t\treturn computeBezierSplitAtHalf(index);\n\t}\n\treturn index;\n}\n\n\n/*\tRecursively subdivide the curve on the bezier stack. */\n\nfunction subdivideBezierFrom(index) {\n\tvar index1;\n\tvar index2;\n\tvar otherIndex;\n\n\totherIndex = subdivideBezier(index);\n\tif (otherIndex !== index) {\n\t\tindex1 = subdivideBezierFrom(index);\n\t\tif (engineStopped) {\n\t\t\treturn 0;\n\t\t}\n\t\tindex2 = subdivideBezierFrom(otherIndex);\n\t\tif (engineStopped) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (index1 >= index2) {\n\t\t\treturn index1;\n\t\t} else {\n\t\t\treturn index2;\n\t\t}\n\t}\n\treturn index;\n}\n\n\n/*\tCheck if the given bezier curve is monoton in Y, and, if desired in X. \n\tIf not, subdivide it */\n\nfunction subdivideToBeMonotoninX(base, doTestX) {\n\tvar base2;\n\tvar index1;\n\tvar index2;\n\n\tbase2 = (index1 = (index2 = subdivideToBeMonotonInY(base)));\n\tif (doTestX) {\n\t\tindex1 = subdivideToBeMonotonInX(base);\n\t}\n\tif (index1 > index2) {\n\t\tindex2 = index1;\n\t}\n\tif ((base !== base2) && (doTestX)) {\n\t\tindex1 = subdivideToBeMonotonInX(base2);\n\t}\n\tif (index1 > index2) {\n\t\tindex2 = index1;\n\t}\n\treturn index2;\n}\n\n\n/*\tCheck if the given bezier curve is monoton in X. If not, subdivide it */\n\nfunction subdivideToBeMonotonInX(index) {\n\tvar denom;\n\tvar dx1;\n\tvar dx2;\n\tvar endX;\n\tvar num;\n\tvar startX;\n\tvar viaX;\n\n\tstartX = bzStartX(index);\n\tviaX = bzViaX(index);\n\tendX = bzEndX(index);\n\tdx1 = viaX - startX;\n\tdx2 = endX - viaX;\n\tif ((dx1 * dx2) >= 0) {\n\t\treturn index;\n\t}\n\tincrementStatby(GWBezierMonotonSubdivisions, 1);\n\tdenom = dx2 - dx1;\n\tnum = dx1;\n\tif (num < 0) {\n\t\tnum = 0 - num;\n\t}\n\tif (denom < 0) {\n\t\tdenom = 0 - denom;\n\t}\n\treturn computeBeziersplitAt(index, num / denom);\n}\n\n\n/*\tCheck if the given bezier curve is monoton in Y. If not, subdivide it */\n\nfunction subdivideToBeMonotonInY(index) {\n\tvar denom;\n\tvar dy1;\n\tvar dy2;\n\tvar endY;\n\tvar num;\n\tvar startY;\n\tvar viaY;\n\n\tstartY = bzStartY(index);\n\tviaY = bzViaY(index);\n\tendY = bzEndY(index);\n\tdy1 = viaY - startY;\n\tdy2 = endY - viaY;\n\tif ((dy1 * dy2) >= 0) {\n\t\treturn index;\n\t}\n\tincrementStatby(GWBezierMonotonSubdivisions, 1);\n\tdenom = dy2 - dy1;\n\tnum = dy1;\n\tif (num < 0) {\n\t\tnum = 0 - num;\n\t}\n\tif (denom < 0) {\n\t\tdenom = 0 - denom;\n\t}\n\treturn computeBeziersplitAt(index, num / denom);\n}\n\n\n/*\tMake the fill style with the given index either visible or invisible */\n\nfunction toggleFilldepthrightX(fillIndex, depth, rightX) {\n\tvar hidden;\n\n\tif (stackFillSize() === 0) {\n\t\tif (allocateStackFillEntry()) {\n\t\t\ttopFillValuePut(fillIndex);\n\t\t\ttopFillDepthPut(depth);\n\t\t\ttopFillRightXPut(rightX);\n\t\t}\n\t} else {\n\t\thidden = hideFilldepth(fillIndex, depth);\n\t\tif (!hidden) {\n\t\t\tshowFilldepthrightX(fillIndex, depth, rightX);\n\t\t}\n\t}\n}\n\nfunction toggleFillsOf(edge) {\n\tvar depth;\n\tvar fillIndex;\n\n\tif (!needAvailableSpace(stackFillEntryLength() * 2)) {\n\t\treturn null;\n\t}\n\tdepth = edgeZValueOf(edge) << 1;\n\tfillIndex = edgeLeftFillOf(edge);\n\tif (fillIndex !== 0) {\n\t\ttoggleFilldepthrightX(fillIndex, depth, 999999999);\n\t}\n\tfillIndex = edgeRightFillOf(edge);\n\tif (fillIndex !== 0) {\n\t\ttoggleFilldepthrightX(fillIndex, depth, 999999999);\n\t}\n\tquickRemoveInvalidFillsAt(edgeXValueOf(edge));\n}\n\nfunction toggleWideFillOf(edge) {\n\tvar depth;\n\tvar fill;\n\tvar index;\n\tvar lineWidth;\n\tvar rightX;\n\tvar type;\n\n\ttype = edgeTypeOf(edge);\n\tdispatchedValue = edge;\n\tswitch (type) {\n\tcase 0:\n\tcase 1:\n\t\terrorWrongIndex();\n\t\tbreak;\n\tcase 2:\n\t\treturnWideLineWidth();\n\t\tbreak;\n\tcase 3:\n\t\treturnWideBezierWidth();\n\t\tbreak;\n\t}\n\tlineWidth = dispatchReturnValue;\n\tswitch (type) {\n\tcase 0:\n\tcase 1:\n\t\terrorWrongIndex();\n\t\tbreak;\n\tcase 2:\n\t\treturnWideLineFill();\n\t\tbreak;\n\tcase 3:\n\t\treturnWideBezierFill();\n\t\tbreak;\n\t}\n\tfill = dispatchReturnValue;\n\tif (fill === 0) {\n\t\treturn null;\n\t}\n\tif (!needAvailableSpace(stackFillEntryLength())) {\n\t\treturn null;\n\t}\n\n\t/* So lines sort before interior fills */\n\n\tdepth = (edgeZValueOf(edge) << 1) + 1;\n\trightX = edgeXValueOf(edge) + lineWidth;\n\tindex = findStackFilldepth(fill, depth);\n\tif (index === -1) {\n\t\tshowFilldepthrightX(fill, depth, rightX);\n\t} else {\n\t\tif (stackFillRightX(index) < rightX) {\n\t\t\tstackFillRightXput(index, rightX);\n\t\t}\n\t}\n\tquickRemoveInvalidFillsAt(edgeXValueOf(edge));\n}\n\nfunction topDepth() {\n\tif (stackFillSize() === 0) {\n\t\treturn -1;\n\t} else {\n\t\treturn topFillDepth();\n\t}\n}\n\nfunction topFill() {\n\tif (stackFillSize() === 0) {\n\t\treturn 0;\n\t} else {\n\t\treturn topFillValue();\n\t}\n}\n\nfunction topFillDepth() {\n\treturn stackFillDepth(stackFillSize() - stackFillEntryLength());\n}\n\nfunction topFillDepthPut(value) {\n\treturn stackFillDepthput(stackFillSize() - stackFillEntryLength(), value);\n}\n\nfunction topFillRightX() {\n\treturn stackFillRightX(stackFillSize() - stackFillEntryLength());\n}\n\nfunction topFillRightXPut(value) {\n\treturn stackFillRightXput(stackFillSize() - stackFillEntryLength(), value);\n}\n\nfunction topFillValue() {\n\treturn stackFillValue(stackFillSize() - stackFillEntryLength());\n}\n\nfunction topFillValuePut(value) {\n\treturn stackFillValueput(stackFillSize() - stackFillEntryLength(), value);\n}\n\nfunction topRightX() {\n\tif (stackFillSize() === 0) {\n\t\treturn 999999999;\n\t} else {\n\t\treturn topFillRightX();\n\t}\n}\n\nfunction transformColor(fillIndex) {\n\tvar a;\n\tvar alphaScale;\n\tvar b;\n\tvar g;\n\tvar r;\n\tvar transform;\n\n\tif (!((fillIndex === 0) || (isFillColor(fillIndex)))) {\n\t\treturn fillIndex;\n\t}\n\tb = fillIndex & 255;\n\tg = (fillIndex >>> 8) & 255;\n\tr = (fillIndex >>> 16) & 255;\n\ta = (fillIndex >>> 24) & 255;\n\tif (hasColorTransform()) {\n\t\ttransform = colorTransform();\n\t\talphaScale = ((a * transform[6]) + transform[7]) / a;\n\t\tr = ((((r * transform[0]) + transform[1]) * alphaScale)|0);\n\t\tg = ((((g * transform[2]) + transform[3]) * alphaScale)|0);\n\t\tb = ((((b * transform[4]) + transform[5]) * alphaScale)|0);\n\t\ta = a * alphaScale|0;\n\t\tr = Math.max(r, 0);\n\t\tr = Math.min(r, 255);\n\t\tg = Math.max(g, 0);\n\t\tg = Math.min(g, 255);\n\t\tb = Math.max(b, 0);\n\t\tb = Math.min(b, 255);\n\t\ta = Math.max(a, 0);\n\t\ta = Math.min(a, 255);\n\t}\n\tif (a < 1) {\n\t\treturn 0;\n\t}\n\tif ((a < 255) && (needsFlush())) {\n\t\tstopBecauseOf(GErrorNeedFlush);\n\t}\n\treturn ((b + (g << 8)) + (r << 16)) + (a << 24);\n}\n\n\n/*\tTransform the given point. If haveMatrix is true then use the current transformation. */\n\nfunction transformPoint(point) {\n\tif (hasEdgeTransform()) {\n\n\t\t/* Note: AA adjustment is done in #transformPoint: for higher accuracy */\n\n\t\ttransformPointinto(point, point);\n\t} else {\n\n\t\t/* Multiply each component by aaLevel and add a half pixel */\n\n\t\tpoint[0] = ((point[0] + destOffsetXGet()) * aaLevelGet());\n\t\tpoint[1] = ((point[1] + destOffsetYGet()) * aaLevelGet());\n\t}\n}\n\n\n/*\tTransform srcPoint into dstPoint by using the currently loaded matrix */\n/*\tNote: This method has been rewritten so that inlining works (e.g., removing\n\tthe declarations and adding argument coercions at the appropriate points) */\n\nfunction transformPointinto(srcPoint, dstPoint) {\n\ttransformPointXyinto((srcPoint[0]|0), (srcPoint[1]|0), dstPoint);\n}\n\n\n/*\tTransform srcPoint into dstPoint by using the currently loaded matrix */\n/*\tNote: This should be rewritten so that inlining works (e.g., removing\n\tthe declarations and adding argument coercions at the appropriate points) */\n\nfunction transformPointXyinto(xValue, yValue, dstPoint) {\n\tvar transform;\n\tvar x;\n\tvar y;\n\n\ttransform = edgeTransform();\n\tx = (((((transform[0] * xValue) + (transform[1] * yValue)) + transform[2]) * aaLevelGet())|0);\n\ty = (((((transform[3] * xValue) + (transform[4] * yValue)) + transform[5]) * aaLevelGet())|0);\n\tdstPoint[0] = x;\n\tdstPoint[1] = y;\n}\n\n\n/*\tTransform n (n=1,2,3) points.\n\tIf haveMatrix is true then the matrix contains the actual transformation. */\n\nfunction transformPoints(n) {\n\tif (n > 0) {\n\t\ttransformPoint(point1Get());\n\t}\n\tif (n > 1) {\n\t\ttransformPoint(point2Get());\n\t}\n\tif (n > 2) {\n\t\ttransformPoint(point3Get());\n\t}\n\tif (n > 3) {\n\t\ttransformPoint(point4Get());\n\t}\n}\n\n\n/*\tTransform the given width */\n\nfunction transformWidth(w) {\n\tvar deltaX;\n\tvar deltaY;\n\tvar dstWidth;\n\tvar dstWidth2;\n\n\tif (w === 0) {\n\t\treturn 0;\n\t}\n\tpoint1Get()[0] = 0;\n\tpoint1Get()[1] = 0;\n\tpoint2Get()[0] = (w * 256);\n\tpoint2Get()[1] = 0;\n\tpoint3Get()[0] = 0;\n\tpoint3Get()[1] = (w * 256);\n\ttransformPoints(3);\n\tdeltaX = (point2Get()[0] - point1Get()[0]);\n\tdeltaY = (point2Get()[1] - point1Get()[1]);\n\tdstWidth = ((Math.sqrt((deltaX * deltaX) + (deltaY * deltaY))|0) + 128) >> 8;\n\tdeltaX = (point3Get()[0] - point1Get()[0]);\n\tdeltaY = (point3Get()[1] - point1Get()[1]);\n\tdstWidth2 = ((Math.sqrt((deltaX * deltaX) + (deltaY * deltaY))|0) + 128) >> 8;\n\tif (dstWidth2 < dstWidth) {\n\t\tdstWidth = dstWidth2;\n\t}\n\tif (dstWidth === 0) {\n\t\treturn 1;\n\t} else {\n\t\treturn dstWidth;\n\t}\n}\n\nfunction uncheckedTransformColor(fillIndex) {\n\tvar a;\n\tvar b;\n\tvar g;\n\tvar r;\n\tvar transform;\n\n\tif (!hasColorTransform()) {\n\t\treturn fillIndex;\n\t}\n\tb = fillIndex & 255;\n\tg = (fillIndex >>> 8) & 255;\n\tr = (fillIndex >>> 16) & 255;\n\ta = (fillIndex >>> 24) & 255;\n\ttransform = colorTransform();\n\tr = (((r * transform[0]) + transform[1])|0);\n\tg = (((g * transform[2]) + transform[3])|0);\n\tb = (((b * transform[4]) + transform[5])|0);\n\ta = (((a * transform[6]) + transform[7])|0);\n\tr = Math.max(r, 0);\n\tr = Math.min(r, 255);\n\tg = Math.max(g, 0);\n\tg = Math.min(g, 255);\n\tb = Math.max(b, 0);\n\tb = Math.min(b, 255);\n\ta = Math.max(a, 0);\n\ta = Math.min(a, 255);\n\tif (a < 16) {\n\t\treturn 0;\n\t}\n\treturn ((b + (g << 8)) + (r << 16)) + (a << 24);\n}\n\nfunction wbSizeGet() {\n\treturn workBuffer[GWSize];\n}\n\nfunction wbSizePut(value) {\n\treturn workBuffer[GWSize] = value;\n}\n\nfunction wbStackClear() {\n\twbTopPut(wbSizeGet());\n}\n\nfunction wbStackPop(nItems) {\n\twbTopPut(wbTopGet() + nItems);\n}\n\nfunction wbStackPush(nItems) {\n\tif (!allocateStackEntry(nItems)) {\n\t\treturn false;\n\t}\n\twbTopPut(wbTopGet() - nItems);\n\treturn true;\n}\n\nfunction wbStackSize() {\n\treturn wbSizeGet() - wbTopGet();\n}\n\nfunction wbStackValue(index) {\n\treturn workBuffer[wbTopGet() + index];\n}\n\nfunction wbStackValueput(index, value) {\n\treturn workBuffer[wbTopGet() + index] = value;\n}\n\nfunction wbTopGet() {\n\treturn workBuffer[GWBufferTop];\n}\n\nfunction wbTopPut(value) {\n\treturn workBuffer[GWBufferTop] = value;\n}\n\nfunction wideBezierEntryOf(line) {\n\treturn objat(line, GBWideEntry);\n}\n\nfunction wideBezierEntryOfput(line, value) {\n\treturn objatput(line, GBWideEntry, value);\n}\n\nfunction wideBezierExitOf(line) {\n\treturn objat(line, GBWideExit);\n}\n\nfunction wideBezierExitOfput(line, value) {\n\treturn objatput(line, GBWideExit, value);\n}\n\nfunction wideBezierExtentOf(bezier) {\n\treturn objat(bezier, GBWideExtent);\n}\n\nfunction wideBezierExtentOfput(bezier, value) {\n\treturn objatput(bezier, GBWideExtent, value);\n}\n\nfunction wideBezierFillOf(bezier) {\n\treturn objat(bezier, GBWideFill);\n}\n\nfunction wideBezierFillOfput(bezier, value) {\n\treturn objatput(bezier, GBWideFill, value);\n}\n\nfunction wideBezierUpdateDataOf(bezier) {\n\treturn PTR_ADD(objBuffer, bezier + GBWideUpdateData);\n}\n\nfunction wideBezierWidthOf(line) {\n\treturn objat(line, GBWideWidth);\n}\n\nfunction wideBezierWidthOfput(line, value) {\n\treturn objatput(line, GBWideWidth, value);\n}\n\nfunction wideLineEntryOf(line) {\n\treturn objat(line, GLWideEntry);\n}\n\nfunction wideLineEntryOfput(line, value) {\n\treturn objatput(line, GLWideEntry, value);\n}\n\nfunction wideLineExitOf(line) {\n\treturn objat(line, GLWideExit);\n}\n\nfunction wideLineExitOfput(line, value) {\n\treturn objatput(line, GLWideExit, value);\n}\n\nfunction wideLineExtentOf(line) {\n\treturn objat(line, GLWideExtent);\n}\n\nfunction wideLineExtentOfput(line, value) {\n\treturn objatput(line, GLWideExtent, value);\n}\n\nfunction wideLineFillOf(line) {\n\treturn objat(line, GLWideFill);\n}\n\nfunction wideLineFillOfput(line, value) {\n\treturn objatput(line, GLWideFill, value);\n}\n\nfunction wideLineWidthOf(line) {\n\treturn objat(line, GLWideWidth);\n}\n\nfunction wideLineWidthOfput(line, value) {\n\treturn objatput(line, GLWideWidth, value);\n}\n\nfunction workBufferPut(wbOop) {\n\tworkBuffer = wbOop.wordsAsInt32Array();\n}\n\n\nSqueak.registerExternalModule(\"B2DPlugin\", {\n\tprimitiveMergeFillFrom: primitiveMergeFillFrom,\n\tprimitiveCopyBuffer: primitiveCopyBuffer,\n\tprimitiveAddRect: primitiveAddRect,\n\tprimitiveAddGradientFill: primitiveAddGradientFill,\n\tprimitiveSetClipRect: primitiveSetClipRect,\n\tinitialiseModule: initialiseModule,\n\tprimitiveSetBitBltPlugin: primitiveSetBitBltPlugin,\n\tprimitiveRegisterExternalEdge: primitiveRegisterExternalEdge,\n\tprimitiveGetClipRect: primitiveGetClipRect,\n\tprimitiveAddBezier: primitiveAddBezier,\n\tprimitiveInitializeProcessing: primitiveInitializeProcessing,\n\tprimitiveRenderImage: primitiveRenderImage,\n\tprimitiveGetOffset: primitiveGetOffset,\n\tprimitiveSetDepth: primitiveSetDepth,\n\tprimitiveAddBezierShape: primitiveAddBezierShape,\n\tprimitiveSetEdgeTransform: primitiveSetEdgeTransform,\n\tgetModuleName: getModuleName,\n\tprimitiveGetTimes: primitiveGetTimes,\n\tprimitiveNextActiveEdgeEntry: primitiveNextActiveEdgeEntry,\n\tprimitiveAddBitmapFill: primitiveAddBitmapFill,\n\tprimitiveGetDepth: primitiveGetDepth,\n\tprimitiveAbortProcessing: primitiveAbortProcessing,\n\tprimitiveNextGlobalEdgeEntry: primitiveNextGlobalEdgeEntry,\n\tprimitiveGetFailureReason: primitiveGetFailureReason,\n\tprimitiveDisplaySpanBuffer: primitiveDisplaySpanBuffer,\n\tmoduleUnloaded: moduleUnloaded,\n\tprimitiveGetCounts: primitiveGetCounts,\n\tprimitiveChangedActiveEdgeEntry: primitiveChangedActiveEdgeEntry,\n\tprimitiveRenderScanline: primitiveRenderScanline,\n\tprimitiveGetBezierStats: primitiveGetBezierStats,\n\tprimitiveFinishedProcessing: primitiveFinishedProcessing,\n\tsetInterpreter: setInterpreter,\n\tprimitiveNeedsFlush: primitiveNeedsFlush,\n\tprimitiveAddLine: primitiveAddLine,\n\tprimitiveSetOffset: primitiveSetOffset,\n\tprimitiveNextFillEntry: primitiveNextFillEntry,\n\tprimitiveInitializeBuffer: primitiveInitializeBuffer,\n\tprimitiveDoProfileStats: primitiveDoProfileStats,\n\tprimitiveAddActiveEdgeEntry: primitiveAddActiveEdgeEntry,\n\tprimitiveSetAALevel: primitiveSetAALevel,\n\tprimitiveNeedsFlushPut: primitiveNeedsFlushPut,\n\tprimitiveAddCompressedShape: primitiveAddCompressedShape,\n\tprimitiveSetColorTransform: primitiveSetColorTransform,\n\tprimitiveAddOval: primitiveAddOval,\n\tprimitiveRegisterExternalFill: primitiveRegisterExternalFill,\n\tprimitiveAddPolygon: primitiveAddPolygon,\n\tprimitiveGetAALevel: primitiveGetAALevel,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:20 pm */\n/* Automatically generated by\n\tJSSmartSyntaxPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tBitBltSimulation VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.BitBltPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Constants ***/\nvar AllOnes = 4294967295;\nvar AlphaIndex = 3;\nvar BBClipHeightIndex = 13;\nvar BBClipWidthIndex = 12;\nvar BBClipXIndex = 10;\nvar BBClipYIndex = 11;\nvar BBColorMapIndex = 14;\nvar BBDestFormIndex = 0;\nvar BBDestXIndex = 4;\nvar BBDestYIndex = 5;\nvar BBHalftoneFormIndex = 2;\nvar BBHeightIndex = 7;\nvar BBRuleIndex = 3;\nvar BBSourceFormIndex = 1;\nvar BBSourceXIndex = 8;\nvar BBSourceYIndex = 9;\nvar BBWarpBase = 15;\nvar BBWidthIndex = 6;\nvar BinaryPoint = 14;\nvar BlueIndex = 2;\nvar ColorMapFixedPart = 2;\nvar ColorMapIndexedPart = 4;\nvar ColorMapNewStyle = 8;\nvar ColorMapPresent = 1;\nvar FixedPt1 = 16384;\nvar FormBitsIndex = 0;\nvar FormDepthIndex = 3;\nvar FormHeightIndex = 2;\nvar FormWidthIndex = 1;\nvar GreenIndex = 1;\nvar OpTableSize = 43;\nvar RedIndex = 0;\n\n/*** Variables ***/\nvar affectedB = 0;\nvar affectedL = 0;\nvar affectedR = 0;\nvar affectedT = 0;\nvar bbH = 0;\nvar bbW = 0;\nvar bitBltOop = 0;\nvar bitCount = 0;\nvar clipHeight = 0;\nvar clipWidth = 0;\nvar clipX = 0;\nvar clipY = 0;\nvar cmBitsPerColor = 0;\nvar cmFlags = 0;\nvar cmLookupTable = null;\nvar cmMask = 0;\nvar cmMaskTable = null;\nvar cmShiftTable = null;\nvar combinationRule = 0;\nvar componentAlphaModeAlpha = 0;\nvar componentAlphaModeColor = 0;\nvar destBits = 0;\nvar destDelta = 0;\nvar destDepth = 0;\nvar destForm = 0;\nvar destHeight = 0;\nvar destIndex = 0;\nvar destMSB = 0;\nvar destMask = 0;\nvar destPPW = 0;\nvar destPitch = 0;\nvar destWidth = 0;\nvar destX = 0;\nvar destY = 0;\nvar dither8Lookup = new Array(4096);\nvar ditherMatrix4x4 = [\n0,\t8,\t2,\t10,\n12,\t4,\t14,\t6,\n3,\t11,\t1,\t9,\n15,\t7,\t13,\t5\n];\nvar ditherThresholds16 = [ 0, 2, 4, 6, 8, 12, 14, 16 ];\nvar ditherValues16 = [\n0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30\n];\nvar dstBitShift = 0;\nvar dx = 0;\nvar dy = 0;\nvar gammaLookupTable = null;\nvar hDir = 0;\nvar halftoneBase = 0;\nvar halftoneForm = 0;\nvar halftoneHeight = 0;\nvar hasSurfaceLock = 0;\nvar height = 0;\nvar interpreterProxy = null;\nvar isWarping = 0;\nvar lockSurfaceFn = null;\nvar mask1 = 0;\nvar mask2 = 0;\nvar maskTable = [\n0, 1, 3, 0, 15, 31, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 65535,\n0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1\n];\nvar moduleName = \"BitBltPlugin 3 November 2014 (e)\";\nvar nWords = 0;\nvar noHalftone = 0;\nvar noSource = 0;\nvar opTable = new Array(43);\nvar preload = 0;\nvar querySurfaceFn = null;\nvar skew = 0;\nvar sourceAlpha = 0;\nvar sourceBits = 0;\nvar sourceDelta = 0;\nvar sourceDepth = 0;\nvar sourceForm = 0;\nvar sourceHeight = 0;\nvar sourceIndex = 0;\nvar sourceMSB = 0;\nvar sourcePPW = 0;\nvar sourcePitch = 0;\nvar sourceWidth = 0;\nvar sourceX = 0;\nvar sourceY = 0;\nvar srcBitShift = 0;\nvar sx = 0;\nvar sy = 0;\nvar ungammaLookupTable = null;\nvar unlockSurfaceFn = null;\nvar vDir = 0;\nvar warpAlignMask = 0;\nvar warpAlignShift = 0;\nvar warpBitShiftTable = new Array(32);\nvar warpSrcMask = 0;\nvar warpSrcShift = 0;\nvar width = 0;\n\n\n\n/*\tSubract the pixels in the source and destination, color by color,\n\tand return the sum of the absolute value of all the differences.\n\tFor non-rgb, XOR the two and return the number of differing pixels.\n\tNote that the region is not clipped to bit boundaries, but only to the\n\tnearest (enclosing) word. This is because copyLoop does not do\n\tpre-merge masking. For accurate results, you must subtract the\n\tvalues obtained from the left and right fringes. */\n\nfunction OLDrgbDiffwith(sourceWord, destinationWord) {\n\tvar diff;\n\tvar pixMask;\n\n\tif (destDepth < 16) {\n\n\t\t/* Just xor and count differing bits if not RGB */\n\n\t\tdiff = sourceWord ^ destinationWord;\n\t\tpixMask = maskTable[destDepth];\n\t\twhile (!(diff === 0)) {\n\t\t\tif ((diff & pixMask) !== 0) {\n\t\t\t\t++bitCount;\n\t\t\t}\n\t\t\tdiff = SHR(diff, destDepth);\n\t\t}\n\t\treturn destinationWord;\n\t}\n\tif (destDepth === 16) {\n\t\tdiff = partitionedSubfromnBitsnPartitions(sourceWord, destinationWord, 5, 3);\n\t\tbitCount = ((bitCount + (diff & 31)) + ((diff >>> 5) & 31)) + ((diff >>> 10) & 31);\n\t\tdiff = partitionedSubfromnBitsnPartitions(sourceWord >>> 16, destinationWord >>> 16, 5, 3);\n\t\tbitCount = ((bitCount + (diff & 31)) + ((diff >>> 5) & 31)) + ((diff >>> 10) & 31);\n\t} else {\n\t\tdiff = partitionedSubfromnBitsnPartitions(sourceWord, destinationWord, 8, 3);\n\t\tbitCount = ((bitCount + (diff & 255)) + ((diff >>> 8) & 255)) + ((diff >>> 16) & 255);\n\t}\n\treturn destinationWord;\n}\n\n\n/*\tTally pixels into the color map. Note that the source should be \n\tspecified = destination, in order for the proper color map checks \n\tto be performed at setup.\n\tNote that the region is not clipped to bit boundaries, but only to the\n\tnearest (enclosing) word. This is because copyLoop does not do\n\tpre-merge masking. For accurate results, you must subtract the\n\tvalues obtained from the left and right fringes. */\n\nfunction OLDtallyIntoMapwith(sourceWord, destinationWord) {\n\tvar pixMask;\n\tvar mapIndex;\n\tvar i;\n\tvar shiftWord;\n\n\tif ((cmFlags & (ColorMapPresent | ColorMapIndexedPart)) !== (ColorMapPresent | ColorMapIndexedPart)) {\n\t\treturn destinationWord;\n\t}\n\tif (destDepth < 16) {\n\n\t\t/* loop through all packed pixels. */\n\n\t\tpixMask = maskTable[destDepth] & cmMask;\n\t\tshiftWord = destinationWord;\n\t\tfor (i = 1; i <= destPPW; i++) {\n\t\t\tmapIndex = shiftWord & pixMask;\n\t\t\ttallyMapAtput(mapIndex, tallyMapAt(mapIndex) + 1);\n\t\t\tshiftWord = SHR(shiftWord, destDepth);\n\t\t}\n\t\treturn destinationWord;\n\t}\n\tif (destDepth === 16) {\n\n\t\t/* Two pixels Tally the right half... */\n\n\t\tmapIndex = rgbMapfromto(destinationWord & 65535, 5, cmBitsPerColor);\n\t\ttallyMapAtput(mapIndex, tallyMapAt(mapIndex) + 1);\n\t\tmapIndex = rgbMapfromto(destinationWord >>> 16, 5, cmBitsPerColor);\n\t\ttallyMapAtput(mapIndex, tallyMapAt(mapIndex) + 1);\n\t} else {\n\n\t\t/* Just one pixel. */\n\n\t\tmapIndex = rgbMapfromto(destinationWord, 8, cmBitsPerColor);\n\t\ttallyMapAtput(mapIndex, tallyMapAt(mapIndex) + 1);\n\t}\n\treturn destinationWord;\n}\n\nfunction addWordwith(sourceWord, destinationWord) {\n\treturn sourceWord + destinationWord;\n}\n\n\n/*\tBlend sourceWord with destinationWord, assuming both are 32-bit pixels.\n\tThe source is assumed to have 255*alpha in the high 8 bits of each pixel,\n\twhile the high 8 bits of the destinationWord will be ignored.\n\tThe blend produced is alpha*source + (1-alpha)*dest, with\n\tthe computation being performed independently on each color\n\tcomponent. The high byte of the result will be 0. */\n\nfunction alphaBlendwith(sourceWord, destinationWord) {\n\tvar unAlpha;\n\tvar blendRB;\n\tvar blendAG;\n\tvar result;\n\tvar alpha;\n\n\n\t/* High 8 bits of source pixel */\n\n\talpha = sourceWord >>> 24;\n\tif (alpha === 0) {\n\t\treturn destinationWord;\n\t}\n\tif (alpha === 255) {\n\t\treturn sourceWord;\n\t}\n\tunAlpha = 255 - alpha;\n\n\t/* blend red and blue */\n\n\tblendRB = (((sourceWord & 16711935) * alpha) + ((destinationWord & 16711935) * unAlpha)) + 16711935;\n\n\t/* blend alpha and green */\n\n\tblendAG = (((((sourceWord >>> 8) | 16711680) & 16711935) * alpha) + (((destinationWord >>> 8) & 16711935) * unAlpha)) + 16711935;\n\n\t/* divide by 255 */\n\n\tblendRB = ((blendRB + (((blendRB - 65537) >>> 8) & 16711935)) >>> 8) & 16711935;\n\tblendAG = ((blendAG + (((blendAG - 65537) >>> 8) & 16711935)) >>> 8) & 16711935;\n\tresult = blendRB | (blendAG << 8);\n\treturn result;\n}\n\nfunction alphaBlendConstwith(sourceWord, destinationWord) {\n\treturn alphaBlendConstwithpaintMode(sourceWord, destinationWord, false);\n}\n\n\n/*\tBlend sourceWord with destinationWord using a constant alpha.\n\tAlpha is encoded as 0 meaning 0.0, and 255 meaning 1.0.\n\tThe blend produced is alpha*source + (1.0-alpha)*dest, with the\n\tcomputation being performed independently on each color component.\n\tThis function could eventually blend into any depth destination,\n\tusing the same color averaging and mapping as warpBlt.\n\tpaintMode = true means do nothing if the source pixel value is zero. */\n/*\tThis first implementation works with dest depths of 16 and 32 bits only.\n\tNormal color mapping will allow sources of lower depths in this case,\n\tand results can be mapped directly by truncation, so no extra color maps are needed.\n\tTo allow storing into any depth will require subsequent addition of two other\n\tcolormaps, as is the case with WarpBlt. */\n\nfunction alphaBlendConstwithpaintMode(sourceWord, destinationWord, paintMode) {\n\tvar rgbMask;\n\tvar pixMask;\n\tvar pixBlend;\n\tvar j;\n\tvar sourceShifted;\n\tvar result;\n\tvar shift;\n\tvar sourcePixVal;\n\tvar i;\n\tvar unAlpha;\n\tvar destPixVal;\n\tvar blendRB;\n\tvar blendAG;\n\tvar bitsPerColor;\n\tvar blend;\n\tvar destShifted;\n\tvar maskShifted;\n\n\tif (destDepth < 16) {\n\t\treturn destinationWord;\n\t}\n\tunAlpha = 255 - sourceAlpha;\n\tresult = destinationWord;\n\tif (destPPW === 1) {\n\n\t\t/* 32bpp blends include alpha */\n\n\t\tif (!(paintMode && (sourceWord === 0))) {\n\n\t\t\t/* painting a transparent pixel */\n\n\n\t\t\t/* blendRB red and blue */\n\n\t\t\tblendRB = (((sourceWord & 16711935) * sourceAlpha) + ((destinationWord & 16711935) * unAlpha)) + 16711935;\n\n\t\t\t/* blendRB alpha and green */\n\n\t\t\tblendAG = ((((sourceWord >>> 8) & 16711935) * sourceAlpha) + (((destinationWord >>> 8) & 16711935) * unAlpha)) + 16711935;\n\n\t\t\t/* divide by 255 */\n\n\t\t\tblendRB = ((blendRB + (((blendRB - 65537) >>> 8) & 16711935)) >>> 8) & 16711935;\n\t\t\tblendAG = ((blendAG + (((blendAG - 65537) >>> 8) & 16711935)) >>> 8) & 16711935;\n\t\t\tresult = blendRB | (blendAG << 8);\n\t\t}\n\t} else {\n\t\tpixMask = maskTable[destDepth];\n\t\tbitsPerColor = 5;\n\t\trgbMask = 31;\n\t\tmaskShifted = destMask;\n\t\tdestShifted = destinationWord;\n\t\tsourceShifted = sourceWord;\n\t\tfor (j = 1; j <= destPPW; j++) {\n\t\t\tsourcePixVal = sourceShifted & pixMask;\n\t\t\tif (!(((maskShifted & pixMask) === 0) || (paintMode && (sourcePixVal === 0)))) {\n\t\t\t\tdestPixVal = destShifted & pixMask;\n\t\t\t\tpixBlend = 0;\n\t\t\t\tfor (i = 1; i <= 3; i++) {\n\t\t\t\t\tshift = (i - 1) * bitsPerColor;\n\t\t\t\t\tblend = (DIV((((((SHR(sourcePixVal, shift)) & rgbMask) * sourceAlpha) + (((SHR(destPixVal, shift)) & rgbMask) * unAlpha)) + 254), 255)) & rgbMask;\n\t\t\t\t\tpixBlend = pixBlend | (SHL(blend, shift));\n\t\t\t\t}\n\t\t\t\tresult = (result & ~(SHL(pixMask, ((j - 1) * 16)))) | (SHL(pixBlend, ((j - 1) * 16)));\n\t\t\t}\n\t\t\tmaskShifted = SHR(maskShifted, destDepth);\n\t\t\tsourceShifted = SHR(sourceShifted, destDepth);\n\t\t\tdestShifted = SHR(destShifted, destDepth);\n\t\t}\n\t}\n\treturn result;\n}\n\n\n/*\tBlend sourceWord with destinationWord using the alpha value from sourceWord.\n\tAlpha is encoded as 0 meaning 0.0, and 255 meaning 1.0.\n\tIn contrast to alphaBlend:with: the color produced is\n\n\t\tsrcColor + (1-srcAlpha) * dstColor\n\n\te.g., it is assumed that the source color is already scaled. */\n\nfunction alphaBlendScaledwith(sourceWord, destinationWord) {\n\tvar unAlpha;\n\tvar rb;\n\tvar ag;\n\n\n\t/* Do NOT inline this into optimized loops */\n\n\n\t/* High 8 bits of source pixel is source opacity (ARGB format) */\n\n\tunAlpha = 255 - (sourceWord >>> 24);\n\n\t/* blend red and blue components */\n\n\trb = ((((destinationWord & 16711935) * unAlpha) >>> 8) & 16711935) + (sourceWord & 16711935);\n\n\t/* blend alpha and green components */\n\n\tag = (((((destinationWord >>> 8) & 16711935) * unAlpha) >>> 8) & 16711935) + ((sourceWord >>> 8) & 16711935);\n\n\t/* saturate red and blue components if there is a carry */\n\n\trb = (rb & 16711935) | (((rb & 16777472) * 255) >>> 8);\n\n\t/* saturate alpha and green components if there is a carry */\n\n\tag = ((ag & 16711935) << 8) | ((ag & 16777472) * 255);\n\treturn ag | rb;\n}\n\nfunction alphaPaintConstwith(sourceWord, destinationWord) {\n\tif (sourceWord === 0) {\n\t\treturn destinationWord;\n\t}\n\treturn alphaBlendConstwithpaintMode(sourceWord, destinationWord, true);\n}\n\n\n/*\tThis version assumes \n\t\tcombinationRule = 34\n\t\tsourcePixSize = 32\n\t\tdestPixSize = 16\n\t\tsourceForm ~= destForm.\n\t */\n\nfunction alphaSourceBlendBits16() {\n\tvar ditherBase;\n\tvar ditherThreshold;\n\tvar srcShift;\n\tvar sourceWord;\n\tvar srcIndex;\n\tvar deltaX;\n\tvar dstIndex;\n\tvar srcAlpha;\n\tvar dstMask;\n\tvar deltaY;\n\tvar srcY;\n\tvar destWord;\n\tvar dstY;\n\tvar ditherIndex;\n\n\n\t/* This particular method should be optimized in itself */\n\n\n\t/* So we can pre-decrement */\n\n\tdeltaY = bbH + 1;\n\tsrcY = sy;\n\tdstY = dy;\n\tsrcShift = (dx & 1) * 16;\n\tif (destMSB) {\n\t\tsrcShift = 16 - srcShift;\n\t}\n\n\t/* This is the outer loop */\n\n\tmask1 = SHL(65535, (16 - srcShift));\n\twhile (((--deltaY)) !== 0) {\n\t\tsrcIndex = ((srcY * sourcePitch)) + (sx * 4);\n\t\tdstIndex = ((dstY * destPitch)) + ((dx >> 1) * 4);\n\t\tditherBase = (dstY & 3) * 4;\n\n\t\t/* For pre-increment */\n\n\t\tditherIndex = (sx & 3) - 1;\n\n\t\t/* So we can pre-decrement */\n\n\t\tdeltaX = bbW + 1;\n\t\tdstMask = mask1;\n\t\tif (dstMask === 65535) {\n\t\t\tsrcShift = 16;\n\t\t} else {\n\t\t\tsrcShift = 0;\n\t\t}\n\t\twhile (((--deltaX)) !== 0) {\n\t\t\tditherThreshold = ditherMatrix4x4[ditherBase + ((ditherIndex = (ditherIndex + 1) & 3))];\n\t\t\tsourceWord = sourceBits[srcIndex >>> 2];\n\t\t\tsrcAlpha = sourceWord >>> 24;\n\t\t\tif (srcAlpha === 255) {\n\n\t\t\t\t/* Dither from 32 to 16 bit */\n\n\t\t\t\tsourceWord = dither32To16threshold(sourceWord, ditherThreshold);\n\t\t\t\tif (sourceWord === 0) {\n\t\t\t\t\tsourceWord = SHL(1, srcShift);\n\t\t\t\t} else {\n\t\t\t\t\tsourceWord = SHL(sourceWord, srcShift);\n\t\t\t\t}\n\t\t\t\tdstLongAtputmask(dstIndex, sourceWord, dstMask);\n\t\t\t} else {\n\n\t\t\t\t/* srcAlpha ~= 255 */\n\n\t\t\t\tif (srcAlpha !== 0) {\n\n\t\t\t\t\t/* 0 < srcAlpha < 255 */\n\t\t\t\t\t/* If we have to mix colors then just copy a single word */\n\n\t\t\t\t\tdestWord = destBits[dstIndex >>> 2];\n\t\t\t\t\tdestWord = destWord & ~dstMask;\n\n\t\t\t\t\t/* Expand from 16 to 32 bit by adding zero bits */\n\n\t\t\t\t\tdestWord = SHR(destWord, srcShift);\n\n\t\t\t\t\t/* Mix colors */\n\n\t\t\t\t\tdestWord = (((destWord & 31744) << 9) | ((destWord & 992) << 6)) | (((destWord & 31) << 3) | 4278190080);\n\n\t\t\t\t\t/* And dither */\n\n\t\t\t\t\tsourceWord = alphaBlendScaledwith(sourceWord, destWord);\n\t\t\t\t\tsourceWord = dither32To16threshold(sourceWord, ditherThreshold);\n\t\t\t\t\tif (sourceWord === 0) {\n\t\t\t\t\t\tsourceWord = SHL(1, srcShift);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsourceWord = SHL(sourceWord, srcShift);\n\t\t\t\t\t}\n\t\t\t\t\tdstLongAtputmask(dstIndex, sourceWord, dstMask);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsrcIndex += 4;\n\t\t\tif (destMSB) {\n\t\t\t\tif (srcShift === 0) {\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (srcShift !== 0) {\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Toggle between 0 and 16 */\n\n\t\t\tsrcShift = srcShift ^ 16;\n\t\t\tdstMask = ~dstMask;\n\t\t}\n\t\t++srcY;\n\t\t++dstY;\n\t}\n}\n\n\n/*\tThis version assumes \n\t\tcombinationRule = 34\n\t\tsourcePixSize = destPixSize = 32\n\t\tsourceForm ~= destForm.\n\tNote: The inner loop has been optimized for dealing\n\t\twith the special cases of srcAlpha = 0.0 and srcAlpha = 1.0 \n\t */\n\nfunction alphaSourceBlendBits32() {\n\tvar sourceWord;\n\tvar srcIndex;\n\tvar deltaX;\n\tvar dstIndex;\n\tvar srcAlpha;\n\tvar deltaY;\n\tvar srcY;\n\tvar destWord;\n\tvar dstY;\n\n\n\t/* This particular method should be optimized in itself */\n\t/* Give the compile a couple of hints */\n\t/* The following should be declared as pointers so the compiler will\n\tnotice that they're used for accessing memory locations \n\t(good to know on an Intel architecture) but then the increments\n\twould be different between ST code and C code so must hope the\n\tcompiler notices what happens (MS Visual C does) */\n\n\n\t/* So we can pre-decrement */\n\n\tdeltaY = bbH + 1;\n\tsrcY = sy;\n\n\t/* This is the outer loop */\n\n\tdstY = dy;\n\twhile (((--deltaY)) !== 0) {\n\t\tsrcIndex = ((srcY * sourcePitch)) + (sx * 4);\n\t\tdstIndex = ((dstY * destPitch)) + (dx * 4);\n\n\t\t/* So we can pre-decrement */\n\t\t/* This is the inner loop */\n\n\t\tdeltaX = bbW + 1;\n\t\twhile (((--deltaX)) !== 0) {\n\t\t\tsourceWord = sourceBits[srcIndex >>> 2];\n\t\t\tsrcAlpha = sourceWord >>> 24;\n\t\t\tif (srcAlpha === 255) {\n\t\t\t\tdestBits[dstIndex >>> 2] = sourceWord;\n\t\t\t\tsrcIndex += 4;\n\n\t\t\t\t/* Now copy as many words as possible with alpha = 255 */\n\n\t\t\t\tdstIndex += 4;\n\t\t\t\twhile ((((--deltaX)) !== 0) && ((((sourceWord = sourceBits[srcIndex >>> 2])) >>> 24) === 255)) {\n\t\t\t\t\tdestBits[dstIndex >>> 2] = sourceWord;\n\t\t\t\t\tsrcIndex += 4;\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t}\n\t\t\t\t++deltaX;\n\t\t\t} else {\n\n\t\t\t\t/* srcAlpha ~= 255 */\n\n\t\t\t\tif (srcAlpha === 0) {\n\t\t\t\t\tsrcIndex += 4;\n\n\t\t\t\t\t/* Now skip as many words as possible, */\n\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t\twhile ((((--deltaX)) !== 0) && ((((sourceWord = sourceBits[srcIndex >>> 2])) >>> 24) === 0)) {\n\t\t\t\t\t\tsrcIndex += 4;\n\t\t\t\t\t\tdstIndex += 4;\n\t\t\t\t\t}\n\t\t\t\t\t++deltaX;\n\t\t\t\t} else {\n\n\t\t\t\t\t/* 0 < srcAlpha < 255 */\n\t\t\t\t\t/* If we have to mix colors then just copy a single word */\n\n\t\t\t\t\tdestWord = destBits[dstIndex >>> 2];\n\t\t\t\t\tdestWord = alphaBlendScaledwith(sourceWord, destWord);\n\t\t\t\t\tdestBits[dstIndex >>> 2] = destWord;\n\t\t\t\t\tsrcIndex += 4;\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t++srcY;\n\t\t++dstY;\n\t}\n}\n\n\n/*\tThis version assumes \n\t\tcombinationRule = 34\n\t\tsourcePixSize = 32\n\t\tdestPixSize = 8\n\t\tsourceForm ~= destForm.\n\tNote: This is not real blending since we don't have the source colors available.\n\t */\n\nfunction alphaSourceBlendBits8() {\n\tvar srcShift;\n\tvar sourceWord;\n\tvar srcIndex;\n\tvar deltaX;\n\tvar mappingTable;\n\tvar dstIndex;\n\tvar adjust;\n\tvar mapperFlags;\n\tvar srcAlpha;\n\tvar dstMask;\n\tvar deltaY;\n\tvar srcY;\n\tvar destWord;\n\tvar dstY;\n\n\tmappingTable = default8To32Table();\n\tmapperFlags = cmFlags & ~ColorMapNewStyle;\n\n\t/* So we can pre-decrement */\n\n\tdeltaY = bbH + 1;\n\tsrcY = sy;\n\tdstY = dy;\n\tmask1 = (dx & 3) * 8;\n\tif (destMSB) {\n\t\tmask1 = 24 - mask1;\n\t}\n\tmask2 = AllOnes ^ (SHL(255, mask1));\n\tif ((dx & 1) === 0) {\n\t\tadjust = 0;\n\t} else {\n\t\tadjust = 522133279;\n\t}\n\tif ((dy & 1) === 0) {\n\t\tadjust = adjust ^ 522133279;\n\t}\n\twhile (((--deltaY)) !== 0) {\n\t\tadjust = adjust ^ 522133279;\n\t\tsrcIndex = ((srcY * sourcePitch)) + (sx * 4);\n\t\tdstIndex = ((dstY * destPitch)) + ((dx >> 2) * 4);\n\n\t\t/* So we can pre-decrement */\n\n\t\tdeltaX = bbW + 1;\n\t\tsrcShift = mask1;\n\n\t\t/* This is the inner loop */\n\n\t\tdstMask = mask2;\n\t\twhile (((--deltaX)) !== 0) {\n\t\t\tsourceWord = (sourceBits[srcIndex >>> 2] & ~adjust) + adjust;\n\t\t\tsrcAlpha = sourceWord >>> 24;\n\t\t\tif (srcAlpha > 31) {\n\n\t\t\t\t/* Everything below 31 is transparent */\n\n\t\t\t\tif (srcAlpha < 224) {\n\n\t\t\t\t\t/* Everything above 224 is opaque */\n\n\t\t\t\t\tdestWord = destBits[dstIndex >>> 2];\n\t\t\t\t\tdestWord = destWord & ~dstMask;\n\t\t\t\t\tdestWord = SHR(destWord, srcShift);\n\t\t\t\t\tdestWord = mappingTable[destWord];\n\t\t\t\t\tsourceWord = alphaBlendScaledwith(sourceWord, destWord);\n\t\t\t\t}\n\t\t\t\tsourceWord = mapPixelflags(sourceWord, mapperFlags);\n\n\t\t\t\t/* Store back */\n\n\t\t\t\tsourceWord = SHL(sourceWord, srcShift);\n\t\t\t\tdstLongAtputmask(dstIndex, sourceWord, dstMask);\n\t\t\t}\n\t\t\tsrcIndex += 4;\n\t\t\tif (destMSB) {\n\t\t\t\tif (srcShift === 0) {\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t\tsrcShift = 24;\n\t\t\t\t\tdstMask = 16777215;\n\t\t\t\t} else {\n\t\t\t\t\tsrcShift -= 8;\n\t\t\t\t\tdstMask = (dstMask >>> 8) | 4278190080;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (srcShift === 24) {\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t\tsrcShift = 0;\n\t\t\t\t\tdstMask = 4294967040;\n\t\t\t\t} else {\n\t\t\t\t\tsrcShift += 8;\n\t\t\t\t\tdstMask = (dstMask << 8) | 255;\n\t\t\t\t}\n\t\t\t}\n\t\t\tadjust = adjust ^ 522133279;\n\t\t}\n\t\t++srcY;\n\t\t++dstY;\n\t}\n}\n\nfunction bitAndwith(sourceWord, destinationWord) {\n\treturn sourceWord & destinationWord;\n}\n\nfunction bitAndInvertwith(sourceWord, destinationWord) {\n\treturn sourceWord & ~destinationWord;\n}\n\nfunction bitInvertAndwith(sourceWord, destinationWord) {\n\treturn ~sourceWord & destinationWord;\n}\n\nfunction bitInvertAndInvertwith(sourceWord, destinationWord) {\n\treturn ~sourceWord & ~destinationWord;\n}\n\nfunction bitInvertDestinationwith(sourceWord, destinationWord) {\n\treturn ~destinationWord;\n}\n\nfunction bitInvertOrwith(sourceWord, destinationWord) {\n\treturn ~sourceWord | destinationWord;\n}\n\nfunction bitInvertOrInvertwith(sourceWord, destinationWord) {\n\treturn ~sourceWord | ~destinationWord;\n}\n\nfunction bitInvertSourcewith(sourceWord, destinationWord) {\n\treturn ~sourceWord;\n}\n\nfunction bitInvertXorwith(sourceWord, destinationWord) {\n\treturn ~sourceWord ^ destinationWord;\n}\n\nfunction bitOrwith(sourceWord, destinationWord) {\n\treturn sourceWord | destinationWord;\n}\n\nfunction bitOrInvertwith(sourceWord, destinationWord) {\n\treturn sourceWord | ~destinationWord;\n}\n\nfunction bitXorwith(sourceWord, destinationWord) {\n\treturn sourceWord ^ destinationWord;\n}\n\n\n/*\tcheck for possible overlap of source and destination */\n/*\tar 10/19/1999: This method requires surfaces to be locked. */\n\nfunction checkSourceOverlap() {\n\tvar t;\n\n\tif ((sourceForm === destForm) && (dy >= sy)) {\n\t\tif (dy > sy) {\n\n\t\t\t/* have to start at bottom */\n\n\t\t\tvDir = -1;\n\t\t\tsy = (sy + bbH) - 1;\n\t\t\tdy = (dy + bbH) - 1;\n\t\t} else {\n\t\t\tif ((dy === sy) && (dx > sx)) {\n\n\t\t\t\t/* y's are equal, but x's are backward */\n\n\t\t\t\thDir = -1;\n\n\t\t\t\t/* start at right */\n\n\t\t\t\tsx = (sx + bbW) - 1;\n\n\t\t\t\t/* and fix up masks */\n\n\t\t\t\tdx = (dx + bbW) - 1;\n\t\t\t\tif (nWords > 1) {\n\t\t\t\t\tt = mask1;\n\t\t\t\t\tmask1 = mask2;\n\t\t\t\t\tmask2 = t;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdestIndex = ((dy * destPitch)) + ((DIV(dx, destPPW)) * 4);\n\t\tdestDelta = (destPitch * vDir) - (4 * (nWords * hDir));\n\t}\n}\n\nfunction clearWordwith(source, destination) {\n\treturn 0;\n}\n\n\n/*\tclip and adjust source origin and extent appropriately */\n/*\tfirst in x */\n\nfunction clipRange() {\n\tif (destX >= clipX) {\n\t\tsx = sourceX;\n\t\tdx = destX;\n\t\tbbW = width;\n\t} else {\n\t\tsx = sourceX + (clipX - destX);\n\t\tbbW = width - (clipX - destX);\n\t\tdx = clipX;\n\t}\n\tif ((dx + bbW) > (clipX + clipWidth)) {\n\t\tbbW -= (dx + bbW) - (clipX + clipWidth);\n\t}\n\tif (destY >= clipY) {\n\t\tsy = sourceY;\n\t\tdy = destY;\n\t\tbbH = height;\n\t} else {\n\t\tsy = (sourceY + clipY) - destY;\n\t\tbbH = height - (clipY - destY);\n\t\tdy = clipY;\n\t}\n\tif ((dy + bbH) > (clipY + clipHeight)) {\n\t\tbbH -= (dy + bbH) - (clipY + clipHeight);\n\t}\n\tif (noSource) {\n\t\treturn null;\n\t}\n\tif (sx < 0) {\n\t\tdx -= sx;\n\t\tbbW += sx;\n\t\tsx = 0;\n\t}\n\tif ((sx + bbW) > sourceWidth) {\n\t\tbbW -= (sx + bbW) - sourceWidth;\n\t}\n\tif (sy < 0) {\n\t\tdy -= sy;\n\t\tbbH += sy;\n\t\tsy = 0;\n\t}\n\tif ((sy + bbH) > sourceHeight) {\n\t\tbbH -= (sy + bbH) - sourceHeight;\n\t}\n}\n\n\n/*\tThis function is exported for the Balloon engine */\n\nfunction copyBits() {\n\tclipRange();\n\tif ((bbW <= 0) || (bbH <= 0)) {\n\n\t\t/* zero width or height; noop */\n\n\t\taffectedL = (affectedR = (affectedT = (affectedB = 0)));\n\t\treturn null;\n\t}\n\tif (!lockSurfaces()) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\t// skipping ifdef ENABLE_FAST_BLT\n\tcopyBitsLockedAndClipped();\n\n\tunlockSurfaces();\n}\n\n\n/*\tRecover from the fast path specialised code saying Help-I-cant-cope */\n\nfunction copyBitsFallback(op, flags) {\n\tvar done;\n\n\t// skipping ifdef ENABLE_FAST_BLT\n}\n\n\n/*\tPerform the actual copyBits operation using the fast path specialised code; fail some cases by falling back to normal code.\n\tAssume: Surfaces have been locked and clipping was performed. */\n\nfunction copyBitsFastPathSpecialised() {\n\t// skipping ifdef ENABLE_FAST_BLT\n}\n\n\n/*\tSupport for the balloon engine. */\n\nfunction copyBitsFromtoat(startX, stopX, yValue) {\n\tdestX = startX;\n\tdestY = yValue;\n\tsourceX = startX;\n\twidth = stopX - startX;\n\tcopyBits();\n\tshowDisplayBits();\n}\n\n\n/*\tPerform the actual copyBits operation.\n\tAssume: Surfaces have been locked and clipping was performed. */\n\nfunction copyBitsLockedAndClipped() {\n\tvar done;\n\n\tcopyBitsRule41Test();\n\tif (interpreterProxy.failed()) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdone = tryCopyingBitsQuickly();\n\tif (done) {\n\t\treturn null;\n\t}\n\tif ((combinationRule === 30) || (combinationRule === 31)) {\n\n\t\t/* Check and fetch source alpha parameter for alpha blend */\n\n\t\tif (interpreterProxy.methodArgumentCount() === 1) {\n\t\t\tsourceAlpha = interpreterProxy.stackIntegerValue(0);\n\t\t\tif (!(!interpreterProxy.failed() && ((sourceAlpha >= 0) && (sourceAlpha <= 255)))) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t} else {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t}\n\n\t/* Choose and perform the actual copy loop. */\n\n\tbitCount = 0;\n\tperformCopyLoop();\n\tif ((combinationRule === 22) || (combinationRule === 32)) {\n\n\t\t/* zero width and height; return the count */\n\n\t\taffectedL = (affectedR = (affectedT = (affectedB = 0)));\n\t}\n\tif (hDir > 0) {\n\t\taffectedL = dx;\n\t\taffectedR = dx + bbW;\n\t} else {\n\t\taffectedL = (dx - bbW) + 1;\n\t\taffectedR = dx + 1;\n\t}\n\tif (vDir > 0) {\n\t\taffectedT = dy;\n\t\taffectedB = dy + bbH;\n\t} else {\n\t\taffectedT = (dy - bbH) + 1;\n\t\taffectedB = dy + 1;\n\t}\n}\n\n\n/*\tTest possible use of rule 41, rgbComponentAlpha:with: Nothing to return, just set up some variables */\n\nfunction copyBitsRule41Test() {\n\tvar ungammaLookupTableOop;\n\tvar gammaLookupTableOop;\n\n\tif (combinationRule === 41) {\n\n\t\t/* fetch the forecolor into componentAlphaModeColor. */\n\n\t\tcomponentAlphaModeAlpha = 255;\n\t\tcomponentAlphaModeColor = 16777215;\n\t\tgammaLookupTable = null;\n\t\tungammaLookupTable = null;\n\t\tif (interpreterProxy.methodArgumentCount() >= 2) {\n\t\t\tcomponentAlphaModeAlpha = interpreterProxy.stackIntegerValue(interpreterProxy.methodArgumentCount() - 2);\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tcomponentAlphaModeColor = interpreterProxy.stackIntegerValue(interpreterProxy.methodArgumentCount() - 1);\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tif (interpreterProxy.methodArgumentCount() === 4) {\n\t\t\t\tgammaLookupTableOop = interpreterProxy.stackObjectValue(1);\n\t\t\t\tif (interpreterProxy.isBytes(gammaLookupTableOop)) {\n\t\t\t\t\tgammaLookupTable = gammaLookupTableOop.bytes;\n\t\t\t\t}\n\t\t\t\tungammaLookupTableOop = interpreterProxy.stackObjectValue(0);\n\t\t\t\tif (interpreterProxy.isBytes(ungammaLookupTableOop)) {\n\t\t\t\t\tungammaLookupTable = ungammaLookupTableOop.bytes;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (interpreterProxy.methodArgumentCount() === 1) {\n\t\t\t\tcomponentAlphaModeColor = interpreterProxy.stackIntegerValue(0);\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/*\tThis version of the inner loop assumes noSource = false. */\n\nfunction copyLoop() {\n\tvar mergeWord;\n\tvar skewWord;\n\tvar skewMask;\n\tvar halftoneWord;\n\tvar unskew;\n\tvar mergeFnwith;\n\tvar hInc;\n\tvar destWord;\n\tvar word;\n\tvar prevWord;\n\tvar y;\n\tvar i;\n\tvar thisWord;\n\tvar notSkewMask;\n\n\tmergeFnwith = opTable[combinationRule + 1];\n\tmergeFnwith;\n\n\t/* Byte delta */\n\t/* degenerate skew fixed for Sparc. 10/20/96 ikp */\n\n\thInc = hDir * 4;\n\tif (skew === -32) {\n\t\tskew = (unskew = (skewMask = 0));\n\t} else {\n\t\tif (skew < 0) {\n\t\t\tunskew = skew + 32;\n\t\t\tskewMask = SHL(AllOnes, (0 - skew));\n\t\t} else {\n\t\t\tif (skew === 0) {\n\t\t\t\tunskew = 0;\n\t\t\t\tskewMask = AllOnes;\n\t\t\t} else {\n\t\t\t\tunskew = skew - 32;\n\t\t\t\tskewMask = SHR(AllOnes, skew);\n\t\t\t}\n\t\t}\n\t}\n\tnotSkewMask = ~skewMask;\n\tif (noHalftone) {\n\t\thalftoneWord = AllOnes;\n\t\thalftoneHeight = 0;\n\t} else {\n\t\thalftoneWord = halftoneAt(0);\n\t}\n\ty = dy;\n\tfor (i = 1; i <= bbH; i++) {\n\n\t\t/* here is the vertical loop */\n\n\t\tif (halftoneHeight > 1) {\n\n\t\t\t/* Otherwise, its always the same */\n\n\t\t\thalftoneWord = halftoneAt(y);\n\t\t\ty += vDir;\n\t\t}\n\t\tif (preload) {\n\n\t\t\t/* load the 64-bit shifter */\n\n\t\t\tprevWord = sourceBits[sourceIndex >>> 2];\n\t\t\tsourceIndex += hInc;\n\t\t} else {\n\t\t\tprevWord = 0;\n\t\t}\n\t\tdestMask = mask1;\n\n\t\t/* pick up next word */\n\n\t\tthisWord = sourceBits[sourceIndex >>> 2];\n\t\tsourceIndex += hInc;\n\n\t\t/* 32-bit rotate */\n\n\t\tskewWord = (SHIFT((prevWord & notSkewMask), unskew)) | (SHIFT((thisWord & skewMask), skew));\n\t\tprevWord = thisWord;\n\t\tdestWord = destBits[destIndex >>> 2];\n\t\tmergeWord = mergeFnwith(skewWord & halftoneWord, destWord);\n\t\tdestWord = (destMask & mergeWord) | (destWord & ~destMask);\n\t\tdestBits[destIndex >>> 2] = destWord;\n\n\t\t/* This central horizontal loop requires no store masking */\n\n\t\tdestIndex += hInc;\n\t\tdestMask = AllOnes;\n\t\tif (combinationRule === 3) {\n\t\t\tif ((skew === 0) && (halftoneWord === AllOnes)) {\n\n\t\t\t\t/* Very special inner loop for STORE mode with no skew -- just move words */\n\n\t\t\t\tif (hDir === -1) {\n\n\t\t\t\t\t/* Woeful patch: revert to older code for hDir = -1 */\n\n\t\t\t\t\tfor (word = 2; word <= (nWords - 1); word++) {\n\t\t\t\t\t\tthisWord = sourceBits[sourceIndex >>> 2];\n\t\t\t\t\t\tsourceIndex += hInc;\n\t\t\t\t\t\tdestBits[destIndex >>> 2] = thisWord;\n\t\t\t\t\t\tdestIndex += hInc;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (word = 2; word <= (nWords - 1); word++) {\n\n\t\t\t\t\t\t/* Note loop starts with prevWord loaded (due to preload) */\n\n\t\t\t\t\t\tdestBits[destIndex >>> 2] = prevWord;\n\t\t\t\t\t\tdestIndex += hInc;\n\t\t\t\t\t\tprevWord = sourceBits[sourceIndex >>> 2];\n\t\t\t\t\t\tsourceIndex += hInc;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t/* Special inner loop for STORE mode -- no need to call merge */\n\n\t\t\t\tfor (word = 2; word <= (nWords - 1); word++) {\n\t\t\t\t\tthisWord = sourceBits[sourceIndex >>> 2];\n\t\t\t\t\tsourceIndex += hInc;\n\n\t\t\t\t\t/* 32-bit rotate */\n\n\t\t\t\t\tskewWord = (SHIFT((prevWord & notSkewMask), unskew)) | (SHIFT((thisWord & skewMask), skew));\n\t\t\t\t\tprevWord = thisWord;\n\t\t\t\t\tdestBits[destIndex >>> 2] = skewWord & halftoneWord;\n\t\t\t\t\tdestIndex += hInc;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (word = 2; word <= (nWords - 1); word++) {\n\n\t\t\t\t/* Normal inner loop does merge: */\n\n\n\t\t\t\t/* pick up next word */\n\n\t\t\t\tthisWord = sourceBits[sourceIndex >>> 2];\n\t\t\t\tsourceIndex += hInc;\n\n\t\t\t\t/* 32-bit rotate */\n\n\t\t\t\tskewWord = (SHIFT((prevWord & notSkewMask), unskew)) | (SHIFT((thisWord & skewMask), skew));\n\t\t\t\tprevWord = thisWord;\n\t\t\t\tmergeWord = mergeFnwith(skewWord & halftoneWord, destBits[destIndex >>> 2]);\n\t\t\t\tdestBits[destIndex >>> 2] = mergeWord;\n\t\t\t\tdestIndex += hInc;\n\t\t\t}\n\t\t}\n\t\tif (nWords > 1) {\n\t\t\tdestMask = mask2;\n\n\t\t\t/* pick up next word */\n\n\t\t\tthisWord = sourceBits[sourceIndex >>> 2];\n\t\t\tsourceIndex += hInc;\n\n\t\t\t/* 32-bit rotate */\n\n\t\t\tskewWord = (SHIFT((prevWord & notSkewMask), unskew)) | (SHIFT((thisWord & skewMask), skew));\n\t\t\tdestWord = destBits[destIndex >>> 2];\n\t\t\tmergeWord = mergeFnwith(skewWord & halftoneWord, destWord);\n\t\t\tdestWord = (destMask & mergeWord) | (destWord & ~destMask);\n\t\t\tdestBits[destIndex >>> 2] = destWord;\n\t\t\tdestIndex += hInc;\n\t\t}\n\t\tsourceIndex += sourceDelta;\n\t\tdestIndex += destDelta;\n\t}\n}\n\n\n/*\tFaster copyLoop when source not used. hDir and vDir are both\n\tpositive, and perload and skew are unused */\n\nfunction copyLoopNoSource() {\n\tvar mergeWord;\n\tvar halftoneWord;\n\tvar mergeFnwith;\n\tvar destWord;\n\tvar word;\n\tvar i;\n\n\tmergeFnwith = opTable[combinationRule + 1];\n\tmergeFnwith;\n\tfor (i = 1; i <= bbH; i++) {\n\n\t\t/* here is the vertical loop */\n\n\t\tif (noHalftone) {\n\t\t\thalftoneWord = AllOnes;\n\t\t} else {\n\t\t\thalftoneWord = halftoneAt((dy + i) - 1);\n\t\t}\n\t\tdestMask = mask1;\n\t\tdestWord = destBits[destIndex >>> 2];\n\t\tmergeWord = mergeFnwith(halftoneWord, destWord);\n\t\tdestWord = (destMask & mergeWord) | (destWord & ~destMask);\n\t\tdestBits[destIndex >>> 2] = destWord;\n\n\t\t/* This central horizontal loop requires no store masking */\n\n\t\tdestIndex += 4;\n\t\tdestMask = AllOnes;\n\t\tif (combinationRule === 3) {\n\n\t\t\t/* Special inner loop for STORE */\n\n\t\t\tdestWord = halftoneWord;\n\t\t\tfor (word = 2; word <= (nWords - 1); word++) {\n\t\t\t\tdestBits[destIndex >>> 2] = destWord;\n\t\t\t\tdestIndex += 4;\n\t\t\t}\n\t\t} else {\n\n\t\t\t/* Normal inner loop does merge */\n\n\t\t\tfor (word = 2; word <= (nWords - 1); word++) {\n\n\t\t\t\t/* Normal inner loop does merge */\n\n\t\t\t\tdestWord = destBits[destIndex >>> 2];\n\t\t\t\tmergeWord = mergeFnwith(halftoneWord, destWord);\n\t\t\t\tdestBits[destIndex >>> 2] = mergeWord;\n\t\t\t\tdestIndex += 4;\n\t\t\t}\n\t\t}\n\t\tif (nWords > 1) {\n\t\t\tdestMask = mask2;\n\t\t\tdestWord = destBits[destIndex >>> 2];\n\t\t\tmergeWord = mergeFnwith(halftoneWord, destWord);\n\t\t\tdestWord = (destMask & mergeWord) | (destWord & ~destMask);\n\t\t\tdestBits[destIndex >>> 2] = destWord;\n\t\t\tdestIndex += 4;\n\t\t}\n\t\tdestIndex += destDelta;\n\t}\n}\n\n\n/*\tThis version of the inner loop maps source pixels\n\tto a destination form with different depth. Because it is already\n\tunweildy, the loop is not unrolled as in the other versions.\n\tPreload, skew and skewMask are all overlooked, since pickSourcePixels\n\tdelivers its destination word already properly aligned.\n\tNote that pickSourcePixels could be copied in-line at the top of\n\tthe horizontal loop, and some of its inits moved out of the loop. */\n/*\tar 12/7/1999:\n\tThe loop has been rewritten to use only one pickSourcePixels call.\n\tThe idea is that the call itself could be inlined. If we decide not\n\tto inline pickSourcePixels we could optimize the loop instead. */\n\nfunction copyLoopPixMap() {\n\tvar mapperFlags;\n\tvar srcShiftInc;\n\tvar dstShiftLeft;\n\tvar sourcePixMask;\n\tvar nSourceIncs;\n\tvar skewWord;\n\tvar words;\n\tvar destWord;\n\tvar startBits;\n\tvar mergeFnwith;\n\tvar dstShift;\n\tvar i;\n\tvar halftoneWord;\n\tvar mergeWord;\n\tvar destPixMask;\n\tvar dstShiftInc;\n\tvar srcShift;\n\tvar endBits;\n\tvar nPix;\n\tvar scrStartBits;\n\n\tmergeFnwith = opTable[combinationRule + 1];\n\tmergeFnwith;\n\tsourcePPW = DIV(32, sourceDepth);\n\tsourcePixMask = maskTable[sourceDepth];\n\tdestPixMask = maskTable[destDepth];\n\tmapperFlags = cmFlags & ~ColorMapNewStyle;\n\tsourceIndex = ((sy * sourcePitch)) + ((DIV(sx, sourcePPW)) * 4);\n\tscrStartBits = sourcePPW - (sx & (sourcePPW - 1));\n\tif (bbW < scrStartBits) {\n\t\tnSourceIncs = 0;\n\t} else {\n\t\tnSourceIncs = (DIV((bbW - scrStartBits), sourcePPW)) + 1;\n\t}\n\n\t/* Note following two items were already calculated in destmask setup! */\n\n\tsourceDelta = sourcePitch - (nSourceIncs * 4);\n\tstartBits = destPPW - (dx & (destPPW - 1));\n\tendBits = (((dx + bbW) - 1) & (destPPW - 1)) + 1;\n\tif (bbW < startBits) {\n\t\tstartBits = bbW;\n\t}\n\tsrcShift = (sx & (sourcePPW - 1)) * sourceDepth;\n\tdstShift = (dx & (destPPW - 1)) * destDepth;\n\tsrcShiftInc = sourceDepth;\n\tdstShiftInc = destDepth;\n\tdstShiftLeft = 0;\n\tif (sourceMSB) {\n\t\tsrcShift = (32 - sourceDepth) - srcShift;\n\t\tsrcShiftInc = 0 - srcShiftInc;\n\t}\n\tif (destMSB) {\n\t\tdstShift = (32 - destDepth) - dstShift;\n\t\tdstShiftInc = 0 - dstShiftInc;\n\t\tdstShiftLeft = 32 - destDepth;\n\t}\n\tfor (i = 1; i <= bbH; i++) {\n\n\t\t/* here is the vertical loop */\n\t\t/* *** is it possible at all that noHalftone == false? *** */\n\n\t\tif (noHalftone) {\n\t\t\thalftoneWord = AllOnes;\n\t\t} else {\n\t\t\thalftoneWord = halftoneAt((dy + i) - 1);\n\t\t}\n\t\tsrcBitShift = srcShift;\n\t\tdstBitShift = dstShift;\n\t\tdestMask = mask1;\n\n\t\t/* Here is the horizontal loop... */\n\n\t\tnPix = startBits;\n\t\twords = nWords;\n\t\tdo {\n\n\t\t\t/* pick up the word */\n\n\n\t\t\t/* align next word to leftmost pixel */\n\n\t\t\tskewWord = pickSourcePixelsflagssrcMaskdestMasksrcShiftIncdstShiftInc(nPix, mapperFlags, sourcePixMask, destPixMask, srcShiftInc, dstShiftInc);\n\t\t\tdstBitShift = dstShiftLeft;\n\t\t\tif (destMask === AllOnes) {\n\n\t\t\t\t/* avoid read-modify-write */\n\n\t\t\t\tmergeWord = mergeFnwith(skewWord & halftoneWord, destBits[destIndex >>> 2]);\n\t\t\t\tdestBits[destIndex >>> 2] = destMask & mergeWord;\n\t\t\t} else {\n\n\t\t\t\t/* General version using dest masking */\n\n\t\t\t\tdestWord = destBits[destIndex >>> 2];\n\t\t\t\tmergeWord = mergeFnwith(skewWord & halftoneWord, destWord & destMask);\n\t\t\t\tdestWord = (destMask & mergeWord) | (destWord & ~destMask);\n\t\t\t\tdestBits[destIndex >>> 2] = destWord;\n\t\t\t}\n\t\t\tdestIndex += 4;\n\t\t\tif (words === 2) {\n\n\t\t\t\t/* e.g., is the next word the last word? */\n\t\t\t\t/* set mask for last word in this row */\n\n\t\t\t\tdestMask = mask2;\n\t\t\t\tnPix = endBits;\n\t\t\t} else {\n\n\t\t\t\t/* use fullword mask for inner loop */\n\n\t\t\t\tdestMask = AllOnes;\n\t\t\t\tnPix = destPPW;\n\t\t\t}\n\t\t} while(!(((--words)) === 0));\n\t\tsourceIndex += sourceDelta;\n\t\tdestIndex += destDelta;\n\t}\n}\n\n\n/*\tReturn the default translation table from 1..8 bit indexed colors to 32bit */\n/*\tThe table has been generated by the following statements */\n/*\t| pvs hex |\n\tString streamContents:[:s|\n\t\ts nextPutAll:'static unsigned int theTable[256] = { '.\n\t\tpvs := (Color colorMapIfNeededFrom: 8 to: 32) asArray.\n\t\t1 to: pvs size do:[:i|\n\t\t\ti > 1 ifTrue:[s nextPutAll:', '].\n\t\t\t(i-1 \\\\ 8) = 0 ifTrue:[s cr].\n\t\t\ts nextPutAll:'0x'.\n\t\t\thex := (pvs at: i) printStringBase: 16.\n\t\t\ts nextPutAll: (hex copyFrom: 4 to: hex size).\n\t\t].\n\t\ts nextPutAll:'};'.\n\t]. */\n\nfunction default8To32Table() {\n\tvar theTable = [ \n0x0, 0xFF000001, 0xFFFFFFFF, 0xFF808080, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFF00FFFF, \n0xFFFFFF00, 0xFFFF00FF, 0xFF202020, 0xFF404040, 0xFF606060, 0xFF9F9F9F, 0xFFBFBFBF, 0xFFDFDFDF, \n0xFF080808, 0xFF101010, 0xFF181818, 0xFF282828, 0xFF303030, 0xFF383838, 0xFF484848, 0xFF505050, \n0xFF585858, 0xFF686868, 0xFF707070, 0xFF787878, 0xFF878787, 0xFF8F8F8F, 0xFF979797, 0xFFA7A7A7, \n0xFFAFAFAF, 0xFFB7B7B7, 0xFFC7C7C7, 0xFFCFCFCF, 0xFFD7D7D7, 0xFFE7E7E7, 0xFFEFEFEF, 0xFFF7F7F7, \n0xFF000001, 0xFF003300, 0xFF006600, 0xFF009900, 0xFF00CC00, 0xFF00FF00, 0xFF000033, 0xFF003333, \n0xFF006633, 0xFF009933, 0xFF00CC33, 0xFF00FF33, 0xFF000066, 0xFF003366, 0xFF006666, 0xFF009966, \n0xFF00CC66, 0xFF00FF66, 0xFF000099, 0xFF003399, 0xFF006699, 0xFF009999, 0xFF00CC99, 0xFF00FF99, \n0xFF0000CC, 0xFF0033CC, 0xFF0066CC, 0xFF0099CC, 0xFF00CCCC, 0xFF00FFCC, 0xFF0000FF, 0xFF0033FF, \n0xFF0066FF, 0xFF0099FF, 0xFF00CCFF, 0xFF00FFFF, 0xFF330000, 0xFF333300, 0xFF336600, 0xFF339900, \n0xFF33CC00, 0xFF33FF00, 0xFF330033, 0xFF333333, 0xFF336633, 0xFF339933, 0xFF33CC33, 0xFF33FF33, \n0xFF330066, 0xFF333366, 0xFF336666, 0xFF339966, 0xFF33CC66, 0xFF33FF66, 0xFF330099, 0xFF333399, \n0xFF336699, 0xFF339999, 0xFF33CC99, 0xFF33FF99, 0xFF3300CC, 0xFF3333CC, 0xFF3366CC, 0xFF3399CC, \n0xFF33CCCC, 0xFF33FFCC, 0xFF3300FF, 0xFF3333FF, 0xFF3366FF, 0xFF3399FF, 0xFF33CCFF, 0xFF33FFFF, \n0xFF660000, 0xFF663300, 0xFF666600, 0xFF669900, 0xFF66CC00, 0xFF66FF00, 0xFF660033, 0xFF663333, \n0xFF666633, 0xFF669933, 0xFF66CC33, 0xFF66FF33, 0xFF660066, 0xFF663366, 0xFF666666, 0xFF669966, \n0xFF66CC66, 0xFF66FF66, 0xFF660099, 0xFF663399, 0xFF666699, 0xFF669999, 0xFF66CC99, 0xFF66FF99, \n0xFF6600CC, 0xFF6633CC, 0xFF6666CC, 0xFF6699CC, 0xFF66CCCC, 0xFF66FFCC, 0xFF6600FF, 0xFF6633FF, \n0xFF6666FF, 0xFF6699FF, 0xFF66CCFF, 0xFF66FFFF, 0xFF990000, 0xFF993300, 0xFF996600, 0xFF999900, \n0xFF99CC00, 0xFF99FF00, 0xFF990033, 0xFF993333, 0xFF996633, 0xFF999933, 0xFF99CC33, 0xFF99FF33, \n0xFF990066, 0xFF993366, 0xFF996666, 0xFF999966, 0xFF99CC66, 0xFF99FF66, 0xFF990099, 0xFF993399, \n0xFF996699, 0xFF999999, 0xFF99CC99, 0xFF99FF99, 0xFF9900CC, 0xFF9933CC, 0xFF9966CC, 0xFF9999CC, \n0xFF99CCCC, 0xFF99FFCC, 0xFF9900FF, 0xFF9933FF, 0xFF9966FF, 0xFF9999FF, 0xFF99CCFF, 0xFF99FFFF, \n0xFFCC0000, 0xFFCC3300, 0xFFCC6600, 0xFFCC9900, 0xFFCCCC00, 0xFFCCFF00, 0xFFCC0033, 0xFFCC3333, \n0xFFCC6633, 0xFFCC9933, 0xFFCCCC33, 0xFFCCFF33, 0xFFCC0066, 0xFFCC3366, 0xFFCC6666, 0xFFCC9966, \n0xFFCCCC66, 0xFFCCFF66, 0xFFCC0099, 0xFFCC3399, 0xFFCC6699, 0xFFCC9999, 0xFFCCCC99, 0xFFCCFF99, \n0xFFCC00CC, 0xFFCC33CC, 0xFFCC66CC, 0xFFCC99CC, 0xFFCCCCCC, 0xFFCCFFCC, 0xFFCC00FF, 0xFFCC33FF, \n0xFFCC66FF, 0xFFCC99FF, 0xFFCCCCFF, 0xFFCCFFFF, 0xFFFF0000, 0xFFFF3300, 0xFFFF6600, 0xFFFF9900, \n0xFFFFCC00, 0xFFFFFF00, 0xFFFF0033, 0xFFFF3333, 0xFFFF6633, 0xFFFF9933, 0xFFFFCC33, 0xFFFFFF33, \n0xFFFF0066, 0xFFFF3366, 0xFFFF6666, 0xFFFF9966, 0xFFFFCC66, 0xFFFFFF66, 0xFFFF0099, 0xFFFF3399, \n0xFFFF6699, 0xFFFF9999, 0xFFFFCC99, 0xFFFFFF99, 0xFFFF00CC, 0xFFFF33CC, 0xFFFF66CC, 0xFFFF99CC, \n0xFFFFCCCC, 0xFFFFFFCC, 0xFFFF00FF, 0xFFFF33FF, 0xFFFF66FF, 0xFFFF99FF, 0xFFFFCCFF, 0xFFFFFFFF];;\n\n\treturn theTable;\n}\n\n\n/*\tUtility routine for computing Warp increments. */\n\nfunction deltaFromtonSteps(x1, x2, n) {\n\tif (x2 > x1) {\n\t\treturn (DIV(((x2 - x1) + FixedPt1), (n + 1))) + 1;\n\t} else {\n\t\tif (x2 === x1) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0 - ((DIV(((x1 - x2) + FixedPt1), (n + 1))) + 1);\n\t}\n}\n\n\n/*\tCompute masks for left and right destination words */\n\nfunction destMaskAndPointerInit() {\n\tvar endBits;\n\tvar startBits;\n\tvar pixPerM1;\n\n\n\t/* A mask, assuming power of two */\n\t/* how many pixels in first word */\n\n\tpixPerM1 = destPPW - 1;\n\tstartBits = destPPW - (dx & pixPerM1);\n\tif (destMSB) {\n\t\tmask1 = SHR(AllOnes, (32 - (startBits * destDepth)));\n\t} else {\n\t\tmask1 = SHL(AllOnes, (32 - (startBits * destDepth)));\n\t}\n\tendBits = (((dx + bbW) - 1) & pixPerM1) + 1;\n\tif (destMSB) {\n\t\tmask2 = SHL(AllOnes, (32 - (endBits * destDepth)));\n\t} else {\n\t\tmask2 = SHR(AllOnes, (32 - (endBits * destDepth)));\n\t}\n\tif (bbW < startBits) {\n\t\tmask1 = mask1 & mask2;\n\t\tmask2 = 0;\n\t\tnWords = 1;\n\t} else {\n\t\tnWords = (DIV(((bbW - startBits) + pixPerM1), destPPW)) + 1;\n\t}\n\n\t/* defaults for no overlap with source */\n\t/* calculate byte addr and delta, based on first word of data */\n\t/* Note pitch is bytes and nWords is longs, not bytes */\n\n\thDir = (vDir = 1);\n\tdestIndex = ((dy * destPitch)) + ((DIV(dx, destPPW)) * 4);\n\tdestDelta = (destPitch * vDir) - (4 * (nWords * hDir));\n}\n\nfunction destinationWordwith(sourceWord, destinationWord) {\n\treturn destinationWord;\n}\n\n\n/*\tDither the given 32bit word to 16 bit. Ignore alpha. */\n\nfunction dither32To16threshold(srcWord, ditherValue) {\n\tvar addThreshold;\n\n\n\t/* You bet */\n\n\taddThreshold = ditherValue << 8;\n\treturn ((dither8Lookup[addThreshold + ((srcWord >>> 16) & 255)] << 10) + (dither8Lookup[addThreshold + ((srcWord >>> 8) & 255)] << 5)) + dither8Lookup[addThreshold + (srcWord & 255)];\n}\n\n\n/*\tThis is the primitive implementation of the line-drawing loop.\n\tSee the comments in BitBlt>>drawLoopX:Y: */\n\nfunction drawLoopXY(xDelta, yDelta) {\n\tvar P;\n\tvar affT;\n\tvar dx1;\n\tvar px;\n\tvar affR;\n\tvar affL;\n\tvar py;\n\tvar i;\n\tvar affB;\n\tvar dy1;\n\n\tif (xDelta > 0) {\n\t\tdx1 = 1;\n\t} else {\n\t\tif (xDelta === 0) {\n\t\t\tdx1 = 0;\n\t\t} else {\n\t\t\tdx1 = -1;\n\t\t}\n\t}\n\tif (yDelta > 0) {\n\t\tdy1 = 1;\n\t} else {\n\t\tif (yDelta === 0) {\n\t\t\tdy1 = 0;\n\t\t} else {\n\t\t\tdy1 = -1;\n\t\t}\n\t}\n\tpx = Math.abs(yDelta);\n\tpy = Math.abs(xDelta);\n\n\t/* init null rectangle */\n\n\taffL = (affT = 9999);\n\taffR = (affB = -9999);\n\tif (py > px) {\n\n\t\t/* more horizontal */\n\n\t\tP = py >> 1;\n\t\tfor (i = 1; i <= py; i++) {\n\t\t\tdestX += dx1;\n\t\t\tif (((P -= px)) < 0) {\n\t\t\t\tdestY += dy1;\n\t\t\t\tP += py;\n\t\t\t}\n\t\t\tif (i < py) {\n\t\t\t\tcopyBits();\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif ((affectedL < affectedR) && (affectedT < affectedB)) {\n\n\t\t\t\t\t/* Affected rectangle grows along the line */\n\n\t\t\t\t\taffL = Math.min(affL, affectedL);\n\t\t\t\t\taffR = Math.max(affR, affectedR);\n\t\t\t\t\taffT = Math.min(affT, affectedT);\n\t\t\t\t\taffB = Math.max(affB, affectedB);\n\t\t\t\t\tif (((affR - affL) * (affB - affT)) > 4000) {\n\n\t\t\t\t\t\t/* If affected rectangle gets large, update it in chunks */\n\n\t\t\t\t\t\taffectedL = affL;\n\t\t\t\t\t\taffectedR = affR;\n\t\t\t\t\t\taffectedT = affT;\n\t\t\t\t\t\taffectedB = affB;\n\t\t\t\t\t\tshowDisplayBits();\n\n\t\t\t\t\t\t/* init null rectangle */\n\n\t\t\t\t\t\taffL = (affT = 9999);\n\t\t\t\t\t\taffR = (affB = -9999);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\n\t\t/* more vertical */\n\n\t\tP = px >> 1;\n\t\tfor (i = 1; i <= px; i++) {\n\t\t\tdestY += dy1;\n\t\t\tif (((P -= py)) < 0) {\n\t\t\t\tdestX += dx1;\n\t\t\t\tP += px;\n\t\t\t}\n\t\t\tif (i < px) {\n\t\t\t\tcopyBits();\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif ((affectedL < affectedR) && (affectedT < affectedB)) {\n\n\t\t\t\t\t/* Affected rectangle grows along the line */\n\n\t\t\t\t\taffL = Math.min(affL, affectedL);\n\t\t\t\t\taffR = Math.max(affR, affectedR);\n\t\t\t\t\taffT = Math.min(affT, affectedT);\n\t\t\t\t\taffB = Math.max(affB, affectedB);\n\t\t\t\t\tif (((affR - affL) * (affB - affT)) > 4000) {\n\n\t\t\t\t\t\t/* If affected rectangle gets large, update it in chunks */\n\n\t\t\t\t\t\taffectedL = affL;\n\t\t\t\t\t\taffectedR = affR;\n\t\t\t\t\t\taffectedT = affT;\n\t\t\t\t\t\taffectedB = affB;\n\t\t\t\t\t\tshowDisplayBits();\n\n\t\t\t\t\t\t/* init null rectangle */\n\n\t\t\t\t\t\taffL = (affT = 9999);\n\t\t\t\t\t\taffR = (affB = -9999);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\taffectedL = affL;\n\taffectedR = affR;\n\taffectedT = affT;\n\n\t/* store destX, Y back */\n\n\taffectedB = affB;\n\tinterpreterProxy.storeIntegerofObjectwithValue(BBDestXIndex, bitBltOop, destX);\n\tinterpreterProxy.storeIntegerofObjectwithValue(BBDestYIndex, bitBltOop, destY);\n}\n\n\n/*\tStore the given value back into destination form, using dstMask\n\tto mask out the bits to be modified. This is an essiantial\n\tread-modify-write operation on the destination form. */\n\nfunction dstLongAtputmask(idx, srcValue, dstMask) {\n\tvar dstValue;\n\n\tdstValue = destBits[idx >>> 2];\n\tdstValue = dstValue & dstMask;\n\tdstValue = dstValue | srcValue;\n\tdestBits[idx >>> 2] = dstValue;\n}\n\n\n/*\tDither the given 32bit word to 16 bit. Ignore alpha. */\n\nfunction expensiveDither32To16threshold(srcWord, ditherValue) {\n\tvar pv;\n\tvar threshold;\n\tvar value;\n\tvar out;\n\n\n\t/* You bet */\n\n\tpv = srcWord & 255;\n\tthreshold = ditherThresholds16[pv & 7];\n\tvalue = ditherValues16[pv >>> 3];\n\tif (ditherValue < threshold) {\n\t\tout = value + 1;\n\t} else {\n\t\tout = value;\n\t}\n\tpv = (srcWord >>> 8) & 255;\n\tthreshold = ditherThresholds16[pv & 7];\n\tvalue = ditherValues16[pv >>> 3];\n\tif (ditherValue < threshold) {\n\t\tout = out | ((value + 1) << 5);\n\t} else {\n\t\tout = out | (value << 5);\n\t}\n\tpv = (srcWord >>> 16) & 255;\n\tthreshold = ditherThresholds16[pv & 7];\n\tvalue = ditherValues16[pv >>> 3];\n\tif (ditherValue < threshold) {\n\t\tout = out | ((value + 1) << 10);\n\t} else {\n\t\tout = out | (value << 10);\n\t}\n\treturn out;\n}\n\n\n/*\tReturn the integer value of the given field of the given object. If the field contains a Float, truncate it and return its integral part. Fail if the given field does not contain a small integer or Float, or if the truncated Float is out of the range of small integers. */\n\nfunction fetchIntOrFloatofObject(fieldIndex, objectPointer) {\n\tvar floatValue;\n\tvar fieldOop;\n\n\tfieldOop = interpreterProxy.fetchPointerofObject(fieldIndex, objectPointer);\n\tif (typeof fieldOop === \"number\") {\n\t\treturn fieldOop;\n\t}\n\tfloatValue = interpreterProxy.floatValueOf(fieldOop);\n\tif (!((-2.147483648e9 <= floatValue) && (floatValue <= 2.147483647e9))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn 0;\n\t}\n\treturn (floatValue|0);\n}\n\n\n/*\tReturn the integer value of the given field of the given object. If the field contains a Float, truncate it and return its integral part. Fail if the given field does not contain a small integer or Float, or if the truncated Float is out of the range of small integers. */\n\nfunction fetchIntOrFloatofObjectifNil(fieldIndex, objectPointer, defaultValue) {\n\tvar floatValue;\n\tvar fieldOop;\n\n\tfieldOop = interpreterProxy.fetchPointerofObject(fieldIndex, objectPointer);\n\tif (typeof fieldOop === \"number\") {\n\t\treturn fieldOop;\n\t}\n\tif (fieldOop.isNil) {\n\t\treturn defaultValue;\n\t}\n\tfloatValue = interpreterProxy.floatValueOf(fieldOop);\n\tif (!((-2.147483648e9 <= floatValue) && (floatValue <= 2.147483647e9))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn 0;\n\t}\n\treturn (floatValue|0);\n}\n\n\n/*\tFor any non-zero pixel value in destinationWord with zero alpha channel take the alpha from sourceWord and fill it in. Intended for fixing alpha channels left at zero during 16->32 bpp conversions. */\n\nfunction fixAlphawith(sourceWord, destinationWord) {\n\tif (destDepth !== 32) {\n\t\treturn destinationWord;\n\t}\n\tif (destinationWord === 0) {\n\t\treturn 0;\n\t}\n\tif ((destinationWord & 4278190080) !== 0) {\n\t\treturn destinationWord;\n\t}\n\treturn destinationWord | (sourceWord & 4278190080);\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\n\n/*\tReturn a value from the halftone pattern. */\n\nfunction halftoneAt(idx) {\n\treturn halftoneBase[MOD(idx, halftoneHeight)];\n}\n\nfunction halt() {\n\t;\n}\n\nfunction ignoreSourceOrHalftone(formPointer) {\n\tif (formPointer.isNil) {\n\t\treturn true;\n\t}\n\tif (combinationRule === 0) {\n\t\treturn true;\n\t}\n\tif (combinationRule === 5) {\n\t\treturn true;\n\t}\n\tif (combinationRule === 10) {\n\t\treturn true;\n\t}\n\tif (combinationRule === 15) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction initBBOpTable() {\n\topTable[0+1] = clearWordwith;\n\topTable[1+1] = bitAndwith;\n\topTable[2+1] = bitAndInvertwith;\n\topTable[3+1] = sourceWordwith;\n\topTable[4+1] = bitInvertAndwith;\n\topTable[5+1] = destinationWordwith;\n\topTable[6+1] = bitXorwith;\n\topTable[7+1] = bitOrwith;\n\topTable[8+1] = bitInvertAndInvertwith;\n\topTable[9+1] = bitInvertXorwith;\n\topTable[10+1] = bitInvertDestinationwith;\n\topTable[11+1] = bitOrInvertwith;\n\topTable[12+1] = bitInvertSourcewith;\n\topTable[13+1] = bitInvertOrwith;\n\topTable[14+1] = bitInvertOrInvertwith;\n\topTable[15+1] = destinationWordwith;\n\topTable[16+1] = destinationWordwith;\n\topTable[17+1] = destinationWordwith;\n\topTable[18+1] = addWordwith;\n\topTable[19+1] = subWordwith;\n\topTable[20+1] = rgbAddwith;\n\topTable[21+1] = rgbSubwith;\n\topTable[22+1] = OLDrgbDiffwith;\n\topTable[23+1] = OLDtallyIntoMapwith;\n\topTable[24+1] = alphaBlendwith;\n\topTable[25+1] = pixPaintwith;\n\topTable[26+1] = pixMaskwith;\n\topTable[27+1] = rgbMaxwith;\n\topTable[28+1] = rgbMinwith;\n\topTable[29+1] = rgbMinInvertwith;\n\topTable[30+1] = alphaBlendConstwith;\n\topTable[31+1] = alphaPaintConstwith;\n\topTable[32+1] = rgbDiffwith;\n\topTable[33+1] = tallyIntoMapwith;\n\topTable[34+1] = alphaBlendScaledwith;\n\topTable[35+1] = alphaBlendScaledwith;\n\topTable[36+1] = alphaBlendScaledwith;\n\topTable[37+1] = rgbMulwith;\n\topTable[38+1] = pixSwapwith;\n\topTable[39+1] = pixClearwith;\n\topTable[40+1] = fixAlphawith;\n\topTable[41+1] = rgbComponentAlphawith;\n}\n\nfunction initDither8Lookup() {\n\tvar t;\n\tvar b;\n\tvar value;\n\n\tfor (b = 0; b <= 255; b++) {\n\t\tfor (t = 0; t <= 15; t++) {\n\t\t\tvalue = expensiveDither32To16threshold(b, t);\n\t\t\tdither8Lookup[(t << 8) + b] = value;\n\t\t}\n\t}\n}\n\nfunction initialiseModule() {\n\tinitBBOpTable();\n\tinitDither8Lookup();\n\t// skipping ifdef ENABLE_FAST_BLT\n\treturn true;\n}\n\n\n/*\tReturn true if shiftTable/maskTable define an identity mapping. */\n\nfunction isIdentityMapwith(shifts, masks) {\n\tif ((!shifts) || (!masks)) {\n\t\treturn true;\n\t}\n\tif ((shifts[RedIndex] === 0) && ((shifts[GreenIndex] === 0) && ((shifts[BlueIndex] === 0) && ((shifts[AlphaIndex] === 0) && ((masks[RedIndex] === 16711680) && ((masks[GreenIndex] === 65280) && ((masks[BlueIndex] === 255) && (masks[AlphaIndex] === 4278190080)))))))) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n/*\tLoad the dest form for BitBlt. Return false if anything is wrong, true otherwise. */\n\nfunction loadBitBltDestForm() {\n\tvar destBitsSize;\n\n\tdestBits = interpreterProxy.fetchPointerofObject(FormBitsIndex, destForm);\n\tdestWidth = interpreterProxy.fetchIntegerofObject(FormWidthIndex, destForm);\n\tdestHeight = interpreterProxy.fetchIntegerofObject(FormHeightIndex, destForm);\n\tif (!((destWidth >= 0) && (destHeight >= 0))) {\n\t\treturn false;\n\t}\n\tdestDepth = interpreterProxy.fetchIntegerofObject(FormDepthIndex, destForm);\n\tdestMSB = destDepth > 0;\n\tif (destDepth < 0) {\n\t\tdestDepth = 0 - destDepth;\n\t}\n\tif (typeof destBits === \"number\") {\n\n\t\t/* Query for actual surface dimensions */\n\n\t\tif (!queryDestSurface(destBits)) {\n\t\t\treturn false;\n\t\t}\n\t\tdestPPW = DIV(32, destDepth);\n\t\tdestBits = (destPitch = 0);\n\t} else {\n\t\tdestPPW = DIV(32, destDepth);\n\t\tdestPitch = (DIV((destWidth + (destPPW - 1)), destPPW)) * 4;\n\t\tdestBitsSize = BYTESIZEOF(destBits);\n\t\tif (!(interpreterProxy.isWordsOrBytes(destBits) && (destBitsSize === (destPitch * destHeight)))) {\n\t\t\treturn false;\n\t\t}\n\t\tdestBits = destBits.wordsOrBytes();\n\t}\n\treturn true;\n}\n\n\n/*\tLoad BitBlt from the oop.\n\tThis function is exported for the Balloon engine. */\n\nfunction loadBitBltFrom(bbObj) {\n\treturn loadBitBltFromwarping(bbObj, false);\n}\n\n\n/*\tLoad context from BitBlt instance. Return false if anything is amiss */\n/*\tNOTE this should all be changed to minX/maxX coordinates for simpler clipping\n\t\t-- once it works! */\n\nfunction loadBitBltFromwarping(bbObj, aBool) {\n\tvar ok;\n\n\tbitBltOop = bbObj;\n\tisWarping = aBool;\n\tcombinationRule = interpreterProxy.fetchIntegerofObject(BBRuleIndex, bitBltOop);\n\tif (interpreterProxy.failed() || ((combinationRule < 0) || (combinationRule > (OpTableSize - 2)))) {\n\t\treturn false;\n\t}\n\tif ((combinationRule >= 16) && (combinationRule <= 17)) {\n\t\treturn false;\n\t}\n\tsourceForm = interpreterProxy.fetchPointerofObject(BBSourceFormIndex, bitBltOop);\n\tnoSource = ignoreSourceOrHalftone(sourceForm);\n\thalftoneForm = interpreterProxy.fetchPointerofObject(BBHalftoneFormIndex, bitBltOop);\n\tnoHalftone = ignoreSourceOrHalftone(halftoneForm);\n\tdestForm = interpreterProxy.fetchPointerofObject(BBDestFormIndex, bbObj);\n\tif (!(interpreterProxy.isPointers(destForm) && (SIZEOF(destForm) >= 4))) {\n\t\treturn false;\n\t}\n\tok = loadBitBltDestForm();\n\tif (!ok) {\n\t\treturn false;\n\t}\n\tdestX = fetchIntOrFloatofObjectifNil(BBDestXIndex, bitBltOop, 0);\n\tdestY = fetchIntOrFloatofObjectifNil(BBDestYIndex, bitBltOop, 0);\n\twidth = fetchIntOrFloatofObjectifNil(BBWidthIndex, bitBltOop, destWidth);\n\theight = fetchIntOrFloatofObjectifNil(BBHeightIndex, bitBltOop, destHeight);\n\tif (interpreterProxy.failed()) {\n\t\treturn false;\n\t}\n\tif (noSource) {\n\t\tsourceX = (sourceY = 0);\n\t} else {\n\t\tif (!(interpreterProxy.isPointers(sourceForm) && (SIZEOF(sourceForm) >= 4))) {\n\t\t\treturn false;\n\t\t}\n\t\tok = loadBitBltSourceForm();\n\t\tif (!ok) {\n\t\t\treturn false;\n\t\t}\n\t\tok = loadColorMap();\n\t\tif (!ok) {\n\t\t\treturn false;\n\t\t}\n\t\tif ((cmFlags & ColorMapNewStyle) === 0) {\n\t\t\tsetupColorMasks();\n\t\t}\n\t\tsourceX = fetchIntOrFloatofObjectifNil(BBSourceXIndex, bitBltOop, 0);\n\t\tsourceY = fetchIntOrFloatofObjectifNil(BBSourceYIndex, bitBltOop, 0);\n\t}\n\tok = loadHalftoneForm();\n\tif (!ok) {\n\t\treturn false;\n\t}\n\tclipX = fetchIntOrFloatofObjectifNil(BBClipXIndex, bitBltOop, 0);\n\tclipY = fetchIntOrFloatofObjectifNil(BBClipYIndex, bitBltOop, 0);\n\tclipWidth = fetchIntOrFloatofObjectifNil(BBClipWidthIndex, bitBltOop, destWidth);\n\tclipHeight = fetchIntOrFloatofObjectifNil(BBClipHeightIndex, bitBltOop, destHeight);\n\tif (interpreterProxy.failed()) {\n\t\treturn false;\n\t}\n\tif (clipX < 0) {\n\t\tclipWidth += clipX;\n\t\tclipX = 0;\n\t}\n\tif (clipY < 0) {\n\t\tclipHeight += clipY;\n\t\tclipY = 0;\n\t}\n\tif ((clipX + clipWidth) > destWidth) {\n\t\tclipWidth = destWidth - clipX;\n\t}\n\tif ((clipY + clipHeight) > destHeight) {\n\t\tclipHeight = destHeight - clipY;\n\t}\n\treturn true;\n}\n\n\n/*\tLoad the source form for BitBlt. Return false if anything is wrong, true otherwise. */\n\nfunction loadBitBltSourceForm() {\n\tvar sourceBitsSize;\n\n\tsourceBits = interpreterProxy.fetchPointerofObject(FormBitsIndex, sourceForm);\n\tsourceWidth = fetchIntOrFloatofObject(FormWidthIndex, sourceForm);\n\tsourceHeight = fetchIntOrFloatofObject(FormHeightIndex, sourceForm);\n\tif (!((sourceWidth >= 0) && (sourceHeight >= 0))) {\n\t\treturn false;\n\t}\n\tsourceDepth = interpreterProxy.fetchIntegerofObject(FormDepthIndex, sourceForm);\n\tsourceMSB = sourceDepth > 0;\n\tif (sourceDepth < 0) {\n\t\tsourceDepth = 0 - sourceDepth;\n\t}\n\tif (typeof sourceBits === \"number\") {\n\n\t\t/* Query for actual surface dimensions */\n\n\t\tif (!querySourceSurface(sourceBits)) {\n\t\t\treturn false;\n\t\t}\n\t\tsourcePPW = DIV(32, sourceDepth);\n\t\tsourceBits = (sourcePitch = 0);\n\t} else {\n\t\tsourcePPW = DIV(32, sourceDepth);\n\t\tsourcePitch = (DIV((sourceWidth + (sourcePPW - 1)), sourcePPW)) * 4;\n\t\tsourceBitsSize = BYTESIZEOF(sourceBits);\n\t\tif (!(interpreterProxy.isWordsOrBytes(sourceBits) && (sourceBitsSize === (sourcePitch * sourceHeight)))) {\n\t\t\treturn false;\n\t\t}\n\t\tsourceBits = sourceBits.wordsOrBytes();\n\t}\n\treturn true;\n}\n\n\n/*\tColorMap, if not nil, must be longWords, and \n\t2^N long, where N = sourceDepth for 1, 2, 4, 8 bits, \n\tor N = 9, 12, or 15 (3, 4, 5 bits per color) for 16 or 32 bits. */\n\nfunction loadColorMap() {\n\tvar oop;\n\tvar cmOop;\n\tvar cmSize;\n\tvar oldStyle;\n\n\tcmFlags = (cmMask = (cmBitsPerColor = 0));\n\tcmShiftTable = null;\n\tcmMaskTable = null;\n\tcmLookupTable = null;\n\tcmOop = interpreterProxy.fetchPointerofObject(BBColorMapIndex, bitBltOop);\n\tif (cmOop.isNil) {\n\t\treturn true;\n\t}\n\n\t/* even if identity or somesuch - may be cleared later */\n\n\tcmFlags = ColorMapPresent;\n\toldStyle = false;\n\tif (interpreterProxy.isWords(cmOop)) {\n\n\t\t/* This is an old-style color map (indexed only, with implicit RGBA conversion) */\n\n\t\tcmSize = SIZEOF(cmOop);\n\t\tcmLookupTable = cmOop.words;\n\t\toldStyle = true;\n\t\t;\n\t} else {\n\n\t\t/* A new-style color map (fully qualified) */\n\n\t\tif (!(interpreterProxy.isPointers(cmOop) && (SIZEOF(cmOop) >= 3))) {\n\t\t\treturn false;\n\t\t}\n\t\tcmShiftTable = loadColorMapShiftOrMaskFrom(interpreterProxy.fetchPointerofObject(0, cmOop));\n\t\tcmMaskTable = loadColorMapShiftOrMaskFrom(interpreterProxy.fetchPointerofObject(1, cmOop));\n\t\toop = interpreterProxy.fetchPointerofObject(2, cmOop);\n\t\tif (oop.isNil) {\n\t\t\tcmSize = 0;\n\t\t} else {\n\t\t\tif (!interpreterProxy.isWords(oop)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcmSize = SIZEOF(oop);\n\t\t\tcmLookupTable = oop.words;\n\t\t}\n\t\tcmFlags = cmFlags | ColorMapNewStyle;\n\t\t;\n\t}\n\tif ((cmSize & (cmSize - 1)) !== 0) {\n\t\treturn false;\n\t}\n\tcmMask = cmSize - 1;\n\tcmBitsPerColor = 0;\n\tif (cmSize === 512) {\n\t\tcmBitsPerColor = 3;\n\t}\n\tif (cmSize === 4096) {\n\t\tcmBitsPerColor = 4;\n\t}\n\tif (cmSize === 32768) {\n\t\tcmBitsPerColor = 5;\n\t}\n\tif (cmSize === 0) {\n\t\tcmLookupTable = null;\n\t\tcmMask = 0;\n\t} else {\n\t\tcmFlags = cmFlags | ColorMapIndexedPart;\n\t}\n\tif (oldStyle) {\n\n\t\t/* needs implicit conversion */\n\n\t\tsetupColorMasks();\n\t}\n\tif (isIdentityMapwith(cmShiftTable, cmMaskTable)) {\n\t\tcmMaskTable = null;\n\t\tcmShiftTable = null;\n\t} else {\n\t\tcmFlags = cmFlags | ColorMapFixedPart;\n\t}\n\treturn true;\n}\n\nfunction loadColorMapShiftOrMaskFrom(mapOop) {\n\tif (mapOop.isNil) {\n\t\treturn null;\n\t}\n\tif (typeof mapOop === \"number\") {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!(interpreterProxy.isWords(mapOop) && (SIZEOF(mapOop) === 4))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\treturn mapOop.words;\n}\n\n\n/*\tLoad the halftone form */\n\nfunction loadHalftoneForm() {\n\tvar halftoneBits;\n\n\tif (noHalftone) {\n\t\thalftoneBase = null;\n\t\treturn true;\n\t}\n\tif (interpreterProxy.isPointers(halftoneForm) && (SIZEOF(halftoneForm) >= 4)) {\n\n\t\t/* Old-style 32xN monochrome halftone Forms */\n\n\t\thalftoneBits = interpreterProxy.fetchPointerofObject(FormBitsIndex, halftoneForm);\n\t\thalftoneHeight = interpreterProxy.fetchIntegerofObject(FormHeightIndex, halftoneForm);\n\t\tif (!interpreterProxy.isWords(halftoneBits)) {\n\t\t\tnoHalftone = true;\n\t\t}\n\t} else {\n\n\t\t/* New spec accepts, basically, a word array */\n\n\t\tif (!(!interpreterProxy.isPointers(halftoneForm) && (interpreterProxy.isWords(halftoneForm)))) {\n\t\t\treturn false;\n\t\t}\n\t\thalftoneBits = halftoneForm;\n\t\thalftoneHeight = SIZEOF(halftoneBits);\n\t}\n\thalftoneBase = halftoneBits.wordsOrBytes();\n\treturn true;\n}\n\n\n/*\tLoad the surface support plugin */\n\nfunction loadSurfacePlugin() {\n\tquerySurfaceFn = interpreterProxy.ioLoadFunctionFrom(\"ioGetSurfaceFormat\", \"SurfacePlugin\");\n\tlockSurfaceFn = interpreterProxy.ioLoadFunctionFrom(\"ioLockSurface\", \"SurfacePlugin\");\n\tunlockSurfaceFn = interpreterProxy.ioLoadFunctionFrom(\"ioUnlockSurface\", \"SurfacePlugin\");\n\treturn (!!querySurfaceFn) && ((!!lockSurfaceFn) && (!!unlockSurfaceFn));\n}\n\nfunction loadWarpBltFrom(bbObj) {\n\treturn loadBitBltFromwarping(bbObj, true);\n}\n\n\n/*\tGet a pointer to the bits of any OS surfaces. */\n/*\tNotes: \n\t* For equal source/dest handles only one locking operation is performed.\n\tThis is to prevent locking of overlapping areas which does not work with\n\tcertain APIs (as an example, DirectDraw prevents locking of overlapping areas). \n\tA special case for non-overlapping but equal source/dest handle would \n\tbe possible but we would have to transfer this information over to \n\tunlockSurfaces somehow (currently, only one unlock operation is \n\tperformed for equal source and dest handles). Also, this would require\n\ta change in the notion of ioLockSurface() which is right now interpreted\n\tas a hint and not as a requirement to lock only the specific portion of\n\tthe surface.\n\n\t* The arguments in ioLockSurface() provide the implementation with\n\tan explicit hint what area is affected. It can be very useful to\n\tknow the max. affected area beforehand if getting the bits requires expensive\n\tcopy operations (e.g., like a roundtrip to the X server or a glReadPixel op).\n\tHowever, the returned pointer *MUST* point to the virtual origin of the surface\n\tand not to the beginning of the rectangle. The promise made by BitBlt\n\tis to never access data outside the given rectangle (aligned to 4byte boundaries!)\n\tso it is okay to return a pointer to the virtual origin that is actually outside\n\tthe valid memory area.\n\n\t* The area provided in ioLockSurface() is already clipped (e.g., it will always\n\tbe inside the source and dest boundingBox) but it is not aligned to word boundaries\n\tyet. It is up to the support code to compute accurate alignment if necessary.\n\n\t* Warping always requires the entire source surface to be locked because\n\tthere is no beforehand knowledge about what area will actually be traversed.\n\n\t */\n\nfunction lockSurfaces() {\n\tvar destHandle;\n\tvar sourceHandle;\n\tvar t;\n\tvar fn;\n\tvar r;\n\tvar b;\n\tvar l;\n\n\thasSurfaceLock = false;\n\tif (destBits === 0) {\n\n\t\t/* Blitting *to* OS surface */\n\n\t\tif (!lockSurfaceFn) {\n\t\t\tif (!loadSurfacePlugin()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tfn = lockSurfaceFn;\n\t\tdestHandle = interpreterProxy.fetchIntegerofObject(FormBitsIndex, destForm);\n\t\tif ((sourceBits === 0) && (!noSource)) {\n\n\t\t\t/* Handle the special case of equal source and dest handles */\n\n\t\t\tsourceHandle = interpreterProxy.fetchIntegerofObject(FormBitsIndex, sourceForm);\n\t\t\tif (sourceHandle === destHandle) {\n\n\t\t\t\t/* If we have overlapping source/dest we lock the entire area\n\t\t\t\tso that there is only one area transmitted */\n\n\t\t\t\tif (isWarping) {\n\n\t\t\t\t\t/* Otherwise use overlapping area */\n\n\t\t\t\t\tl = Math.min(sx, dx);\n\t\t\t\t\tr = Math.max(sx, dx) + bbW;\n\t\t\t\t\tt = Math.min(sy, dy);\n\t\t\t\t\tb = Math.max(sy, dy) + bbH;\n\t\t\t\t\tsourceBits = fn(sourceHandle, function(p){sourcePitch = p}, l, t, r-l, b-t);\n\t\t\t\t} else {\n\n\t\t\t\t\t/* When warping we always need the entire surface for the source */\n\n\t\t\t\t\tsourceBits = fn(sourceHandle, function(p){sourcePitch = p}, 0,0, sourceWidth, sourceHeight);\n\t\t\t\t}\n\t\t\t\tdestBits = sourceBits;\n\t\t\t\tdestPitch = sourcePitch;\n\t\t\t\thasSurfaceLock = true;\n\t\t\t\treturn destBits !== 0;\n\t\t\t}\n\t\t}\n\t\tdestBits = fn(destHandle, function(p){destPitch = p}, dx, dy, bbW, bbH);\n\t\thasSurfaceLock = true;\n\t}\n\tif ((sourceBits === 0) && (!noSource)) {\n\n\t\t/* Blitting *from* OS surface */\n\n\t\tsourceHandle = interpreterProxy.fetchIntegerofObject(FormBitsIndex, sourceForm);\n\t\tif (!lockSurfaceFn) {\n\t\t\tif (!loadSurfacePlugin()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t/* Warping requiring the entire surface */\n\n\t\tfn = lockSurfaceFn;\n\t\tif (isWarping) {\n\t\t\tsourceBits = fn(sourceHandle, function(p){sourcePitch = p}, 0, 0, sourceWidth, sourceHeight);\n\t\t} else {\n\t\t\tsourceBits = fn(sourceHandle, function(p){sourcePitch = p}, sx, sy, bbW, bbH);\n\t\t}\n\t\thasSurfaceLock = true;\n\t}\n\treturn (destBits !== 0) && ((sourceBits !== 0) || (noSource));\n}\n\n\n/*\tColor map the given source pixel. */\n\nfunction mapPixelflags(sourcePixel, mapperFlags) {\n\tvar pv;\n\n\tpv = sourcePixel;\n\tif ((mapperFlags & ColorMapPresent) !== 0) {\n\t\tif ((mapperFlags & ColorMapFixedPart) !== 0) {\n\n\t\t\t/* avoid introducing transparency by color reduction */\n\n\t\t\tpv = rgbMapPixelflags(sourcePixel, mapperFlags);\n\t\t\tif ((pv === 0) && (sourcePixel !== 0)) {\n\t\t\t\tpv = 1;\n\t\t\t}\n\t\t}\n\t\tif ((mapperFlags & ColorMapIndexedPart) !== 0) {\n\t\t\tpv = cmLookupTable[pv & cmMask];\n\t\t}\n\t}\n\treturn pv;\n}\n\n\n/*\tThe module with the given name was just unloaded.\n\tMake sure we have no dangling references. */\n\nfunction moduleUnloaded(aModuleName) {\n\tif (strcmp(aModuleName, \"SurfacePlugin\") === 0) {\n\n\t\t/* The surface plugin just shut down. How nasty. */\n\n\t\tquerySurfaceFn = (lockSurfaceFn = (unlockSurfaceFn = 0));\n\t}\n}\n\n\n/*\tAND word1 to word2 as nParts partitions of nBits each.\n\tAny field of word1 not all-ones is treated as all-zeroes.\n\tUsed for erasing, eg, brush shapes prior to ORing in a color */\n\nfunction partitionedANDtonBitsnPartitions(word1, word2, nBits, nParts) {\n\tvar result;\n\tvar i;\n\tvar mask;\n\n\n\t/* partition mask starts at the right */\n\n\tmask = maskTable[nBits];\n\tresult = 0;\n\tfor (i = 1; i <= nParts; i++) {\n\t\tif ((word1 & mask) === mask) {\n\t\t\tresult = result | (word2 & mask);\n\t\t}\n\n\t\t/* slide left to next partition */\n\n\t\tmask = SHL(mask, nBits);\n\t}\n\treturn result;\n}\n\n\n/*\tAdd word1 to word2 as nParts partitions of nBits each.\n\tThis is useful for packed pixels, or packed colors */\n/*\tUse unsigned int everywhere because it has a well known arithmetic model without undefined behavior w.r.t. overflow and shifts */\n\nfunction partitionedAddtonBitscomponentMaskcarryOverflowMask(word1, word2, nBits, componentMask, carryOverflowMask) {\n\tvar w2;\n\tvar carryOverflow;\n\tvar sum;\n\tvar w1;\n\n\n\t/* mask to remove high bit of each component */\n\n\tw1 = word1 & carryOverflowMask;\n\tw2 = word2 & carryOverflowMask;\n\n\t/* sum without high bit to avoid overflowing over next component */\n\n\tsum = (word1 ^ w1) + (word2 ^ w2);\n\n\t/* detect overflow condition for saturating */\n\n\tcarryOverflow = (w1 & w2) | ((w1 | w2) & sum);\n\treturn ((sum ^ w1) ^ w2) | ((SHR(carryOverflow, (nBits - 1))) * componentMask);\n}\n\n\n/*\tMax word1 to word2 as nParts partitions of nBits each */\n/*\tIn C, most arithmetic operations answer the same bit pattern regardless of the operands being signed or unsigned ints\n\t(this is due to the way 2's complement numbers work). However, comparisions might fail. Add the proper declaration of\n\twords as unsigned int in those cases where comparisions are done (jmv) */\n\nfunction partitionedMaxwithnBitsnPartitions(word1, word2, nBits, nParts) {\n\tvar result;\n\tvar i;\n\tvar mask;\n\n\n\t/* partition mask starts at the right */\n\n\tmask = maskTable[nBits];\n\tresult = 0;\n\tfor (i = 1; i <= nParts; i++) {\n\t\tresult = result | Math.max((word2 & mask), (word1 & mask));\n\n\t\t/* slide left to next partition */\n\n\t\tmask = SHL(mask, nBits);\n\t}\n\treturn result;\n}\n\n\n/*\tMin word1 to word2 as nParts partitions of nBits each */\n/*\tIn C, most arithmetic operations answer the same bit pattern regardless of the operands being signed or unsigned ints\n\t(this is due to the way 2's complement numbers work). However, comparisions might fail. Add the proper declaration of\n\twords as unsigned int in those cases where comparisions are done (jmv) */\n\nfunction partitionedMinwithnBitsnPartitions(word1, word2, nBits, nParts) {\n\tvar result;\n\tvar i;\n\tvar mask;\n\n\n\t/* partition mask starts at the right */\n\n\tmask = maskTable[nBits];\n\tresult = 0;\n\tfor (i = 1; i <= nParts; i++) {\n\t\tresult = result | Math.min((word2 & mask), (word1 & mask));\n\n\t\t/* slide left to next partition */\n\n\t\tmask = SHL(mask, nBits);\n\t}\n\treturn result;\n}\n\n\n/*\tMultiply word1 with word2 as nParts partitions of nBits each.\n\tThis is useful for packed pixels, or packed colors.\n\tBug in loop version when non-white background */\n/*\tIn C, integer multiplication might answer a wrong value if the unsigned values are declared as signed.\n\tThis problem does not affect this method, because the most significant bit (i.e. the sign bit) will\n\talways be zero (jmv) */\n\nfunction partitionedMulwithnBitsnPartitions(word1, word2, nBits, nParts) {\n\tvar dMask;\n\tvar result;\n\tvar product;\n\tvar sMask;\n\n\n\t/* partition mask starts at the right */\n\n\tsMask = maskTable[nBits];\n\tdMask = SHL(sMask, nBits);\n\n\t/* optimized first step */\n\n\tresult = SHR((((((word1 & sMask) + 1) * ((word2 & sMask) + 1)) - 1) & dMask), nBits);\n\tif (nParts === 1) {\n\t\treturn result;\n\t}\n\tproduct = (((((SHR(word1, nBits)) & sMask) + 1) * (((SHR(word2, nBits)) & sMask) + 1)) - 1) & dMask;\n\tresult = result | product;\n\tif (nParts === 2) {\n\t\treturn result;\n\t}\n\tproduct = (((((SHR(word1, (2 * nBits))) & sMask) + 1) * (((SHR(word2, (2 * nBits))) & sMask) + 1)) - 1) & dMask;\n\tresult = result | (SHL(product, nBits));\n\tif (nParts === 3) {\n\t\treturn result;\n\t}\n\tproduct = (((((SHR(word1, (3 * nBits))) & sMask) + 1) * (((SHR(word2, (3 * nBits))) & sMask) + 1)) - 1) & dMask;\n\tresult = result | (SHL(product, (2 * nBits)));\n\treturn result;\n}\n\nfunction partitionedRgbComponentAlphadestnBitsnPartitions(sourceWord, destWord, nBits, nParts) {\n\tvar p2;\n\tvar result;\n\tvar p1;\n\tvar i;\n\tvar v;\n\tvar mask;\n\n\n\t/* partition mask starts at the right */\n\n\tmask = maskTable[nBits];\n\tresult = 0;\n\tfor (i = 1; i <= nParts; i++) {\n\t\tp1 = SHR((sourceWord & mask), ((i - 1) * nBits));\n\t\tp2 = SHR((destWord & mask), ((i - 1) * nBits));\n\t\tif (nBits !== 32) {\n\t\t\tif (nBits === 16) {\n\t\t\t\tp1 = rgbMap16To32(p1) | 4278190080;\n\t\t\t\tp2 = rgbMap16To32(p2) | 4278190080;\n\t\t\t} else {\n\t\t\t\tp1 = rgbMapfromto(p1, nBits, 32) | 4278190080;\n\t\t\t\tp2 = rgbMapfromto(p2, nBits, 32) | 4278190080;\n\t\t\t}\n\t\t}\n\t\tv = rgbComponentAlpha32with(p1, p2);\n\t\tif (nBits !== 32) {\n\t\t\tv = rgbMapfromto(v, 32, nBits);\n\t\t}\n\t\tresult = result | (SHL(v, ((i - 1) * nBits)));\n\n\t\t/* slide left to next partition */\n\n\t\tmask = SHL(mask, nBits);\n\t}\n\treturn result;\n}\n\n\n/*\tSubtract word1 from word2 as nParts partitions of nBits each.\n\tThis is useful for packed pixels, or packed colors */\n/*\tIn C, most arithmetic operations answer the same bit pattern regardless of the operands being signed or unsigned ints\n\t(this is due to the way 2's complement numbers work). However, comparisions might fail. Add the proper declaration of\n\twords as unsigned int in those cases where comparisions are done (jmv) */\n\nfunction partitionedSubfromnBitsnPartitions(word1, word2, nBits, nParts) {\n\tvar p2;\n\tvar result;\n\tvar p1;\n\tvar i;\n\tvar mask;\n\n\n\t/* partition mask starts at the right */\n\n\tmask = maskTable[nBits];\n\tresult = 0;\n\tfor (i = 1; i <= nParts; i++) {\n\t\tp1 = word1 & mask;\n\t\tp2 = word2 & mask;\n\t\tif (p1 < p2) {\n\n\t\t\t/* result is really abs value of thedifference */\n\n\t\t\tresult = result | (p2 - p1);\n\t\t} else {\n\t\t\tresult = result | (p1 - p2);\n\t\t}\n\n\t\t/* slide left to next partition */\n\n\t\tmask = SHL(mask, nBits);\n\t}\n\treturn result;\n}\n\n\n/*\tBased on the values provided during setup choose and\n\tperform the appropriate inner loop function. */\n/*\tShould be inlined into caller for speed */\n\nfunction performCopyLoop() {\n\tdestMaskAndPointerInit();\n\tif (noSource) {\n\n\t\t/* Simple fill loop */\n\n\t\tcopyLoopNoSource();\n\t} else {\n\n\t\t/* Loop using source and dest */\n\n\t\tcheckSourceOverlap();\n\t\tif ((sourceDepth !== destDepth) || ((cmFlags !== 0) || (sourceMSB !== destMSB))) {\n\n\t\t\t/* If we must convert between pixel depths or use\n\t\t\tcolor lookups or swap pixels use the general version */\n\n\t\t\tcopyLoopPixMap();\n\t\t} else {\n\n\t\t\t/* Otherwise we simple copy pixels and can use a faster version */\n\n\t\t\tsourceSkewAndPointerInit();\n\t\t\tcopyLoop();\n\t\t}\n\t}\n}\n\n\n/*\tPick nPix pixels starting at srcBitIndex from the source, map by the\n\tcolor map, and justify them according to dstBitIndex in the resulting destWord. */\n\nfunction pickSourcePixelsflagssrcMaskdestMasksrcShiftIncdstShiftInc(nPixels, mapperFlags, srcMask, dstMask, srcShiftInc, dstShiftInc) {\n\tvar sourcePix;\n\tvar srcShift;\n\tvar sourceWord;\n\tvar dstShift;\n\tvar destPix;\n\tvar nPix;\n\tvar destWord;\n\n\n\t/* oh please */\n\n\tsourceWord = sourceBits[sourceIndex >>> 2];\n\tdestWord = 0;\n\n\t/* Hint: Keep in register */\n\n\tsrcShift = srcBitShift;\n\n\t/* Hint: Keep in register */\n\n\tdstShift = dstBitShift;\n\n\t/* always > 0 so we can use do { } while(--nPix); */\n\n\tnPix = nPixels;\n\tif (mapperFlags === (ColorMapPresent | ColorMapIndexedPart)) {\n\n\t\t/* a little optimization for (pretty crucial) blits using indexed lookups only */\n\t\t/* grab, colormap and mix in pixel */\n\n\t\tdo {\n\t\t\tsourcePix = (SHR(sourceWord, srcShift)) & srcMask;\n\t\t\tdestPix = cmLookupTable[sourcePix & cmMask];\n\n\t\t\t/* adjust dest pix index */\n\n\t\t\tdestWord = destWord | (SHL((destPix & dstMask), dstShift));\n\n\t\t\t/* adjust source pix index */\n\n\t\t\tdstShift += dstShiftInc;\n\t\t\tif ((((srcShift += srcShiftInc)) & 4294967264) !== 0) {\n\t\t\t\tif (sourceMSB) {\n\t\t\t\t\tsrcShift += 32;\n\t\t\t\t} else {\n\t\t\t\t\tsrcShift -= 32;\n\t\t\t\t}\n\t\t\t\tsourceWord = sourceBits[(sourceIndex += 4) >>> 2];\n\t\t\t}\n\t\t} while(!(((--nPix)) === 0));\n\t} else {\n\n\t\t/* grab, colormap and mix in pixel */\n\n\t\tdo {\n\t\t\tsourcePix = (SHR(sourceWord, srcShift)) & srcMask;\n\t\t\tdestPix = mapPixelflags(sourcePix, mapperFlags);\n\n\t\t\t/* adjust dest pix index */\n\n\t\t\tdestWord = destWord | (SHL((destPix & dstMask), dstShift));\n\n\t\t\t/* adjust source pix index */\n\n\t\t\tdstShift += dstShiftInc;\n\t\t\tif ((((srcShift += srcShiftInc)) & 4294967264) !== 0) {\n\t\t\t\tif (sourceMSB) {\n\t\t\t\t\tsrcShift += 32;\n\t\t\t\t} else {\n\t\t\t\t\tsrcShift -= 32;\n\t\t\t\t}\n\t\t\t\tsourceWord = sourceBits[(sourceIndex += 4) >>> 2];\n\t\t\t}\n\t\t} while(!(((--nPix)) === 0));\n\t}\n\n\t/* Store back */\n\n\tsrcBitShift = srcShift;\n\treturn destWord;\n}\n\n\n/*\tPick a single pixel from the source for WarpBlt.\n\tNote: This method is crucial for WarpBlt speed w/o smoothing\n\tand still relatively important when smoothing is used. */\n\nfunction pickWarpPixelAtXy(xx, yy) {\n\tvar sourcePix;\n\tvar sourceWord;\n\tvar srcIndex;\n\tvar x;\n\tvar y;\n\n\n\t/* *please* */\n\t/* note: it would be much faster if we could just\n\tavoid these stupid tests for being inside sourceForm. */\n\n\tif ((xx < 0) || ((yy < 0) || ((((x = xx >>> 14)) >= sourceWidth) || (((y = yy >>> 14)) >= sourceHeight)))) {\n\t\treturn 0;\n\t}\n\tsrcIndex = ((y * sourcePitch)) + ((SHR(x, warpAlignShift)) * 4);\n\n\t/* Extract pixel from word */\n\n\tsourceWord = sourceBits[srcIndex >>> 2];\n\tsrcBitShift = warpBitShiftTable[x & warpAlignMask];\n\tsourcePix = (SHR(sourceWord, srcBitShift)) & warpSrcMask;\n\treturn sourcePix;\n}\n\n\n/*\tClear all pixels in destinationWord for which the pixels of sourceWord have the same values. Used to clear areas of some constant color to zero. */\n\nfunction pixClearwith(sourceWord, destinationWord) {\n\tvar pv;\n\tvar nBits;\n\tvar result;\n\tvar i;\n\tvar mask;\n\n\tif (destDepth === 32) {\n\t\tif (sourceWord === destinationWord) {\n\t\t\treturn 0;\n\t\t} else {\n\t\t\treturn destinationWord;\n\t\t}\n\t}\n\tnBits = destDepth;\n\n\t/* partition mask starts at the right */\n\n\tmask = maskTable[nBits];\n\tresult = 0;\n\tfor (i = 1; i <= destPPW; i++) {\n\t\tpv = destinationWord & mask;\n\t\tif ((sourceWord & mask) === pv) {\n\t\t\tpv = 0;\n\t\t}\n\t\tresult = result | pv;\n\n\t\t/* slide left to next partition */\n\n\t\tmask = SHL(mask, nBits);\n\t}\n\treturn result;\n}\n\nfunction pixMaskwith(sourceWord, destinationWord) {\n\treturn partitionedANDtonBitsnPartitions(~sourceWord, destinationWord, destDepth, destPPW);\n}\n\nfunction pixPaintwith(sourceWord, destinationWord) {\n\tif (sourceWord === 0) {\n\t\treturn destinationWord;\n\t}\n\treturn sourceWord | partitionedANDtonBitsnPartitions(~sourceWord, destinationWord, destDepth, destPPW);\n}\n\n\n/*\tSwap the pixels in destWord */\n\nfunction pixSwapwith(sourceWord, destWord) {\n\tvar result;\n\tvar shift;\n\tvar lowMask;\n\tvar highMask;\n\tvar i;\n\n\tif (destPPW === 1) {\n\t\treturn destWord;\n\t}\n\tresult = 0;\n\n\t/* mask low pixel */\n\n\tlowMask = (SHL(1, destDepth)) - 1;\n\n\t/* mask high pixel */\n\n\thighMask = SHL(lowMask, ((destPPW - 1) * destDepth));\n\tshift = 32 - destDepth;\n\tresult = result | ((SHL((destWord & lowMask), shift)) | (SHR((destWord & highMask), shift)));\n\tif (destPPW <= 2) {\n\t\treturn result;\n\t}\n\tfor (i = 2; i <= (destPPW >> 1); i++) {\n\t\tlowMask = SHL(lowMask, destDepth);\n\t\thighMask = SHR(highMask, destDepth);\n\t\tshift -= destDepth * 2;\n\t\tresult = result | ((SHL((destWord & lowMask), shift)) | (SHR((destWord & highMask), shift)));\n\t}\n\treturn result;\n}\n\n\n/*\tInvoke the copyBits primitive. If the destination is the display, then copy it to the screen. */\n\nfunction primitiveCopyBits() {\n\tvar rcvr;\n\n\trcvr = interpreterProxy.stackValue(interpreterProxy.methodArgumentCount());\n\tif (!loadBitBltFrom(rcvr)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tcopyBits();\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tshowDisplayBits();\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(interpreterProxy.methodArgumentCount());\n\tif ((combinationRule === 22) || (combinationRule === 32)) {\n\t\tinterpreterProxy.pop(1);\n\t\treturn interpreterProxy.pushInteger(bitCount);\n\t}\n}\n\nfunction primitiveDisplayString() {\n\tvar charIndex;\n\tvar sourcePtr;\n\tvar stopIndex;\n\tvar bbObj;\n\tvar xTable;\n\tvar maxGlyph;\n\tvar quickBlt;\n\tvar glyphIndex;\n\tvar glyphMap;\n\tvar left;\n\tvar kernDelta;\n\tvar startIndex;\n\tvar ascii;\n\tvar sourceString;\n\n\tif (interpreterProxy.methodArgumentCount() !== 6) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tkernDelta = interpreterProxy.stackIntegerValue(0);\n\txTable = interpreterProxy.stackObjectValue(1);\n\tglyphMap = interpreterProxy.stackObjectValue(2);\n\tif (!((CLASSOF(xTable) === interpreterProxy.classArray()) && (CLASSOF(glyphMap) === interpreterProxy.classArray()))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (SIZEOF(glyphMap) !== 256) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tmaxGlyph = SIZEOF(xTable) - 2;\n\tstopIndex = interpreterProxy.stackIntegerValue(3);\n\tstartIndex = interpreterProxy.stackIntegerValue(4);\n\tsourceString = interpreterProxy.stackObjectValue(5);\n\tif (!interpreterProxy.isBytes(sourceString)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!((startIndex > 0) && ((stopIndex > 0) && (stopIndex <= BYTESIZEOF(sourceString))))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tbbObj = interpreterProxy.stackObjectValue(6);\n\tif (!loadBitBltFrom(bbObj)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif ((combinationRule === 30) || (combinationRule === 31)) {\n\n\t\t/* needs extra source alpha */\n\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tquickBlt = (destBits !== 0) && ((sourceBits !== 0) && ((noSource === false) && ((sourceForm !== destForm) && ((cmFlags !== 0) || ((sourceMSB !== destMSB) || (sourceDepth !== destDepth))))));\n\tleft = destX;\n\tsourcePtr = sourceString.bytes;\n\tfor (charIndex = startIndex; charIndex <= stopIndex; charIndex++) {\n\t\tascii = sourcePtr[charIndex - 1];\n\t\tglyphIndex = interpreterProxy.fetchIntegerofObject(ascii, glyphMap);\n\t\tif ((glyphIndex < 0) || (glyphIndex > maxGlyph)) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\tsourceX = interpreterProxy.fetchIntegerofObject(glyphIndex, xTable);\n\t\twidth = interpreterProxy.fetchIntegerofObject(glyphIndex + 1, xTable) - sourceX;\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tclipRange();\n\t\tif ((bbW > 0) && (bbH > 0)) {\n\t\t\tif (quickBlt) {\n\t\t\t\tdestMaskAndPointerInit();\n\t\t\t\tcopyLoopPixMap();\n\t\t\t\taffectedL = dx;\n\t\t\t\taffectedR = dx + bbW;\n\t\t\t\taffectedT = dy;\n\t\t\t\taffectedB = dy + bbH;\n\t\t\t} else {\n\t\t\t\tcopyBits();\n\t\t\t}\n\t\t}\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tdestX = (destX + width) + kernDelta;\n\t}\n\taffectedL = left;\n\tshowDisplayBits();\n\tinterpreterProxy.storeIntegerofObjectwithValue(BBDestXIndex, bbObj, destX);\n\tinterpreterProxy.pop(6);\n}\n\n\n/*\tInvoke the line drawing primitive. */\n\nfunction primitiveDrawLoop() {\n\tvar yDelta;\n\tvar rcvr;\n\tvar xDelta;\n\n\trcvr = interpreterProxy.stackValue(2);\n\txDelta = interpreterProxy.stackIntegerValue(1);\n\tyDelta = interpreterProxy.stackIntegerValue(0);\n\tif (!loadBitBltFrom(rcvr)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!interpreterProxy.failed()) {\n\t\tdrawLoopXY(xDelta, yDelta);\n\t\tshowDisplayBits();\n\t}\n\tif (!interpreterProxy.failed()) {\n\t\tinterpreterProxy.pop(2);\n\t}\n}\n\n\n/*\treturns the single pixel at x@y.\n\tIt does not handle LSB bitmaps right now.\n\tIf x or y are < 0, return 0 to indicate transparent (cf BitBlt>bitPeekerFromForm: usage).\n\tLikewise if x>width or y>depth.\n\tFail if the rcvr doesn't seem to be a Form, or x|y seem wrong */\n\nfunction primitivePixelValueAt() {\n\tvar pixel;\n\tvar rcvr;\n\tvar shift;\n\tvar depth;\n\tvar bitmap;\n\tvar ppW;\n\tvar word;\n\tvar stride;\n\tvar bitsSize;\n\tvar mask;\n\tvar xVal;\n\tvar yVal;\n\tvar _return_value;\n\n\txVal = interpreterProxy.stackIntegerValue(1);\n\tyVal = interpreterProxy.stackIntegerValue(0);\n\trcvr = interpreterProxy.stackValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif ((xVal < 0) || (yVal < 0)) {\n\t\t_return_value = 0;\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\treturn null;\n\t}\n\trcvr = interpreterProxy.stackValue(interpreterProxy.methodArgumentCount());\n\tif (!(interpreterProxy.isPointers(rcvr) && (SIZEOF(rcvr) >= 4))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tbitmap = interpreterProxy.fetchPointerofObject(FormBitsIndex, rcvr);\n\tif (!interpreterProxy.isWordsOrBytes(bitmap)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\twidth = interpreterProxy.fetchIntegerofObject(FormWidthIndex, rcvr);\n\theight = interpreterProxy.fetchIntegerofObject(FormHeightIndex, rcvr);\n\n\t/* if width/height/depth are not integer, fail */\n\n\tdepth = interpreterProxy.fetchIntegerofObject(FormDepthIndex, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif ((xVal >= width) || (yVal >= height)) {\n\t\t_return_value = 0;\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\treturn null;\n\t}\n\tif (depth < 0) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\n\t/* pixels in each word */\n\n\tppW = DIV(32, depth);\n\n\t/* how many words per row of pixels */\n\n\tstride = DIV((width + (ppW - 1)), ppW);\n\tbitsSize = BYTESIZEOF(bitmap);\n\tif (bitsSize !== ((stride * height) * 4)) {\n\n\t\t/* bytes per word */\n\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\n\t/* load the word that contains our target */\n\n\tword = interpreterProxy.fetchLong32ofObject((yVal * stride) + (DIV(xVal, ppW)), bitmap);\n\n\t/* make a mask to isolate the pixel within that word */\n\n\tmask = SHR(4294967295, (32 - depth));\n\n\t/* this is the tricky MSB part - we mask the xVal to find how far into the word we need, then add 1 for the pixel we're looking for, then * depth to get the bit shift */\n\n\tshift = 32 - (((xVal & (ppW - 1)) + 1) * depth);\n\n\t/* shift, mask and dim the lights */\n\n\tpixel = (SHR(word, shift)) & mask;\n\t_return_value = interpreterProxy.positive32BitIntegerFor(pixel);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(3, _return_value);\n\treturn null;\n}\n\n\n/*\tInvoke the warpBits primitive. If the destination is the display, then copy it to the screen. */\n\nfunction primitiveWarpBits() {\n\tvar rcvr;\n\n\trcvr = interpreterProxy.stackValue(interpreterProxy.methodArgumentCount());\n\tif (!loadWarpBltFrom(rcvr)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\twarpBits();\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tshowDisplayBits();\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(interpreterProxy.methodArgumentCount());\n}\n\n\n/*\tQuery the dimension of an OS surface.\n\tThis method is provided so that in case the inst vars of the\n\tsource form are broken, *actual* values of the OS surface\n\tcan be obtained. This might, for instance, happen if the user\n\tresizes the main window.\n\tNote: Moved to a separate function for better inlining of the caller. */\n\nfunction queryDestSurface(handle) {\n\tif (!querySurfaceFn) {\n\t\tif (!loadSurfacePlugin()) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn querySurfaceFn(handle, function(w, h, d, m){destWidth = w; destHeight = h; destDepth = d; destMSB = m; });\n}\n\n\n/*\tQuery the dimension of an OS surface.\n\tThis method is provided so that in case the inst vars of the\n\tsource form are broken, *actual* values of the OS surface\n\tcan be obtained. This might, for instance, happen if the user\n\tresizes the main window.\n\tNote: Moved to a separate function for better inlining of the caller. */\n\nfunction querySourceSurface(handle) {\n\tif (!querySurfaceFn) {\n\t\tif (!loadSurfacePlugin()) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn querySurfaceFn(handle, function(w, h, d, m){sourceWidth = w; sourceHeight = h; sourceDepth = d; sourceMSB = m; });\n}\n\nfunction rgbAddwith(sourceWord, destinationWord) {\n\tvar carryOverflowMask;\n\tvar componentMask;\n\n\tif (destDepth < 16) {\n\n\t\t/* Add each pixel separately */\n\n\t\tcomponentMask = (SHL(1, destDepth)) - 1;\n\t\tcarryOverflowMask = SHL((DIV(4294967295, componentMask)), (destDepth - 1));\n\t\treturn partitionedAddtonBitscomponentMaskcarryOverflowMask(sourceWord, destinationWord, destDepth, componentMask, carryOverflowMask);\n\t}\n\tif (destDepth === 16) {\n\n\t\t/* Add RGB components of each pixel separately */\n\n\t\tcomponentMask = 31;\n\t\tcarryOverflowMask = 1108361744;\n\t\treturn partitionedAddtonBitscomponentMaskcarryOverflowMask(sourceWord & 2147450879, destinationWord & 2147450879, 5, componentMask, carryOverflowMask);\n\t} else {\n\n\t\t/* Add RGBA components of the pixel separately */\n\n\t\tcomponentMask = 255;\n\t\tcarryOverflowMask = 2155905152;\n\t\treturn partitionedAddtonBitscomponentMaskcarryOverflowMask(sourceWord, destinationWord, 8, componentMask, carryOverflowMask);\n\t}\n}\n\n\n/*\tThis version assumes \n\t\tcombinationRule = 41\n\t\tsourcePixSize = 32\n\t\tdestPixSize = 16\n\t\tsourceForm ~= destForm.\n\t */\n/*\tThis particular method should be optimized in itself */\n\nfunction rgbComponentAlpha16() {\n\tvar ditherBase;\n\tvar ditherThreshold;\n\tvar srcShift;\n\tvar sourceWord;\n\tvar srcIndex;\n\tvar deltaX;\n\tvar dstIndex;\n\tvar srcAlpha;\n\tvar dstMask;\n\tvar deltaY;\n\tvar srcY;\n\tvar destWord;\n\tvar dstY;\n\tvar ditherIndex;\n\n\n\t/* So we can pre-decrement */\n\n\tdeltaY = bbH + 1;\n\tsrcY = sy;\n\tdstY = dy;\n\tsrcShift = (dx & 1) * 16;\n\tif (destMSB) {\n\t\tsrcShift = 16 - srcShift;\n\t}\n\n\t/* This is the outer loop */\n\n\tmask1 = SHL(65535, (16 - srcShift));\n\twhile (((--deltaY)) !== 0) {\n\t\tsrcIndex = ((srcY * sourcePitch)) + (sx * 4);\n\t\tdstIndex = ((dstY * destPitch)) + ((dx >> 1) * 4);\n\t\tditherBase = (dstY & 3) * 4;\n\n\t\t/* For pre-increment */\n\n\t\tditherIndex = (sx & 3) - 1;\n\n\t\t/* So we can pre-decrement */\n\n\t\tdeltaX = bbW + 1;\n\t\tdstMask = mask1;\n\t\tif (dstMask === 65535) {\n\t\t\tsrcShift = 16;\n\t\t} else {\n\t\t\tsrcShift = 0;\n\t\t}\n\t\twhile (((--deltaX)) !== 0) {\n\t\t\tditherThreshold = ditherMatrix4x4[ditherBase + ((ditherIndex = (ditherIndex + 1) & 3))];\n\t\t\tsourceWord = sourceBits[srcIndex >>> 2];\n\t\t\tsrcAlpha = sourceWord & 16777215;\n\t\t\tif (srcAlpha !== 0) {\n\n\t\t\t\t/* 0 < srcAlpha */\n\t\t\t\t/* If we have to mix colors then just copy a single word */\n\n\t\t\t\tdestWord = destBits[dstIndex >>> 2];\n\t\t\t\tdestWord = destWord & ~dstMask;\n\n\t\t\t\t/* Expand from 16 to 32 bit by adding zero bits */\n\n\t\t\t\tdestWord = SHR(destWord, srcShift);\n\n\t\t\t\t/* Mix colors */\n\n\t\t\t\tdestWord = (((destWord & 31744) << 9) | ((destWord & 992) << 6)) | (((destWord & 31) << 3) | 4278190080);\n\n\t\t\t\t/* And dither */\n\n\t\t\t\tsourceWord = rgbComponentAlpha32with(sourceWord, destWord);\n\t\t\t\tsourceWord = dither32To16threshold(sourceWord, ditherThreshold);\n\t\t\t\tif (sourceWord === 0) {\n\t\t\t\t\tsourceWord = SHL(1, srcShift);\n\t\t\t\t} else {\n\t\t\t\t\tsourceWord = SHL(sourceWord, srcShift);\n\t\t\t\t}\n\t\t\t\tdstLongAtputmask(dstIndex, sourceWord, dstMask);\n\t\t\t}\n\t\t\tsrcIndex += 4;\n\t\t\tif (destMSB) {\n\t\t\t\tif (srcShift === 0) {\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (srcShift !== 0) {\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Toggle between 0 and 16 */\n\n\t\t\tsrcShift = srcShift ^ 16;\n\t\t\tdstMask = ~dstMask;\n\t\t}\n\t\t++srcY;\n\t\t++dstY;\n\t}\n}\n\n\n/*\tThis version assumes \n\t\tcombinationRule = 41\n\t\tsourcePixSize = destPixSize = 32\n\t\tsourceForm ~= destForm.\n\tNote: The inner loop has been optimized for dealing\n\t\twith the special case of aR = aG = aB = 0 \n\t */\n\nfunction rgbComponentAlpha32() {\n\tvar sourceWord;\n\tvar srcIndex;\n\tvar deltaX;\n\tvar dstIndex;\n\tvar srcAlpha;\n\tvar deltaY;\n\tvar srcY;\n\tvar destWord;\n\tvar dstY;\n\n\n\t/* This particular method should be optimized in itself */\n\t/* Give the compile a couple of hints */\n\t/* The following should be declared as pointers so the compiler will\n\tnotice that they're used for accessing memory locations \n\t(good to know on an Intel architecture) but then the increments\n\twould be different between ST code and C code so must hope the\n\tcompiler notices what happens (MS Visual C does) */\n\n\n\t/* So we can pre-decrement */\n\n\tdeltaY = bbH + 1;\n\tsrcY = sy;\n\n\t/* This is the outer loop */\n\n\tdstY = dy;\n\twhile (((--deltaY)) !== 0) {\n\t\tsrcIndex = ((srcY * sourcePitch)) + (sx * 4);\n\t\tdstIndex = ((dstY * destPitch)) + (dx * 4);\n\n\t\t/* So we can pre-decrement */\n\t\t/* This is the inner loop */\n\n\t\tdeltaX = bbW + 1;\n\t\twhile (((--deltaX)) !== 0) {\n\t\t\tsourceWord = sourceBits[srcIndex >>> 2];\n\t\t\tsrcAlpha = sourceWord & 16777215;\n\t\t\tif (srcAlpha === 0) {\n\t\t\t\tsrcIndex += 4;\n\n\t\t\t\t/* Now skip as many words as possible, */\n\n\t\t\t\tdstIndex += 4;\n\t\t\t\twhile ((((--deltaX)) !== 0) && ((((sourceWord = sourceBits[srcIndex >>> 2])) & 16777215) === 0)) {\n\t\t\t\t\tsrcIndex += 4;\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t}\n\t\t\t\t++deltaX;\n\t\t\t} else {\n\n\t\t\t\t/* 0 < srcAlpha */\n\t\t\t\t/* If we have to mix colors then just copy a single word */\n\n\t\t\t\tdestWord = destBits[dstIndex >>> 2];\n\t\t\t\tdestWord = rgbComponentAlpha32with(sourceWord, destWord);\n\t\t\t\tdestBits[dstIndex >>> 2] = destWord;\n\t\t\t\tsrcIndex += 4;\n\t\t\t\tdstIndex += 4;\n\t\t\t}\n\t\t}\n\t\t++srcY;\n\t\t++dstY;\n\t}\n}\n\n\n/*\t\n\tcomponentAlphaModeColor is the color,\n\tsourceWord contains an alpha value for each component of RGB\n\teach of which is encoded as0 meaning 0.0 and 255 meaning 1.0 .\n\tthe rule is...\n\t\n\tcolor = componentAlphaModeColor.\n\tcolorAlpha = componentAlphaModeAlpha.\n\tmask = sourceWord.\n\tdst.A = colorAlpha + (1 - colorAlpha) * dst.A\n dst.R = color.R * mask.R * colorAlpha + (1 - (mask.R * colorAlpha)) * dst.R\n dst.G = color.G * mask.G * colorAlpha + (1 - (mask.G* colorAlpha)) * dst.G\n dst.B = color.B * mask.B * colorAlpha + (1 - (mask.B* colorAlpha)) * dst.B\n\t */\n/*\tDo NOT inline this into optimized loops */\n\nfunction rgbComponentAlpha32with(sourceWord, destinationWord) {\n\tvar g;\n\tvar srcColor;\n\tvar aG;\n\tvar d;\n\tvar a;\n\tvar aA;\n\tvar aR;\n\tvar dstMask;\n\tvar srcAlpha;\n\tvar r;\n\tvar b;\n\tvar aB;\n\tvar alpha;\n\tvar answer;\n\tvar s;\n\n\talpha = sourceWord;\n\tif (alpha === 0) {\n\t\treturn destinationWord;\n\t}\n\tsrcColor = componentAlphaModeColor;\n\tsrcAlpha = componentAlphaModeAlpha & 255;\n\taB = alpha & 255;\n\talpha = alpha >>> 8;\n\taG = alpha & 255;\n\talpha = alpha >>> 8;\n\taR = alpha & 255;\n\talpha = alpha >>> 8;\n\taA = alpha & 255;\n\tif (srcAlpha !== 255) {\n\t\taA = (aA * srcAlpha) >>> 8;\n\t\taR = (aR * srcAlpha) >>> 8;\n\t\taG = (aG * srcAlpha) >>> 8;\n\t\taB = (aB * srcAlpha) >>> 8;\n\t}\n\tdstMask = destinationWord;\n\td = dstMask & 255;\n\ts = srcColor & 255;\n\tif (!!ungammaLookupTable) {\n\t\td = ungammaLookupTable[d];\n\t\ts = ungammaLookupTable[s];\n\t}\n\tb = ((d * (255 - aB)) >>> 8) + ((s * aB) >>> 8);\n\tif (b > 255) {\n\t\tb = 255;\n\t}\n\tif (!!gammaLookupTable) {\n\t\tb = gammaLookupTable[b];\n\t}\n\tdstMask = dstMask >>> 8;\n\tsrcColor = srcColor >>> 8;\n\td = dstMask & 255;\n\ts = srcColor & 255;\n\tif (!!ungammaLookupTable) {\n\t\td = ungammaLookupTable[d];\n\t\ts = ungammaLookupTable[s];\n\t}\n\tg = ((d * (255 - aG)) >>> 8) + ((s * aG) >>> 8);\n\tif (g > 255) {\n\t\tg = 255;\n\t}\n\tif (!!gammaLookupTable) {\n\t\tg = gammaLookupTable[g];\n\t}\n\tdstMask = dstMask >>> 8;\n\tsrcColor = srcColor >>> 8;\n\td = dstMask & 255;\n\ts = srcColor & 255;\n\tif (!!ungammaLookupTable) {\n\t\td = ungammaLookupTable[d];\n\t\ts = ungammaLookupTable[s];\n\t}\n\tr = ((d * (255 - aR)) >>> 8) + ((s * aR) >>> 8);\n\tif (r > 255) {\n\t\tr = 255;\n\t}\n\tif (!!gammaLookupTable) {\n\t\tr = gammaLookupTable[r];\n\t}\n\tdstMask = dstMask >>> 8;\n\tsrcColor = srcColor >>> 8;\n\n\t/* no need to gamma correct alpha value ? */\n\n\ta = (((dstMask & 255) * (255 - aA)) >>> 8) + aA;\n\tif (a > 255) {\n\t\ta = 255;\n\t}\n\tanswer = (((((a << 8) + r) << 8) + g) << 8) + b;\n\treturn answer;\n}\n\n\n/*\tThis version assumes \n\t\tcombinationRule = 41\n\t\tsourcePixSize = 32\n\t\tdestPixSize = 8\n\t\tsourceForm ~= destForm.\n\tNote: This is not real blending since we don't have the source colors available.\n\t */\n\nfunction rgbComponentAlpha8() {\n\tvar srcShift;\n\tvar sourceWord;\n\tvar srcIndex;\n\tvar deltaX;\n\tvar mappingTable;\n\tvar dstIndex;\n\tvar adjust;\n\tvar mapperFlags;\n\tvar srcAlpha;\n\tvar dstMask;\n\tvar deltaY;\n\tvar srcY;\n\tvar destWord;\n\tvar dstY;\n\n\n\t/* This particular method should be optimized in itself */\n\n\tmappingTable = default8To32Table();\n\tmapperFlags = cmFlags & ~ColorMapNewStyle;\n\n\t/* So we can pre-decrement */\n\n\tdeltaY = bbH + 1;\n\tsrcY = sy;\n\tdstY = dy;\n\tmask1 = (dx & 3) * 8;\n\tif (destMSB) {\n\t\tmask1 = 24 - mask1;\n\t}\n\tmask2 = AllOnes ^ (SHL(255, mask1));\n\tif ((dx & 1) === 0) {\n\t\tadjust = 0;\n\t} else {\n\t\tadjust = 522133279;\n\t}\n\tif ((dy & 1) === 0) {\n\t\tadjust = adjust ^ 522133279;\n\t}\n\twhile (((--deltaY)) !== 0) {\n\t\tadjust = adjust ^ 522133279;\n\t\tsrcIndex = ((srcY * sourcePitch)) + (sx * 4);\n\t\tdstIndex = ((dstY * destPitch)) + ((dx >> 2) * 4);\n\n\t\t/* So we can pre-decrement */\n\n\t\tdeltaX = bbW + 1;\n\t\tsrcShift = mask1;\n\n\t\t/* This is the inner loop */\n\n\t\tdstMask = mask2;\n\t\twhile (((--deltaX)) !== 0) {\n\t\t\tsourceWord = (sourceBits[srcIndex >>> 2] & ~adjust) + adjust;\n\n\t\t\t/* set srcAlpha to the average of the 3 separate aR,Ag,AB values */\n\n\t\t\tsrcAlpha = sourceWord & 16777215;\n\t\t\tsrcAlpha = DIV((((srcAlpha >>> 16) + ((srcAlpha >>> 8) & 255)) + (srcAlpha & 255)), 3);\n\t\t\tif (srcAlpha > 31) {\n\n\t\t\t\t/* Everything below 31 is transparent */\n\n\t\t\t\tif (srcAlpha > 224) {\n\n\t\t\t\t\t/* treat everything above 224 as opaque */\n\n\t\t\t\t\tsourceWord = 4294967295;\n\t\t\t\t}\n\t\t\t\tdestWord = destBits[dstIndex >>> 2];\n\t\t\t\tdestWord = destWord & ~dstMask;\n\t\t\t\tdestWord = SHR(destWord, srcShift);\n\t\t\t\tdestWord = mappingTable[destWord];\n\t\t\t\tsourceWord = rgbComponentAlpha32with(sourceWord, destWord);\n\t\t\t\tsourceWord = mapPixelflags(sourceWord, mapperFlags);\n\n\t\t\t\t/* Store back */\n\n\t\t\t\tsourceWord = SHL(sourceWord, srcShift);\n\t\t\t\tdstLongAtputmask(dstIndex, sourceWord, dstMask);\n\t\t\t}\n\t\t\tsrcIndex += 4;\n\t\t\tif (destMSB) {\n\t\t\t\tif (srcShift === 0) {\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t\tsrcShift = 24;\n\t\t\t\t\tdstMask = 16777215;\n\t\t\t\t} else {\n\t\t\t\t\tsrcShift -= 8;\n\t\t\t\t\tdstMask = (dstMask >>> 8) | 4278190080;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (srcShift === 32) {\n\t\t\t\t\tdstIndex += 4;\n\t\t\t\t\tsrcShift = 0;\n\t\t\t\t\tdstMask = 4294967040;\n\t\t\t\t} else {\n\t\t\t\t\tsrcShift += 8;\n\t\t\t\t\tdstMask = (dstMask << 8) | 255;\n\t\t\t\t}\n\t\t\t}\n\t\t\tadjust = adjust ^ 522133279;\n\t\t}\n\t\t++srcY;\n\t\t++dstY;\n\t}\n}\n\n\n/*\t\n\tcomponentAlphaModeColor is the color,\n\tsourceWord contains an alpha value for each component of RGB\n\teach of which is encoded as0 meaning 0.0 and 255 meaning 1.0 .\n\tthe rule is...\n\t\n\tcolor = componentAlphaModeColor.\n\tcolorAlpha = componentAlphaModeAlpha.\n\tmask = sourceWord.\n\tdst.A = colorAlpha + (1 - colorAlpha) * dst.A\n dst.R = color.R * mask.R * colorAlpha + (1 - (mask.R * colorAlpha)) * dst.R\n dst.G = color.G * mask.G * colorAlpha + (1 - (mask.G* colorAlpha)) * dst.G\n dst.B = color.B * mask.B * colorAlpha + (1 - (mask.B* colorAlpha)) * dst.B\n\t */\n/*\tDo NOT inline this into optimized loops */\n\nfunction rgbComponentAlphawith(sourceWord, destinationWord) {\n\tvar alpha;\n\n\talpha = sourceWord;\n\tif (alpha === 0) {\n\t\treturn destinationWord;\n\t}\n\treturn partitionedRgbComponentAlphadestnBitsnPartitions(sourceWord, destinationWord, destDepth, destPPW);\n}\n\n\n/*\tSubract the pixels in the source and destination, color by color,\n\tand return the sum of the absolute value of all the differences.\n\tFor non-rgb, return the number of differing pixels. */\n\nfunction rgbDiffwith(sourceWord, destinationWord) {\n\tvar sourcePixVal;\n\tvar bitsPerColor;\n\tvar diff;\n\tvar sourceShifted;\n\tvar pixMask;\n\tvar rgbMask;\n\tvar destShifted;\n\tvar i;\n\tvar maskShifted;\n\tvar destPixVal;\n\n\tpixMask = maskTable[destDepth];\n\tif (destDepth === 16) {\n\t\tbitsPerColor = 5;\n\t\trgbMask = 31;\n\t} else {\n\t\tbitsPerColor = 8;\n\t\trgbMask = 255;\n\t}\n\tmaskShifted = destMask;\n\tdestShifted = destinationWord;\n\tsourceShifted = sourceWord;\n\tfor (i = 1; i <= destPPW; i++) {\n\t\tif ((maskShifted & pixMask) > 0) {\n\n\t\t\t/* Only tally pixels within the destination rectangle */\n\n\t\t\tdestPixVal = destShifted & pixMask;\n\t\t\tsourcePixVal = sourceShifted & pixMask;\n\t\t\tif (destDepth < 16) {\n\t\t\t\tif (sourcePixVal === destPixVal) {\n\t\t\t\t\tdiff = 0;\n\t\t\t\t} else {\n\t\t\t\t\tdiff = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdiff = partitionedSubfromnBitsnPartitions(sourcePixVal, destPixVal, bitsPerColor, 3);\n\t\t\t\tdiff = ((diff & rgbMask) + ((SHR(diff, bitsPerColor)) & rgbMask)) + ((SHR((SHR(diff, bitsPerColor)), bitsPerColor)) & rgbMask);\n\t\t\t}\n\t\t\tbitCount += diff;\n\t\t}\n\t\tmaskShifted = SHR(maskShifted, destDepth);\n\t\tsourceShifted = SHR(sourceShifted, destDepth);\n\t\tdestShifted = SHR(destShifted, destDepth);\n\t}\n\treturn destinationWord;\n}\n\n\n/*\tConvert the given 16bit pixel value to a 32bit RGBA value.\n \tNote: This method is intended to deal with different source formats. */\n\nfunction rgbMap16To32(sourcePixel) {\n\treturn (((sourcePixel & 31) << 3) | ((sourcePixel & 992) << 6)) | ((sourcePixel & 31744) << 9);\n}\n\n\n/*\tConvert the given 32bit pixel value to a 32bit RGBA value.\n \tNote: This method is intended to deal with different source formats. */\n\nfunction rgbMap32To32(sourcePixel) {\n\treturn sourcePixel;\n}\n\n\n/*\tConvert the given pixel value with nBitsIn bits for each color component to a pixel value with nBitsOut bits for each color component. Typical values for nBitsIn/nBitsOut are 3, 5, or 8. */\n\nfunction rgbMapfromto(sourcePixel, nBitsIn, nBitsOut) {\n\tvar d;\n\tvar destPix;\n\tvar srcPix;\n\tvar mask;\n\n\tif (((d = nBitsOut - nBitsIn)) > 0) {\n\n\t\t/* Expand to more bits by zero-fill */\n\n\n\t\t/* Transfer mask */\n\n\t\tmask = (SHL(1, nBitsIn)) - 1;\n\t\tsrcPix = SHL(sourcePixel, d);\n\t\tmask = SHL(mask, d);\n\t\tdestPix = srcPix & mask;\n\t\tmask = SHL(mask, nBitsOut);\n\t\tsrcPix = SHL(srcPix, d);\n\t\treturn (destPix + (srcPix & mask)) + ((SHL(srcPix, d)) & (SHL(mask, nBitsOut)));\n\t} else {\n\n\t\t/* Compress to fewer bits by truncation */\n\n\t\tif (d === 0) {\n\t\t\tif (nBitsIn === 5) {\n\n\t\t\t\t/* Sometimes called with 16 bits, though pixel is 15,\n\t\t\t\t\tbut we must never return more than 15. */\n\n\t\t\t\treturn sourcePixel & 32767;\n\t\t\t}\n\t\t\tif (nBitsIn === 8) {\n\n\t\t\t\t/* Sometimes called with 32 bits, though pixel is 24,\n\t\t\t\t\tbut we must never return more than 24. */\n\n\t\t\t\treturn sourcePixel & 16777215;\n\t\t\t}\n\t\t\treturn sourcePixel;\n\t\t}\n\t\tif (sourcePixel === 0) {\n\t\t\treturn sourcePixel;\n\t\t}\n\t\td = nBitsIn - nBitsOut;\n\n\t\t/* Transfer mask */\n\n\t\tmask = (SHL(1, nBitsOut)) - 1;\n\t\tsrcPix = SHR(sourcePixel, d);\n\t\tdestPix = srcPix & mask;\n\t\tmask = SHL(mask, nBitsOut);\n\t\tsrcPix = SHR(srcPix, d);\n\t\tdestPix = (destPix + (srcPix & mask)) + ((SHR(srcPix, d)) & (SHL(mask, nBitsOut)));\n\t\tif (destPix === 0) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn destPix;\n\t}\n}\n\n\n/*\tPerform the RGBA conversion for the given source pixel */\n\nfunction rgbMapPixelflags(sourcePixel, mapperFlags) {\n\tvar val;\n\n\tval = SHIFT((sourcePixel & cmMaskTable[0]), cmShiftTable[0]);\n\tval = val | (SHIFT((sourcePixel & cmMaskTable[1]), cmShiftTable[1]));\n\tval = val | (SHIFT((sourcePixel & cmMaskTable[2]), cmShiftTable[2]));\n\treturn val | (SHIFT((sourcePixel & cmMaskTable[3]), cmShiftTable[3]));\n}\n\nfunction rgbMaxwith(sourceWord, destinationWord) {\n\tif (destDepth < 16) {\n\n\t\t/* Max each pixel separately */\n\n\t\treturn partitionedMaxwithnBitsnPartitions(sourceWord, destinationWord, destDepth, destPPW);\n\t}\n\tif (destDepth === 16) {\n\n\t\t/* Max RGB components of each pixel separately */\n\n\t\treturn partitionedMaxwithnBitsnPartitions(sourceWord, destinationWord, 5, 3) + (partitionedMaxwithnBitsnPartitions(sourceWord >>> 16, destinationWord >>> 16, 5, 3) << 16);\n\t} else {\n\n\t\t/* Max RGBA components of the pixel separately */\n\n\t\treturn partitionedMaxwithnBitsnPartitions(sourceWord, destinationWord, 8, 4);\n\t}\n}\n\nfunction rgbMinwith(sourceWord, destinationWord) {\n\tif (destDepth < 16) {\n\n\t\t/* Min each pixel separately */\n\n\t\treturn partitionedMinwithnBitsnPartitions(sourceWord, destinationWord, destDepth, destPPW);\n\t}\n\tif (destDepth === 16) {\n\n\t\t/* Min RGB components of each pixel separately */\n\n\t\treturn partitionedMinwithnBitsnPartitions(sourceWord, destinationWord, 5, 3) + (partitionedMinwithnBitsnPartitions(sourceWord >>> 16, destinationWord >>> 16, 5, 3) << 16);\n\t} else {\n\n\t\t/* Min RGBA components of the pixel separately */\n\n\t\treturn partitionedMinwithnBitsnPartitions(sourceWord, destinationWord, 8, 4);\n\t}\n}\n\nfunction rgbMinInvertwith(wordToInvert, destinationWord) {\n\tvar sourceWord;\n\n\tsourceWord = ~wordToInvert;\n\tif (destDepth < 16) {\n\n\t\t/* Min each pixel separately */\n\n\t\treturn partitionedMinwithnBitsnPartitions(sourceWord, destinationWord, destDepth, destPPW);\n\t}\n\tif (destDepth === 16) {\n\n\t\t/* Min RGB components of each pixel separately */\n\n\t\treturn partitionedMinwithnBitsnPartitions(sourceWord, destinationWord, 5, 3) + (partitionedMinwithnBitsnPartitions(sourceWord >>> 16, destinationWord >>> 16, 5, 3) << 16);\n\t} else {\n\n\t\t/* Min RGBA components of the pixel separately */\n\n\t\treturn partitionedMinwithnBitsnPartitions(sourceWord, destinationWord, 8, 4);\n\t}\n}\n\nfunction rgbMulwith(sourceWord, destinationWord) {\n\tif (destDepth < 16) {\n\n\t\t/* Mul each pixel separately */\n\n\t\treturn partitionedMulwithnBitsnPartitions(sourceWord, destinationWord, destDepth, destPPW);\n\t}\n\tif (destDepth === 16) {\n\n\t\t/* Mul RGB components of each pixel separately */\n\n\t\treturn partitionedMulwithnBitsnPartitions(sourceWord, destinationWord, 5, 3) + (partitionedMulwithnBitsnPartitions(sourceWord >>> 16, destinationWord >>> 16, 5, 3) << 16);\n\t} else {\n\n\t\t/* Mul RGBA components of the pixel separately */\n\n\t\treturn partitionedMulwithnBitsnPartitions(sourceWord, destinationWord, 8, 4);\n\t}\n}\n\nfunction rgbSubwith(sourceWord, destinationWord) {\n\tif (destDepth < 16) {\n\n\t\t/* Sub each pixel separately */\n\n\t\treturn partitionedSubfromnBitsnPartitions(sourceWord, destinationWord, destDepth, destPPW);\n\t}\n\tif (destDepth === 16) {\n\n\t\t/* Sub RGB components of each pixel separately */\n\n\t\treturn partitionedSubfromnBitsnPartitions(sourceWord, destinationWord, 5, 3) + (partitionedSubfromnBitsnPartitions(sourceWord >>> 16, destinationWord >>> 16, 5, 3) << 16);\n\t} else {\n\n\t\t/* Sub RGBA components of the pixel separately */\n\n\t\treturn partitionedSubfromnBitsnPartitions(sourceWord, destinationWord, 8, 4);\n\t}\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\n/*\tWARNING: For WarpBlt w/ smoothing the source depth is wrong here! */\n\nfunction setupColorMasks() {\n\tvar bits;\n\tvar targetBits;\n\n\tbits = (targetBits = 0);\n\tif (sourceDepth <= 8) {\n\t\treturn null;\n\t}\n\tif (sourceDepth === 16) {\n\t\tbits = 5;\n\t}\n\tif (sourceDepth === 32) {\n\t\tbits = 8;\n\t}\n\tif (cmBitsPerColor === 0) {\n\n\t\t/* Convert to destDepth */\n\n\t\tif (destDepth <= 8) {\n\t\t\treturn null;\n\t\t}\n\t\tif (destDepth === 16) {\n\t\t\ttargetBits = 5;\n\t\t}\n\t\tif (destDepth === 32) {\n\t\t\ttargetBits = 8;\n\t\t}\n\t} else {\n\t\ttargetBits = cmBitsPerColor;\n\t}\n\tsetupColorMasksFromto(bits, targetBits);\n}\n\n\n/*\tSetup color masks for converting an incoming RGB pixel value from srcBits to targetBits. */\n\nfunction setupColorMasksFromto(srcBits, targetBits) {\n\tvar shifts = [0, 0, 0, 0];\n\tvar masks = [0, 0, 0, 0];\n\tvar deltaBits;\n\tvar mask;\n\n\t;\n\tdeltaBits = targetBits - srcBits;\n\tif (deltaBits === 0) {\n\t\treturn 0;\n\t}\n\tif (deltaBits <= 0) {\n\n\t\t/* Mask for extracting a color part of the source */\n\n\t\tmask = (SHL(1, targetBits)) - 1;\n\t\tmasks[RedIndex] = (SHL(mask, ((srcBits * 2) - deltaBits)));\n\t\tmasks[GreenIndex] = (SHL(mask, (srcBits - deltaBits)));\n\t\tmasks[BlueIndex] = (SHL(mask, (0 - deltaBits)));\n\t\tmasks[AlphaIndex] = 0;\n\t} else {\n\n\t\t/* Mask for extracting a color part of the source */\n\n\t\tmask = (SHL(1, srcBits)) - 1;\n\t\tmasks[RedIndex] = (SHL(mask, (srcBits * 2)));\n\t\tmasks[GreenIndex] = (SHL(mask, srcBits));\n\t\tmasks[BlueIndex] = mask;\n\t}\n\tshifts[RedIndex] = (deltaBits * 3);\n\tshifts[GreenIndex] = (deltaBits * 2);\n\tshifts[BlueIndex] = deltaBits;\n\tshifts[AlphaIndex] = 0;\n\tcmShiftTable = shifts;\n\tcmMaskTable = masks;\n\tcmFlags = cmFlags | (ColorMapPresent | ColorMapFixedPart);\n}\n\nfunction showDisplayBits() {\n\tinterpreterProxy.showDisplayBitsLeftTopRightBottom(destForm, affectedL, affectedT, affectedR, affectedB);\n}\n\n\n/*\tThis is only used when source and dest are same depth,\n\tie, when the barrel-shift copy loop is used. */\n\nfunction sourceSkewAndPointerInit() {\n\tvar dxLowBits;\n\tvar sxLowBits;\n\tvar dWid;\n\tvar pixPerM1;\n\n\n\t/* A mask, assuming power of two */\n\n\tpixPerM1 = destPPW - 1;\n\tsxLowBits = sx & pixPerM1;\n\n\t/* check if need to preload buffer\n\t(i.e., two words of source needed for first word of destination) */\n\n\tdxLowBits = dx & pixPerM1;\n\tif (hDir > 0) {\n\n\t\t/* n Bits stored in 1st word of dest */\n\n\t\tdWid = Math.min(bbW, (destPPW - dxLowBits));\n\t\tpreload = (sxLowBits + dWid) > pixPerM1;\n\t} else {\n\t\tdWid = Math.min(bbW, (dxLowBits + 1));\n\t\tpreload = ((sxLowBits - dWid) + 1) < 0;\n\t}\n\tif (sourceMSB) {\n\t\tskew = (sxLowBits - dxLowBits) * destDepth;\n\t} else {\n\t\tskew = (dxLowBits - sxLowBits) * destDepth;\n\t}\n\tif (preload) {\n\t\tif (skew < 0) {\n\t\t\tskew += 32;\n\t\t} else {\n\t\t\tskew -= 32;\n\t\t}\n\t}\n\n\t/* calculate increments from end of 1 line to start of next */\n\n\tsourceIndex = ((sy * sourcePitch)) + ((DIV(sx, (DIV(32, sourceDepth)))) * 4);\n\tsourceDelta = (sourcePitch * vDir) - (4 * (nWords * hDir));\n\tif (preload) {\n\n\t\t/* Compensate for extra source word fetched */\n\n\t\tsourceDelta -= 4 * hDir;\n\t}\n}\n\nfunction sourceWordwith(sourceWord, destinationWord) {\n\treturn sourceWord;\n}\n\nfunction subWordwith(sourceWord, destinationWord) {\n\treturn sourceWord - destinationWord;\n}\n\n\n/*\tTally pixels into the color map. Those tallied are exactly those\n\tin the destination rectangle. Note that the source should be \n\tspecified == destination, in order for the proper color map checks \n\tto be performed at setup. */\n\nfunction tallyIntoMapwith(sourceWord, destinationWord) {\n\tvar pixMask;\n\tvar mapIndex;\n\tvar destShifted;\n\tvar i;\n\tvar maskShifted;\n\tvar pixVal;\n\n\tif ((cmFlags & (ColorMapPresent | ColorMapIndexedPart)) !== (ColorMapPresent | ColorMapIndexedPart)) {\n\t\treturn destinationWord;\n\t}\n\tpixMask = maskTable[destDepth];\n\tdestShifted = destinationWord;\n\tmaskShifted = destMask;\n\tfor (i = 1; i <= destPPW; i++) {\n\t\tif ((maskShifted & pixMask) !== 0) {\n\n\t\t\t/* Only tally pixels within the destination rectangle */\n\n\t\t\tpixVal = destShifted & pixMask;\n\t\t\tif (destDepth < 16) {\n\t\t\t\tmapIndex = pixVal;\n\t\t\t} else {\n\t\t\t\tif (destDepth === 16) {\n\t\t\t\t\tmapIndex = rgbMapfromto(pixVal, 5, cmBitsPerColor);\n\t\t\t\t} else {\n\t\t\t\t\tmapIndex = rgbMapfromto(pixVal, 8, cmBitsPerColor);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttallyMapAtput(mapIndex, tallyMapAt(mapIndex) + 1);\n\t\t}\n\t\tmaskShifted = SHR(maskShifted, destDepth);\n\t\tdestShifted = SHR(destShifted, destDepth);\n\t}\n\treturn destinationWord;\n}\n\n\n/*\tReturn the word at position idx from the colorMap */\n\nfunction tallyMapAt(idx) {\n\treturn cmLookupTable[idx & cmMask];\n}\n\n\n/*\tStore the word at position idx in the colorMap */\n\nfunction tallyMapAtput(idx, value) {\n\treturn cmLookupTable[idx & cmMask] = value;\n}\n\n\n/*\tShortcut for stuff that's being run from the balloon engine.\n\tSince we do this at each scan line we should avoid the expensive \n\tsetup for source and destination. */\n/*\tWe need a source. */\n\nfunction tryCopyingBitsQuickly() {\n\tif (noSource) {\n\t\treturn false;\n\t}\n\tif (!((combinationRule === 34) || (combinationRule === 41))) {\n\t\treturn false;\n\t}\n\tif (sourceDepth !== 32) {\n\t\treturn false;\n\t}\n\tif (sourceForm === destForm) {\n\t\treturn false;\n\t}\n\tif (combinationRule === 41) {\n\t\tif (destDepth === 32) {\n\t\t\trgbComponentAlpha32();\n\t\t\taffectedL = dx;\n\t\t\taffectedR = dx + bbW;\n\t\t\taffectedT = dy;\n\t\t\taffectedB = dy + bbH;\n\t\t\treturn true;\n\t\t}\n\t\tif (destDepth === 16) {\n\t\t\trgbComponentAlpha16();\n\t\t\taffectedL = dx;\n\t\t\taffectedR = dx + bbW;\n\t\t\taffectedT = dy;\n\t\t\taffectedB = dy + bbH;\n\t\t\treturn true;\n\t\t}\n\t\tif (destDepth === 8) {\n\t\t\trgbComponentAlpha8();\n\t\t\taffectedL = dx;\n\t\t\taffectedR = dx + bbW;\n\t\t\taffectedT = dy;\n\t\t\taffectedB = dy + bbH;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tif (destDepth < 8) {\n\t\treturn false;\n\t}\n\tif ((destDepth === 8) && ((cmFlags & ColorMapPresent) === 0)) {\n\t\treturn false;\n\t}\n\tif (destDepth === 32) {\n\t\talphaSourceBlendBits32();\n\t}\n\tif (destDepth === 16) {\n\t\talphaSourceBlendBits16();\n\t}\n\tif (destDepth === 8) {\n\t\talphaSourceBlendBits8();\n\t}\n\taffectedL = dx;\n\taffectedR = dx + bbW;\n\taffectedT = dy;\n\taffectedB = dy + bbH;\n\treturn true;\n}\n\n\n/*\tUnlock the bits of any OS surfaces. */\n/*\tSee the comment in lockSurfaces. Similar rules apply. That is, the area provided in ioUnlockSurface can be used to determine the dirty region after drawing. If a source is unlocked, then the area will be (0,0,0,0) to indicate that no portion is dirty. */\n\nfunction unlockSurfaces() {\n\tvar destHandle;\n\tvar sourceHandle;\n\tvar fn;\n\tvar destLocked;\n\n\tif (hasSurfaceLock) {\n\t\tif (!unlockSurfaceFn) {\n\t\t\tif (!loadSurfacePlugin()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tfn = unlockSurfaceFn;\n\t\tdestLocked = false;\n\t\tdestHandle = interpreterProxy.fetchPointerofObject(FormBitsIndex, destForm);\n\t\tif (typeof destHandle === \"number\") {\n\n\t\t\t/* The destBits are always assumed to be dirty */\n\n\t\t\tdestHandle = destHandle;\n\t\t\tfn(destHandle, affectedL, affectedT, affectedR-affectedL, affectedB-affectedT);\n\t\t\tdestBits = (destPitch = 0);\n\t\t\tdestLocked = true;\n\t\t}\n\t\tif (!noSource) {\n\t\t\tsourceHandle = interpreterProxy.fetchPointerofObject(FormBitsIndex, sourceForm);\n\t\t\tif (typeof sourceHandle === \"number\") {\n\n\t\t\t\t/* Only unlock sourceHandle if different from destHandle */\n\n\t\t\t\tsourceHandle = sourceHandle;\n\t\t\t\tif (!(destLocked && (sourceHandle === destHandle))) {\n\t\t\t\t\tfn(sourceHandle, 0, 0, 0, 0);\n\t\t\t\t}\n\t\t\t\tsourceBits = (sourcePitch = 0);\n\t\t\t}\n\t\t}\n\t\thasSurfaceLock = false;\n\t}\n}\n\nfunction warpBits() {\n\tvar ns;\n\n\tns = noSource;\n\tnoSource = true;\n\tclipRange();\n\tnoSource = ns;\n\tif (noSource || ((bbW <= 0) || (bbH <= 0))) {\n\n\t\t/* zero width or height; noop */\n\n\t\taffectedL = (affectedR = (affectedT = (affectedB = 0)));\n\t\treturn null;\n\t}\n\tif (!lockSurfaces()) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdestMaskAndPointerInit();\n\twarpLoop();\n\tif (hDir > 0) {\n\t\taffectedL = dx;\n\t\taffectedR = dx + bbW;\n\t} else {\n\t\taffectedL = (dx - bbW) + 1;\n\t\taffectedR = dx + 1;\n\t}\n\tif (vDir > 0) {\n\t\taffectedT = dy;\n\t\taffectedB = dy + bbH;\n\t} else {\n\t\taffectedT = (dy - bbH) + 1;\n\t\taffectedB = dy + 1;\n\t}\n\tunlockSurfaces();\n}\n\n\n/*\tThis version of the inner loop traverses an arbirary quadrilateral\n\tsource, thus producing a general affine transformation. */\n\nfunction warpLoop() {\n\tvar mapperFlags;\n\tvar dstShiftLeft;\n\tvar words;\n\tvar skewWord;\n\tvar nSteps;\n\tvar deltaP43y;\n\tvar destWord;\n\tvar startBits;\n\tvar mergeFnwith;\n\tvar deltaP43x;\n\tvar pBy;\n\tvar i;\n\tvar yDelta;\n\tvar halftoneWord;\n\tvar mergeWord;\n\tvar pAy;\n\tvar dstShiftInc;\n\tvar pBx;\n\tvar sourceMapOop;\n\tvar xDelta;\n\tvar pAx;\n\tvar deltaP12y;\n\tvar endBits;\n\tvar nPix;\n\tvar deltaP12x;\n\tvar smoothingCount;\n\n\tmergeFnwith = opTable[combinationRule + 1];\n\tmergeFnwith;\n\tif (!(SIZEOF(bitBltOop) >= (BBWarpBase + 12))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tnSteps = height - 1;\n\tif (nSteps <= 0) {\n\t\tnSteps = 1;\n\t}\n\tpAx = fetchIntOrFloatofObject(BBWarpBase, bitBltOop);\n\twords = fetchIntOrFloatofObject(BBWarpBase + 3, bitBltOop);\n\tdeltaP12x = deltaFromtonSteps(pAx, words, nSteps);\n\tif (deltaP12x < 0) {\n\t\tpAx = words - (nSteps * deltaP12x);\n\t}\n\tpAy = fetchIntOrFloatofObject(BBWarpBase + 1, bitBltOop);\n\twords = fetchIntOrFloatofObject(BBWarpBase + 4, bitBltOop);\n\tdeltaP12y = deltaFromtonSteps(pAy, words, nSteps);\n\tif (deltaP12y < 0) {\n\t\tpAy = words - (nSteps * deltaP12y);\n\t}\n\tpBx = fetchIntOrFloatofObject(BBWarpBase + 9, bitBltOop);\n\twords = fetchIntOrFloatofObject(BBWarpBase + 6, bitBltOop);\n\tdeltaP43x = deltaFromtonSteps(pBx, words, nSteps);\n\tif (deltaP43x < 0) {\n\t\tpBx = words - (nSteps * deltaP43x);\n\t}\n\tpBy = fetchIntOrFloatofObject(BBWarpBase + 10, bitBltOop);\n\twords = fetchIntOrFloatofObject(BBWarpBase + 7, bitBltOop);\n\tdeltaP43y = deltaFromtonSteps(pBy, words, nSteps);\n\tif (deltaP43y < 0) {\n\t\tpBy = words - (nSteps * deltaP43y);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn false;\n\t}\n\tif (interpreterProxy.methodArgumentCount() === 2) {\n\t\tsmoothingCount = interpreterProxy.stackIntegerValue(1);\n\t\tsourceMapOop = interpreterProxy.stackValue(0);\n\t\tif (sourceMapOop.isNil) {\n\t\t\tif (sourceDepth < 16) {\n\n\t\t\t\t/* color map is required to smooth non-RGB dest */\n\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t} else {\n\t\t\tif (SIZEOF(sourceMapOop) < (SHL(1, sourceDepth))) {\n\n\t\t\t\t/* sourceMap must be long enough for sourceDepth */\n\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tsourceMapOop = sourceMapOop.wordsOrBytes();\n\t\t}\n\t} else {\n\t\tsmoothingCount = 1;\n\t\tsourceMapOop = interpreterProxy.nilObject();\n\t}\n\tnSteps = width - 1;\n\tif (nSteps <= 0) {\n\t\tnSteps = 1;\n\t}\n\tstartBits = destPPW - (dx & (destPPW - 1));\n\tendBits = (((dx + bbW) - 1) & (destPPW - 1)) + 1;\n\tif (bbW < startBits) {\n\t\tstartBits = bbW;\n\t}\n\tif (destY < clipY) {\n\n\t\t/* Advance increments if there was clipping in y */\n\n\t\tpAx += (clipY - destY) * deltaP12x;\n\t\tpAy += (clipY - destY) * deltaP12y;\n\t\tpBx += (clipY - destY) * deltaP43x;\n\t\tpBy += (clipY - destY) * deltaP43y;\n\t}\n\twarpLoopSetup();\n\tif ((smoothingCount > 1) && ((cmFlags & ColorMapNewStyle) === 0)) {\n\t\tif (!cmLookupTable) {\n\t\t\tif (destDepth === 16) {\n\t\t\t\tsetupColorMasksFromto(8, 5);\n\t\t\t}\n\t\t} else {\n\t\t\tsetupColorMasksFromto(8, cmBitsPerColor);\n\t\t}\n\t}\n\tmapperFlags = cmFlags & ~ColorMapNewStyle;\n\tif (destMSB) {\n\t\tdstShiftInc = 0 - destDepth;\n\t\tdstShiftLeft = 32 - destDepth;\n\t} else {\n\t\tdstShiftInc = destDepth;\n\t\tdstShiftLeft = 0;\n\t}\n\tfor (i = 1; i <= bbH; i++) {\n\n\t\t/* here is the vertical loop... */\n\n\t\txDelta = deltaFromtonSteps(pAx, pBx, nSteps);\n\t\tif (xDelta >= 0) {\n\t\t\tsx = pAx;\n\t\t} else {\n\t\t\tsx = pBx - (nSteps * xDelta);\n\t\t}\n\t\tyDelta = deltaFromtonSteps(pAy, pBy, nSteps);\n\t\tif (yDelta >= 0) {\n\t\t\tsy = pAy;\n\t\t} else {\n\t\t\tsy = pBy - (nSteps * yDelta);\n\t\t}\n\t\tif (destMSB) {\n\t\t\tdstBitShift = 32 - (((dx & (destPPW - 1)) + 1) * destDepth);\n\t\t} else {\n\t\t\tdstBitShift = (dx & (destPPW - 1)) * destDepth;\n\t\t}\n\t\tif (destX < clipX) {\n\n\t\t\t/* Advance increments if there was clipping in x */\n\n\t\t\tsx += (clipX - destX) * xDelta;\n\t\t\tsy += (clipX - destX) * yDelta;\n\t\t}\n\t\tif (noHalftone) {\n\t\t\thalftoneWord = AllOnes;\n\t\t} else {\n\t\t\thalftoneWord = halftoneAt((dy + i) - 1);\n\t\t}\n\t\tdestMask = mask1;\n\n\t\t/* Here is the inner loop... */\n\n\t\tnPix = startBits;\n\t\twords = nWords;\n\t\tdo {\n\n\t\t\t/* pick up word */\n\n\t\t\tif (smoothingCount === 1) {\n\n\t\t\t\t/* Faster if not smoothing */\n\n\t\t\t\tskewWord = warpPickSourcePixelsxDeltahyDeltahxDeltavyDeltavdstShiftIncflags(nPix, xDelta, yDelta, deltaP12x, deltaP12y, dstShiftInc, mapperFlags);\n\t\t\t} else {\n\n\t\t\t\t/* more difficult with smoothing */\n\n\t\t\t\tskewWord = warpPickSmoothPixelsxDeltahyDeltahxDeltavyDeltavsourceMapsmoothingdstShiftInc(nPix, xDelta, yDelta, deltaP12x, deltaP12y, sourceMapOop, smoothingCount, dstShiftInc);\n\t\t\t}\n\t\t\tdstBitShift = dstShiftLeft;\n\t\t\tif (destMask === AllOnes) {\n\n\t\t\t\t/* avoid read-modify-write */\n\n\t\t\t\tmergeWord = mergeFnwith(skewWord & halftoneWord, destBits[destIndex >>> 2]);\n\t\t\t\tdestBits[destIndex >>> 2] = destMask & mergeWord;\n\t\t\t} else {\n\n\t\t\t\t/* General version using dest masking */\n\n\t\t\t\tdestWord = destBits[destIndex >>> 2];\n\t\t\t\tmergeWord = mergeFnwith(skewWord & halftoneWord, destWord & destMask);\n\t\t\t\tdestWord = (destMask & mergeWord) | (destWord & ~destMask);\n\t\t\t\tdestBits[destIndex >>> 2] = destWord;\n\t\t\t}\n\t\t\tdestIndex += 4;\n\t\t\tif (words === 2) {\n\n\t\t\t\t/* e.g., is the next word the last word? */\n\t\t\t\t/* set mask for last word in this row */\n\n\t\t\t\tdestMask = mask2;\n\t\t\t\tnPix = endBits;\n\t\t\t} else {\n\n\t\t\t\t/* use fullword mask for inner loop */\n\n\t\t\t\tdestMask = AllOnes;\n\t\t\t\tnPix = destPPW;\n\t\t\t}\n\t\t} while(!(((--words)) === 0));\n\t\tpAx += deltaP12x;\n\t\tpAy += deltaP12y;\n\t\tpBx += deltaP43x;\n\t\tpBy += deltaP43y;\n\t\tdestIndex += destDelta;\n\t}\n}\n\n\n/*\tSetup values for faster pixel fetching. */\n\nfunction warpLoopSetup() {\n\tvar i;\n\tvar words;\n\n\n\t/* warpSrcShift = log2(sourceDepth) */\n\n\twarpSrcShift = 0;\n\n\t/* recycle temp */\n\n\twords = sourceDepth;\n\twhile (!(words === 1)) {\n\t\t++warpSrcShift;\n\t\twords = words >>> 1;\n\t}\n\n\t/* warpAlignShift: Shift for aligning x position to word boundary */\n\n\twarpSrcMask = maskTable[sourceDepth];\n\n\t/* warpAlignMask: Mask for extracting the pixel position from an x position */\n\n\twarpAlignShift = 5 - warpSrcShift;\n\n\t/* Setup the lookup table for source bit shifts */\n\t/* warpBitShiftTable: given an sub-word x value what's the bit shift? */\n\n\twarpAlignMask = (SHL(1, warpAlignShift)) - 1;\n\tfor (i = 0; i <= warpAlignMask; i++) {\n\t\tif (sourceMSB) {\n\t\t\twarpBitShiftTable[i] = (32 - (SHL((i + 1), warpSrcShift)));\n\t\t} else {\n\t\t\twarpBitShiftTable[i] = (SHL(i, warpSrcShift));\n\t\t}\n\t}\n}\n\n\n/*\tPick n (sub-) pixels from the source form, mapped by sourceMap,\n\taverage the RGB values, map by colorMap and return the new word.\n\tThis version is only called from WarpBlt with smoothingCount > 1 */\n\nfunction warpPickSmoothPixelsxDeltahyDeltahxDeltavyDeltavsourceMapsmoothingdstShiftInc(nPixels, xDeltah, yDeltah, xDeltav, yDeltav, sourceMap, n, dstShiftInc) {\n\tvar k;\n\tvar destWord;\n\tvar xdh;\n\tvar j;\n\tvar ydh;\n\tvar i;\n\tvar xdv;\n\tvar dstMask;\n\tvar ydv;\n\tvar rgb;\n\tvar y;\n\tvar b;\n\tvar yy;\n\tvar g;\n\tvar x;\n\tvar a;\n\tvar r;\n\tvar nPix;\n\tvar xx;\n\n\n\t/* nope - too much stuff in here */\n\n\tdstMask = maskTable[destDepth];\n\tdestWord = 0;\n\tif (n === 2) {\n\n\t\t/* Try avoiding divides for most common n (divide by 2 is generated as shift) */\n\n\t\txdh = xDeltah >> 1;\n\t\tydh = yDeltah >> 1;\n\t\txdv = xDeltav >> 1;\n\t\tydv = yDeltav >> 1;\n\t} else {\n\t\txdh = DIV(xDeltah, n);\n\t\tydh = DIV(yDeltah, n);\n\t\txdv = DIV(xDeltav, n);\n\t\tydv = DIV(yDeltav, n);\n\t}\n\ti = nPixels;\n\tdo {\n\t\tx = sx;\n\t\ty = sy;\n\n\t\t/* Pick and average n*n subpixels */\n\n\t\ta = (r = (g = (b = 0)));\n\n\t\t/* actual number of pixels (not clipped and not transparent) */\n\n\t\tnPix = 0;\n\t\tj = n;\n\t\tdo {\n\t\t\txx = x;\n\t\t\tyy = y;\n\t\t\tk = n;\n\t\t\tdo {\n\n\t\t\t\t/* get a single subpixel */\n\n\t\t\t\trgb = pickWarpPixelAtXy(xx, yy);\n\t\t\t\tif (!((combinationRule === 25) && (rgb === 0))) {\n\n\t\t\t\t\t/* If not clipped and not transparent, then tally rgb values */\n\n\t\t\t\t\t++nPix;\n\t\t\t\t\tif (sourceDepth < 16) {\n\n\t\t\t\t\t\t/* Get RGBA values from sourcemap table */\n\n\t\t\t\t\t\trgb = sourceMap[rgb];\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t/* Already in RGB format */\n\n\t\t\t\t\t\tif (sourceDepth === 16) {\n\t\t\t\t\t\t\trgb = rgbMap16To32(rgb);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trgb = rgbMap32To32(rgb);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tb += rgb & 255;\n\t\t\t\t\tg += (rgb >>> 8) & 255;\n\t\t\t\t\tr += (rgb >>> 16) & 255;\n\t\t\t\t\ta += rgb >>> 24;\n\t\t\t\t}\n\t\t\t\txx += xdh;\n\t\t\t\tyy += ydh;\n\t\t\t} while(!(((--k)) === 0));\n\t\t\tx += xdv;\n\t\t\ty += ydv;\n\t\t} while(!(((--j)) === 0));\n\t\tif ((nPix === 0) || ((combinationRule === 25) && (nPix < ((n * n) >> 1)))) {\n\n\t\t\t/* All pixels were 0, or most were transparent */\n\n\t\t\trgb = 0;\n\t\t} else {\n\n\t\t\t/* normalize rgba sums */\n\n\t\t\tif (nPix === 4) {\n\n\t\t\t\t/* Try to avoid divides for most common n */\n\n\t\t\t\tr = r >>> 2;\n\t\t\t\tg = g >>> 2;\n\t\t\t\tb = b >>> 2;\n\t\t\t\ta = a >>> 2;\n\t\t\t} else {\n\t\t\t\tr = DIV(r, nPix);\n\t\t\t\tg = DIV(g, nPix);\n\t\t\t\tb = DIV(b, nPix);\n\t\t\t\ta = DIV(a, nPix);\n\t\t\t}\n\n\t\t\t/* map the pixel */\n\n\t\t\trgb = (((a << 24) + (r << 16)) + (g << 8)) + b;\n\t\t\tif (rgb === 0) {\n\n\t\t\t\t/* only generate zero if pixel is really transparent */\n\n\t\t\t\tif ((((r + g) + b) + a) > 0) {\n\t\t\t\t\trgb = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\trgb = mapPixelflags(rgb, cmFlags);\n\t\t}\n\t\tdestWord = destWord | (SHL((rgb & dstMask), dstBitShift));\n\t\tdstBitShift += dstShiftInc;\n\t\tsx += xDeltah;\n\t\tsy += yDeltah;\n\t} while(!(((--i)) === 0));\n\treturn destWord;\n}\n\n\n/*\tPick n pixels from the source form,\n\tmap by colorMap and return aligned by dstBitShift.\n\tThis version is only called from WarpBlt with smoothingCount = 1 */\n\nfunction warpPickSourcePixelsxDeltahyDeltahxDeltavyDeltavdstShiftIncflags(nPixels, xDeltah, yDeltah, xDeltav, yDeltav, dstShiftInc, mapperFlags) {\n\tvar sourcePix;\n\tvar nPix;\n\tvar destPix;\n\tvar dstMask;\n\tvar destWord;\n\n\n\t/* Yepp - this should go into warpLoop */\n\n\tdstMask = maskTable[destDepth];\n\tdestWord = 0;\n\tnPix = nPixels;\n\tif (mapperFlags === (ColorMapPresent | ColorMapIndexedPart)) {\n\n\t\t/* a little optimization for (pretty crucial) blits using indexed lookups only */\n\t\t/* grab, colormap and mix in pixel */\n\n\t\tdo {\n\t\t\tsourcePix = pickWarpPixelAtXy(sx, sy);\n\t\t\tdestPix = cmLookupTable[sourcePix & cmMask];\n\t\t\tdestWord = destWord | (SHL((destPix & dstMask), dstBitShift));\n\t\t\tdstBitShift += dstShiftInc;\n\t\t\tsx += xDeltah;\n\t\t\tsy += yDeltah;\n\t\t} while(!(((--nPix)) === 0));\n\t} else {\n\n\t\t/* grab, colormap and mix in pixel */\n\n\t\tdo {\n\t\t\tsourcePix = pickWarpPixelAtXy(sx, sy);\n\t\t\tdestPix = mapPixelflags(sourcePix, mapperFlags);\n\t\t\tdestWord = destWord | (SHL((destPix & dstMask), dstBitShift));\n\t\t\tdstBitShift += dstShiftInc;\n\t\t\tsx += xDeltah;\n\t\t\tsy += yDeltah;\n\t\t} while(!(((--nPix)) === 0));\n\t}\n\treturn destWord;\n}\n\n\nSqueak.registerExternalModule(\"BitBltPlugin\", {\n\tprimitiveCopyBits: primitiveCopyBits,\n\tcopyBits: copyBits,\n\tmoduleUnloaded: moduleUnloaded,\n\tprimitiveDrawLoop: primitiveDrawLoop,\n\tprimitiveDisplayString: primitiveDisplayString,\n\tinitialiseModule: initialiseModule,\n\tloadBitBltFrom: loadBitBltFrom,\n\tsetInterpreter: setInterpreter,\n\tprimitiveWarpBits: primitiveWarpBits,\n\tgetModuleName: getModuleName,\n\tprimitivePixelValueAt: primitivePixelValueAt,\n\tcopyBitsFromtoat: copyBitsFromtoat,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:20 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tFFTPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.FFTPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar fftSize = 0;\nvar imagData = null;\nvar imagDataSize = 0;\nvar interpreterProxy = null;\nvar moduleName = \"FFTPlugin 3 November 2014 (e)\";\nvar nu = 0;\nvar permTable = null;\nvar permTableSize = 0;\nvar realData = null;\nvar realDataSize = 0;\nvar sinTable = null;\nvar sinTableSize = 0;\n\n\n\n/*\tReturn the first indexable word of oop which is assumed to be variableWordSubclass */\n\nfunction checkedFloatPtrOf(oop) {\n\tinterpreterProxy.success(interpreterProxy.isWords(oop));\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\treturn oop.wordsAsFloat32Array();\n}\n\n\n/*\tReturn the first indexable word of oop which is assumed to be variableWordSubclass */\n\nfunction checkedWordPtrOf(oop) {\n\tinterpreterProxy.success(interpreterProxy.isWords(oop));\n\treturn oop.words;\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\nfunction loadFFTFrom(fftOop) {\n\tvar oop;\n\n\tinterpreterProxy.success(SIZEOF(fftOop) >= 6);\n\tif (interpreterProxy.failed()) {\n\t\treturn false;\n\t}\n\tnu = interpreterProxy.fetchIntegerofObject(0, fftOop);\n\tfftSize = interpreterProxy.fetchIntegerofObject(1, fftOop);\n\toop = interpreterProxy.fetchPointerofObject(2, fftOop);\n\tsinTableSize = SIZEOF(oop);\n\tsinTable = checkedFloatPtrOf(oop);\n\toop = interpreterProxy.fetchPointerofObject(3, fftOop);\n\tpermTableSize = SIZEOF(oop);\n\tpermTable = checkedWordPtrOf(oop);\n\toop = interpreterProxy.fetchPointerofObject(4, fftOop);\n\trealDataSize = SIZEOF(oop);\n\trealData = checkedFloatPtrOf(oop);\n\toop = interpreterProxy.fetchPointerofObject(5, fftOop);\n\timagDataSize = SIZEOF(oop);\n\n\t/* Check assumptions about sizes */\n\n\timagData = checkedFloatPtrOf(oop);\n\tinterpreterProxy.success((((((SHL(1, nu)) === fftSize) && (((fftSize >> 2) + 1) === sinTableSize)) && (fftSize === realDataSize)) && (fftSize === imagDataSize)) && (realDataSize === imagDataSize));\n\treturn interpreterProxy.failed() === false;\n}\n\nfunction permuteData() {\n\tvar a;\n\tvar b;\n\tvar end;\n\tvar i;\n\tvar tmp;\n\n\ti = 0;\n\tend = permTableSize;\n\twhile (i < end) {\n\t\ta = permTable[i] - 1;\n\t\tb = permTable[i + 1] - 1;\n\t\tif (!((a < realDataSize) && (b < realDataSize))) {\n\t\t\treturn interpreterProxy.success(false);\n\t\t}\n\t\ttmp = realData[a];\n\t\trealData[a] = realData[b];\n\t\trealData[b] = tmp;\n\t\ttmp = imagData[a];\n\t\timagData[a] = imagData[b];\n\t\timagData[b] = tmp;\n\t\ti += 2;\n\t}\n}\n\nfunction primitiveFFTPermuteData() {\n\tvar rcvr;\n\n\trcvr = interpreterProxy.stackObjectValue(0);\n\tif (!loadFFTFrom(rcvr)) {\n\t\treturn null;\n\t}\n\tpermuteData();\n\tif (interpreterProxy.failed()) {\n\n\t\t/* permuteData went wrong. Do the permutation again -- this will restore the original order */\n\n\t\tpermuteData();\n\t}\n}\n\nfunction primitiveFFTScaleData() {\n\tvar rcvr;\n\n\trcvr = interpreterProxy.stackObjectValue(0);\n\tif (!loadFFTFrom(rcvr)) {\n\t\treturn null;\n\t}\n\tscaleData();\n}\n\nfunction primitiveFFTTransformData() {\n\tvar forward;\n\tvar rcvr;\n\n\tforward = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(0));\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (!loadFFTFrom(rcvr)) {\n\t\treturn null;\n\t}\n\ttransformData(forward);\n\tif (!interpreterProxy.failed()) {\n\t\tinterpreterProxy.pop(1);\n\t}\n}\n\n\n/*\tScale all elements by 1/n when doing inverse */\n\nfunction scaleData() {\n\tvar i;\n\tvar realN;\n\n\tif (fftSize <= 1) {\n\t\treturn null;\n\t}\n\trealN = (1.0 / fftSize);\n\tfor (i = 0; i <= (fftSize - 1); i++) {\n\t\trealData[i] = (realData[i] * realN);\n\t\timagData[i] = (imagData[i] * realN);\n\t}\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\nfunction transformData(forward) {\n\tpermuteData();\n\tif (interpreterProxy.failed()) {\n\n\t\t/* permuteData went wrong. Do the permutation again -- this will restore the original order */\n\n\t\tpermuteData();\n\t\treturn null;\n\t}\n\ttransformForward(forward);\n\tif (!forward) {\n\t\tscaleData();\n\t}\n}\n\nfunction transformForward(forward) {\n\tvar fftScale;\n\tvar fftSize2;\n\tvar fftSize4;\n\tvar i;\n\tvar ii;\n\tvar imagT;\n\tvar imagU;\n\tvar ip;\n\tvar j;\n\tvar lev;\n\tvar lev1;\n\tvar level;\n\tvar realT;\n\tvar realU;\n\tvar theta;\n\n\tfftSize2 = fftSize >> 1;\n\tfftSize4 = fftSize >> 2;\n\tfor (level = 1; level <= nu; level++) {\n\t\tlev = SHL(1, level);\n\t\tlev1 = lev >> 1;\n\t\tfftScale = DIV(fftSize, lev);\n\t\tfor (j = 1; j <= lev1; j++) {\n\n\t\t\t/* pi * (j-1) / lev1 mapped onto 0..n/2 */\n\n\t\t\ttheta = (j - 1) * fftScale;\n\t\t\tif (theta < fftSize4) {\n\n\t\t\t\t/* Compute U, the complex multiplier for each level */\n\n\t\t\t\trealU = sinTable[(sinTableSize - theta) - 1];\n\t\t\t\timagU = sinTable[theta];\n\t\t\t} else {\n\t\t\t\trealU = 0.0 - sinTable[theta - fftSize4];\n\t\t\t\timagU = sinTable[fftSize2 - theta];\n\t\t\t}\n\t\t\tif (!forward) {\n\t\t\t\timagU = 0.0 - imagU;\n\t\t\t}\n\t\t\ti = j;\n\t\t\twhile (i <= fftSize) {\n\t\t\t\tip = (i + lev1) - 1;\n\t\t\t\tii = i - 1;\n\t\t\t\trealT = (realData[ip] * realU) - (imagData[ip] * imagU);\n\t\t\t\timagT = (realData[ip] * imagU) + (imagData[ip] * realU);\n\t\t\t\trealData[ip] = (realData[ii] - realT);\n\t\t\t\timagData[ip] = (imagData[ii] - imagT);\n\t\t\t\trealData[ii] = (realData[ii] + realT);\n\t\t\t\timagData[ii] = (imagData[ii] + imagT);\n\t\t\t\ti += lev;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nSqueak.registerExternalModule(\"FFTPlugin\", {\n\tprimitiveFFTTransformData: primitiveFFTTransformData,\n\tsetInterpreter: setInterpreter,\n\tprimitiveFFTPermuteData: primitiveFFTPermuteData,\n\tprimitiveFFTScaleData: primitiveFFTScaleData,\n\tgetModuleName: getModuleName,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:20 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tFloatArrayPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.FloatArrayPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar moduleName = \"FloatArrayPlugin 3 November 2014 (e)\";\n\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\n\n/*\tPrimitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver. */\n\nfunction primitiveAddFloatArray() {\n\tvar arg;\n\tvar argPtr;\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\n\targ = interpreterProxy.stackObjectValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(arg));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(arg);\n\tinterpreterProxy.success(length === SIZEOF(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\targPtr = arg.wordsAsFloat32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] + argPtr[i]);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tPrimitive. Add the argument, a scalar value to the receiver, a FloatArray */\n\nfunction primitiveAddScalar() {\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\tvar value;\n\n\tvalue = interpreterProxy.stackFloatValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvr);\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] + value);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveAt() {\n\tvar floatPtr;\n\tvar floatValue;\n\tvar index;\n\tvar rcvr;\n\n\tindex = interpreterProxy.stackIntegerValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tinterpreterProxy.success((index > 0) && (index <= SIZEOF(rcvr)));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfloatPtr = rcvr.wordsAsFloat32Array();\n\tfloatValue = floatPtr[index - 1];\n\tinterpreterProxy.pop(2);\n\tinterpreterProxy.pushFloat(floatValue);\n}\n\nfunction primitiveAtPut() {\n\tvar floatPtr;\n\tvar floatValue;\n\tvar index;\n\tvar rcvr;\n\tvar value;\n\n\tvalue = interpreterProxy.stackValue(0);\n\tif (typeof value === \"number\") {\n\t\tfloatValue = value;\n\t} else {\n\t\tfloatValue = interpreterProxy.floatValueOf(value);\n\t}\n\tindex = interpreterProxy.stackIntegerValue(1);\n\trcvr = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tinterpreterProxy.success((index > 0) && (index <= SIZEOF(rcvr)));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfloatPtr = rcvr.wordsAsFloat32Array();\n\tfloatPtr[index - 1] = floatValue;\n\tif (!interpreterProxy.failed()) {\n\t\tinterpreterProxy.popthenPush(3, value);\n\t}\n}\n\n\n/*\tPrimitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver. */\n\nfunction primitiveDivFloatArray() {\n\tvar arg;\n\tvar argPtr;\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\n\targ = interpreterProxy.stackObjectValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(arg));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(arg);\n\tinterpreterProxy.success(length === SIZEOF(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\n\t/* Check if any of the argument's values is zero */\n\n\targPtr = arg.wordsAsFloat32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\tif (argPtr[i] === 0) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t}\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] / argPtr[i]);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tPrimitive. Add the argument, a scalar value to the receiver, a FloatArray */\n\nfunction primitiveDivScalar() {\n\tvar i;\n\tvar inverse;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\tvar value;\n\n\tvalue = interpreterProxy.stackFloatValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (value === 0.0) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvr);\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\tinverse = 1.0 / value;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] * inverse);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tPrimitive. Compute the dot product of the receiver and the argument.\n\tThe dot product is defined as the sum of the products of the individual elements. */\n\nfunction primitiveDotProduct() {\n\tvar arg;\n\tvar argPtr;\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\tvar result;\n\n\targ = interpreterProxy.stackObjectValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(arg));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(arg);\n\tinterpreterProxy.success(length === SIZEOF(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\targPtr = arg.wordsAsFloat32Array();\n\tresult = 0.0;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\tresult += rcvrPtr[i] * argPtr[i];\n\t}\n\tinterpreterProxy.pop(2);\n\tinterpreterProxy.pushFloat(result);\n}\n\nfunction primitiveEqual() {\n\tvar arg;\n\tvar argPtr;\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\n\targ = interpreterProxy.stackObjectValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(arg));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(2);\n\tlength = SIZEOF(arg);\n\tif (length !== SIZEOF(rcvr)) {\n\t\treturn interpreterProxy.pushBool(false);\n\t}\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\targPtr = arg.wordsAsFloat32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\tif (rcvrPtr[i] !== argPtr[i]) {\n\t\t\treturn interpreterProxy.pushBool(false);\n\t\t}\n\t}\n\treturn interpreterProxy.pushBool(true);\n}\n\nfunction primitiveHashArray() {\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\tvar result;\n\n\trcvr = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvr);\n\trcvrPtr = rcvr.wordsAsInt32Array();\n\tresult = 0;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\tresult += rcvrPtr[i];\n\t}\n\tinterpreterProxy.pop(1);\n\treturn interpreterProxy.pushInteger(result & 536870911);\n}\n\n\n/*\tPrimitive. Compute the length of the argument (sqrt of sum of component squares). */\n\nfunction primitiveLength() {\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\tvar result;\n\n\trcvr = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvr);\n\tinterpreterProxy.success(true);\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\tresult = 0.0;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\tresult += rcvrPtr[i] * rcvrPtr[i];\n\t}\n\tresult = Math.sqrt(result);\n\tinterpreterProxy.popthenPush(1, interpreterProxy.floatObjectOf(result));\n}\n\n\n/*\tPrimitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver. */\n\nfunction primitiveMulFloatArray() {\n\tvar arg;\n\tvar argPtr;\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\n\targ = interpreterProxy.stackObjectValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(arg));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(arg);\n\tinterpreterProxy.success(length === SIZEOF(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\targPtr = arg.wordsAsFloat32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] * argPtr[i]);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tPrimitive. Add the argument, a scalar value to the receiver, a FloatArray */\n\nfunction primitiveMulScalar() {\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\tvar value;\n\n\tvalue = interpreterProxy.stackFloatValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvr);\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] * value);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tPrimitive. Normalize the argument (A FloatArray) in place. */\n\nfunction primitiveNormalize() {\n\tvar i;\n\tvar len;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\n\trcvr = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvr);\n\tinterpreterProxy.success(true);\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\tlen = 0.0;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\tlen += rcvrPtr[i] * rcvrPtr[i];\n\t}\n\tinterpreterProxy.success(len > 0.0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlen = Math.sqrt(len);\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] / len);\n\t}\n}\n\n\n/*\tPrimitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver. */\n\nfunction primitiveSubFloatArray() {\n\tvar arg;\n\tvar argPtr;\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\n\targ = interpreterProxy.stackObjectValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(arg));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(arg);\n\tinterpreterProxy.success(length === SIZEOF(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\targPtr = arg.wordsAsFloat32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] - argPtr[i]);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tPrimitive. Add the argument, a scalar value to the receiver, a FloatArray */\n\nfunction primitiveSubScalar() {\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\tvar value;\n\n\tvalue = interpreterProxy.stackFloatValue(0);\n\trcvr = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvr);\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrPtr[i] = (rcvrPtr[i] - value);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\n\n/*\tPrimitive. Find the sum of each float in the receiver, a FloatArray, and stash the result into the argument Float. */\n\nfunction primitiveSum() {\n\tvar i;\n\tvar length;\n\tvar rcvr;\n\tvar rcvrPtr;\n\tvar sum;\n\n\trcvr = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvr));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvr);\n\trcvrPtr = rcvr.wordsAsFloat32Array();\n\tsum = 0.0;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\tsum += rcvrPtr[i];\n\t}\n\tinterpreterProxy.popthenPush(1, interpreterProxy.floatObjectOf(sum));\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\nSqueak.registerExternalModule(\"FloatArrayPlugin\", {\n\tprimitiveMulFloatArray: primitiveMulFloatArray,\n\tprimitiveEqual: primitiveEqual,\n\tprimitiveAtPut: primitiveAtPut,\n\tprimitiveAt: primitiveAt,\n\tprimitiveNormalize: primitiveNormalize,\n\tprimitiveSubFloatArray: primitiveSubFloatArray,\n\tprimitiveDivFloatArray: primitiveDivFloatArray,\n\tprimitiveAddScalar: primitiveAddScalar,\n\tprimitiveDotProduct: primitiveDotProduct,\n\tprimitiveSubScalar: primitiveSubScalar,\n\tsetInterpreter: setInterpreter,\n\tprimitiveSum: primitiveSum,\n\tgetModuleName: getModuleName,\n\tprimitiveHashArray: primitiveHashArray,\n\tprimitiveMulScalar: primitiveMulScalar,\n\tprimitiveLength: primitiveLength,\n\tprimitiveAddFloatArray: primitiveAddFloatArray,\n\tprimitiveDivScalar: primitiveDivScalar,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 14 November 2014 12:21:50 am */\n/* Automatically generated by\n\tJSSmartSyntaxPluginCodeGenerator VMMakerJS-bf.17 uuid: 399be48b-95d8-4722-bdcc-39a94a12c486\n from\n\tGeniePlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.GeniePlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\nfunction PTR_ADD(p, n) { return new Int32Array(p.buffer, p.byteOffset + n * 4); }\nfunction FPTR_ADD(p, n) { return new Float32Array(p.buffer, p.byteOffset + n * 4); }\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar moduleName = \"GeniePlugin v2.0 14 November 2014 (e)\";\n\n\n\n/*\targuments are pointer to ints paired as x,y coordinates of points */\n\nfunction cSquaredDistanceFromto(aPoint, bPoint) {\n\tvar aPointX;\n\tvar bPointX;\n\tvar xDiff;\n\tvar aPointY;\n\tvar bPointY;\n\tvar yDiff;\n\n\taPointX = aPoint[0];\n\taPointY = aPoint[1];\n\tbPointX = bPoint[0];\n\tbPointY = bPoint[1];\n\txDiff = bPointX - aPointX;\n\tyDiff = bPointY - aPointY;\n\treturn (xDiff * xDiff) + (yDiff * yDiff);\n}\n\nfunction cSubstAngleFactorFromto(startDegreeNumber, endDegreeNumber) {\n\tvar absDiff;\n\n\tabsDiff = Math.abs(endDegreeNumber - startDegreeNumber);\n\tif (absDiff > 180) {\n\t\tabsDiff = 360 - absDiff;\n\t}\n\treturn (absDiff * absDiff) >>> 6;\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\nfunction majorNO() {\n\treturn 2;\n}\n\nfunction minorNO() {\n\treturn 0;\n}\n\nfunction msg(s) {\n\tconsole.log(moduleName + \": \" + s);\n}\n\nfunction primSameClassAbsoluteStrokeDistanceMyPoints_otherPoints_myVectors_otherVectors_mySquaredLengths_otherSquaredLengths_myAngles_otherAngles_maxSizeAndReferenceFlag_rowBase_rowInsertRemove_rowInsertRemoveCount() {\n\tvar otherAngles;\n\tvar otherSquaredLengthsSize;\n\tvar forReference;\n\tvar jM1;\n\tvar iM1;\n\tvar jM1T2;\n\tvar base;\n\tvar insert;\n\tvar otherVectors;\n\tvar otherVectorsSize;\n\tvar otherSquaredLengths;\n\tvar rowBaseSize;\n\tvar myPoints;\n\tvar jLimiT;\n\tvar mySquaredLengths;\n\tvar additionalMultiInsertRemoveCost;\n\tvar remove;\n\tvar otherPoints;\n\tvar otherPointsSize;\n\tvar myVectors;\n\tvar rowInsertRemoveCount;\n\tvar rowBase;\n\tvar maxDist;\n\tvar iM1T2;\n\tvar j;\n\tvar insertRemove;\n\tvar i;\n\tvar myVectorsSize;\n\tvar subst;\n\tvar maxSize;\n\tvar removeBase;\n\tvar substBase;\n\tvar myAngles;\n\tvar insertRemoveCount;\n\tvar rowInsertRemove;\n\tvar insertBase;\n\tvar myPointsOop;\n\tvar otherPointsOop;\n\tvar myVectorsOop;\n\tvar otherVectorsOop;\n\tvar mySquaredLengthsOop;\n\tvar otherSquaredLengthsOop;\n\tvar myAnglesOop;\n\tvar otherAnglesOop;\n\tvar maxSizeAndRefFlag;\n\tvar rowBaseOop;\n\tvar rowInsertRemoveOop;\n\tvar rowInsertRemoveCountOop;\n\tvar _return_value;\n\n\tmyPointsOop = interpreterProxy.stackValue(11);\n\totherPointsOop = interpreterProxy.stackValue(10);\n\tmyVectorsOop = interpreterProxy.stackValue(9);\n\totherVectorsOop = interpreterProxy.stackValue(8);\n\tmySquaredLengthsOop = interpreterProxy.stackValue(7);\n\totherSquaredLengthsOop = interpreterProxy.stackValue(6);\n\tmyAnglesOop = interpreterProxy.stackValue(5);\n\totherAnglesOop = interpreterProxy.stackValue(4);\n\tmaxSizeAndRefFlag = interpreterProxy.stackIntegerValue(3);\n\trowBaseOop = interpreterProxy.stackValue(2);\n\trowInsertRemoveOop = interpreterProxy.stackValue(1);\n\trowInsertRemoveCountOop = interpreterProxy.stackValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\tmsg(\"failed 1\");\n\t\treturn null;\n\t}\n\tinterpreterProxy.success((((((((((interpreterProxy.isWords(myPointsOop) && interpreterProxy.isWords(otherPointsOop)) && interpreterProxy.isWords(myVectorsOop)) && interpreterProxy.isWords(otherVectorsOop)) && interpreterProxy.isWords(mySquaredLengthsOop)) && interpreterProxy.isWords(otherSquaredLengthsOop)) && interpreterProxy.isWords(myAnglesOop)) && interpreterProxy.isWords(otherAnglesOop)) && interpreterProxy.isWords(rowBaseOop)) && interpreterProxy.isWords(rowInsertRemoveOop)) && interpreterProxy.isWords(rowInsertRemoveCountOop));\n\tif (interpreterProxy.failed()) {\n\t\tmsg(\"failed 2\");\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isMemberOf(myPointsOop, \"PointArray\") && interpreterProxy.isMemberOf(otherPointsOop, \"PointArray\"));\n\tif (interpreterProxy.failed()) {\n\t\tmsg(\"failed 3\");\n\t\treturn null;\n\t}\n\tmyPoints = myPointsOop.wordsAsInt32Array();\n\totherPoints = otherPointsOop.wordsAsInt32Array();\n\tmyVectors = myVectorsOop.wordsAsInt32Array();\n\totherVectors = otherVectorsOop.wordsAsInt32Array();\n\tmySquaredLengths = mySquaredLengthsOop.wordsAsInt32Array();\n\totherSquaredLengths = otherSquaredLengthsOop.wordsAsInt32Array();\n\tmyAngles = myAnglesOop.wordsAsInt32Array();\n\totherAngles = otherAnglesOop.wordsAsInt32Array();\n\trowBase = rowBaseOop.wordsAsInt32Array();\n\trowInsertRemove = rowInsertRemoveOop.wordsAsInt32Array();\n\n\t/* Note: myPointsSize and mySquaredLengthsSize variables eliminated to reduce\n\tmethod temporary variable count for closure-enabled images */\n\t/* PointArrays */\n\t/* myPointsSize := (interpreterProxy stSizeOf: myPointsOop) bitShift: -1. */\n\n\trowInsertRemoveCount = rowInsertRemoveCountOop.wordsAsInt32Array();\n\totherPointsSize = SIZEOF(otherPointsOop) >>> 1;\n\tmyVectorsSize = SIZEOF(myVectorsOop) >>> 1;\n\n\t/* IntegerArrays */\n\t/* mySquaredLengthsSize := interpreterProxy stSizeOf: mySquaredLengthsOop. */\n\n\totherVectorsSize = SIZEOF(otherVectorsOop) >>> 1;\n\totherSquaredLengthsSize = SIZEOF(otherSquaredLengthsOop);\n\trowBaseSize = SIZEOF(rowBaseOop);\n\tinterpreterProxy.success(((rowBaseSize === SIZEOF(rowInsertRemoveOop)) && (rowBaseSize === SIZEOF(rowInsertRemoveCountOop))) && (rowBaseSize > otherVectorsSize));\n\tif (interpreterProxy.failed()) {\n\t\tmsg(\"failed 4\");\n\t\treturn null;\n\t}\n\tinterpreterProxy.success((((((SIZEOF(mySquaredLengthsOop) >= (myVectorsSize - 1)) && ((SIZEOF(myPointsOop) >>> 1) >= myVectorsSize)) && (otherSquaredLengthsSize >= (otherVectorsSize - 1))) && (otherPointsSize >= otherVectorsSize)) && (SIZEOF(myAnglesOop) >= (myVectorsSize - 1))) && (SIZEOF(otherAnglesOop) >= (otherVectorsSize - 1)));\n\tif (interpreterProxy.failed()) {\n\t\tmsg(\"failed 5\");\n\t\treturn null;\n\t}\n\tforReference = maxSizeAndRefFlag & 1;\n\tmaxSize = maxSizeAndRefFlag >>> 1;\n\tmaxDist = 1 << 29;\n\tif (forReference) {\n\t\tadditionalMultiInsertRemoveCost = 0;\n\t} else {\n\t\tadditionalMultiInsertRemoveCost = (maxSize * maxSize) >>> 10;\n\t}\n\trowBase[0] = 0;\n\trowInsertRemove[0] = 0;\n\trowInsertRemoveCount[0] = 2;\n\tinsertRemove = 0 - additionalMultiInsertRemoveCost;\n\tjLimiT = otherVectorsSize;\n\tif (!((otherPointsSize >= (jLimiT - 1)) && (otherSquaredLengthsSize >= (jLimiT - 1)))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tfor (j = 1; j <= jLimiT; j++) {\n\t\tjM1 = j - 1;\n\t\tinsertRemove = (insertRemove + ((otherSquaredLengths[jM1] + cSquaredDistanceFromto(PTR_ADD(otherPoints, (jM1 << 1)), myPoints)) >>> 7)) + additionalMultiInsertRemoveCost;\n\t\trowInsertRemove[j] = insertRemove;\n\t\trowBase[j] = (insertRemove * j);\n\t\trowInsertRemoveCount[j] = (j + 1);\n\t}\n\tinsertRemove = rowInsertRemove[0] - additionalMultiInsertRemoveCost;\n\tfor (i = 1; i <= myVectorsSize; i++) {\n\t\tiM1 = i - 1;\n\t\tiM1T2 = iM1 << 1;\n\t\tsubstBase = rowBase[0];\n\t\tinsertRemove = (insertRemove + ((mySquaredLengths[iM1] + cSquaredDistanceFromto(PTR_ADD(myPoints, iM1T2), otherPoints)) >>> 7)) + additionalMultiInsertRemoveCost;\n\t\trowInsertRemove[0] = insertRemove;\n\t\trowBase[0] = (insertRemove * i);\n\t\trowInsertRemoveCount[0] = (i + 1);\n\t\tjLimiT = otherVectorsSize;\n\t\tfor (j = 1; j <= jLimiT; j++) {\n\t\t\tjM1 = j - 1;\n\t\t\tjM1T2 = jM1 << 1;\n\t\t\tremoveBase = rowBase[j];\n\t\t\tinsertBase = rowBase[jM1];\n\t\t\tremove = (mySquaredLengths[iM1] + cSquaredDistanceFromto(PTR_ADD(myPoints, iM1T2), PTR_ADD(otherPoints, (j << 1)))) >>> 7;\n\t\t\tif (((insertRemove = rowInsertRemove[j])) === 0) {\n\t\t\t\tremoveBase += remove;\n\t\t\t} else {\n\t\t\t\tremoveBase = (removeBase + insertRemove) + (remove * rowInsertRemoveCount[j]);\n\t\t\t\tremove += insertRemove;\n\t\t\t}\n\t\t\tinsert = (otherSquaredLengths[jM1] + cSquaredDistanceFromto(PTR_ADD(otherPoints, jM1T2), PTR_ADD(myPoints, (i << 1)))) >>> 7;\n\t\t\tif (((insertRemove = rowInsertRemove[jM1])) === 0) {\n\t\t\t\tinsertBase += insert;\n\t\t\t} else {\n\t\t\t\tinsertBase = (insertBase + insertRemove) + (insert * rowInsertRemoveCount[jM1]);\n\t\t\t\tinsert += insertRemove;\n\t\t\t}\n\t\t\tif (forReference) {\n\t\t\t\tsubstBase = maxDist;\n\t\t\t} else {\n\t\t\t\tsubst = ((cSquaredDistanceFromto(PTR_ADD(otherVectors, jM1T2), PTR_ADD(myVectors, iM1T2)) + cSquaredDistanceFromto(PTR_ADD(otherPoints, jM1T2), PTR_ADD(myPoints, iM1T2))) * (16 + cSubstAngleFactorFromto(otherAngles[jM1], myAngles[iM1]))) >>> 11;\n\t\t\t\tsubstBase += subst;\n\t\t\t}\n\t\t\tif ((substBase <= removeBase) && (substBase <= insertBase)) {\n\t\t\t\tbase = substBase;\n\t\t\t\tinsertRemove = 0;\n\t\t\t\tinsertRemoveCount = 1;\n\t\t\t} else {\n\t\t\t\tif (removeBase <= insertBase) {\n\t\t\t\t\tbase = removeBase;\n\t\t\t\t\tinsertRemove = remove + additionalMultiInsertRemoveCost;\n\t\t\t\t\tinsertRemoveCount = rowInsertRemoveCount[j] + 1;\n\t\t\t\t} else {\n\t\t\t\t\tbase = insertBase;\n\t\t\t\t\tinsertRemove = insert + additionalMultiInsertRemoveCost;\n\t\t\t\t\tinsertRemoveCount = rowInsertRemoveCount[jM1] + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsubstBase = rowBase[j];\n\t\t\trowBase[j] = Math.min(base, maxDist);\n\t\t\trowInsertRemove[j] = Math.min(insertRemove, maxDist);\n\t\t\trowInsertRemoveCount[j] = insertRemoveCount;\n\t\t}\n\t\tinsertRemove = rowInsertRemove[0];\n\t}\n\t_return_value = base;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(13, _return_value);\n\treturn null;\n}\n\n\n/*\tmajorNO * 1000 + minorNO */\n\nfunction primVersionNO() {\n\tvar _return_value;\n\n\t_return_value = ((majorNO() * 1000) + minorNO());\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(1, _return_value);\n\treturn null;\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\nSqueak.registerExternalModule(\"GeniePlugin\", {\n\tprimVersionNO: primVersionNO,\n\tsetInterpreter: setInterpreter,\n\tprimSameClassAbsoluteStrokeDistanceMyPoints_otherPoints_myVectors_otherVectors_mySquaredLengths_otherSquaredLengths_myAngles_otherAngles_maxSizeAndReferenceFlag_rowBase_rowInsertRemove_rowInsertRemoveCount: primSameClassAbsoluteStrokeDistanceMyPoints_otherPoints_myVectors_otherVectors_mySquaredLengths_otherSquaredLengths_myAngles_otherAngles_maxSizeAndReferenceFlag_rowBase_rowInsertRemove_rowInsertRemoveCount,\n\tgetModuleName: getModuleName,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:20 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tJPEGReaderPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.JPEGReaderPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Constants ***/\nvar BlockWidthIndex = 5;\nvar BlueIndex = 2;\nvar ConstBits = 13;\nvar CurrentXIndex = 0;\nvar CurrentYIndex = 1;\nvar DCTSize = 8;\nvar DCTSize2 = 64;\nvar FIXn0n298631336 = 2446;\nvar FIXn0n34414 = 22554;\nvar FIXn0n390180644 = 3196;\nvar FIXn0n541196100 = 4433;\nvar FIXn0n71414 = 46802;\nvar FIXn0n765366865 = 6270;\nvar FIXn0n899976223 = 7373;\nvar FIXn1n175875602 = 9633;\nvar FIXn1n40200 = 91881;\nvar FIXn1n501321110 = 12299;\nvar FIXn1n77200 = 116130;\nvar FIXn1n847759065 = 15137;\nvar FIXn1n961570560 = 16069;\nvar FIXn2n053119869 = 16819;\nvar FIXn2n562915447 = 20995;\nvar FIXn3n072711026 = 25172;\nvar GreenIndex = 1;\nvar HScaleIndex = 2;\nvar MCUBlockIndex = 4;\nvar MCUWidthIndex = 8;\nvar MaxBits = 16;\nvar MaxMCUBlocks = 128;\nvar MaxSample = 255;\nvar MinComponentSize = 11;\nvar Pass1Bits = 2;\nvar Pass1Div = 2048;\nvar Pass2Div = 262144;\nvar PriorDCValueIndex = 10;\nvar RedIndex = 0;\nvar SampleOffset = 127;\nvar VScaleIndex = 3;\n\n/*** Variables ***/\nvar acTable = null;\nvar acTableSize = 0;\nvar cbBlocks = new Array(128);\nvar cbComponent = new Array(11);\nvar cbSampleStream = 0;\nvar crBlocks = new Array(128);\nvar crComponent = new Array(11);\nvar crSampleStream = 0;\nvar dcTable = null;\nvar dcTableSize = 0;\nvar ditherMask = 0;\nvar interpreterProxy = null;\nvar jpegBits = null;\nvar jpegBitsSize = 0;\nvar jpegNaturalOrder = [\n\t0, 1, 8, 16, 9, 2, 3, 10, \n\t17, 24, 32, 25, 18, 11, 4, 5, \n\t12, 19, 26, 33, 40, 48, 41, 34, \n\t27, 20, 13, 6, 7, 14, 21, 28, \n\t35, 42, 49, 56, 57, 50, 43, 36, \n\t29, 22, 15, 23, 30, 37, 44, 51, \n\t58, 59, 52, 45, 38, 31, 39, 46, \n\t53, 60, 61, 54, 47, 55, 62, 63\n];\nvar jsBitBuffer = 0;\nvar jsBitCount = 0;\nvar jsCollection = null;\nvar jsPosition = 0;\nvar jsReadLimit = 0;\nvar moduleName = \"JPEGReaderPlugin 3 November 2014 (e)\";\nvar residuals = null;\nvar yBlocks = new Array(128);\nvar yComponent = new Array(11);\nvar ySampleStream = 0;\n\n\nfunction cbColorComponentFrom(oop) {\n\treturn colorComponentfrom(cbComponent, oop) && (colorComponentBlocksfrom(cbBlocks, oop));\n}\n\nfunction colorComponentfrom(aColorComponent, oop) {\n\tif (typeof oop === \"number\") {\n\t\treturn false;\n\t}\n\tif (!interpreterProxy.isPointers(oop)) {\n\t\treturn false;\n\t}\n\tif (SIZEOF(oop) < MinComponentSize) {\n\t\treturn false;\n\t}\n\taColorComponent[CurrentXIndex] = interpreterProxy.fetchIntegerofObject(CurrentXIndex, oop);\n\taColorComponent[CurrentYIndex] = interpreterProxy.fetchIntegerofObject(CurrentYIndex, oop);\n\taColorComponent[HScaleIndex] = interpreterProxy.fetchIntegerofObject(HScaleIndex, oop);\n\taColorComponent[VScaleIndex] = interpreterProxy.fetchIntegerofObject(VScaleIndex, oop);\n\taColorComponent[BlockWidthIndex] = interpreterProxy.fetchIntegerofObject(BlockWidthIndex, oop);\n\taColorComponent[MCUWidthIndex] = interpreterProxy.fetchIntegerofObject(MCUWidthIndex, oop);\n\taColorComponent[PriorDCValueIndex] = interpreterProxy.fetchIntegerofObject(PriorDCValueIndex, oop);\n\treturn !interpreterProxy.failed();\n}\n\nfunction colorComponentBlocksfrom(blocks, oop) {\n\tvar arrayOop;\n\tvar blockOop;\n\tvar i;\n\tvar max;\n\n\tif (typeof oop === \"number\") {\n\t\treturn false;\n\t}\n\tif (!interpreterProxy.isPointers(oop)) {\n\t\treturn false;\n\t}\n\tif (SIZEOF(oop) < MinComponentSize) {\n\t\treturn false;\n\t}\n\tarrayOop = interpreterProxy.fetchPointerofObject(MCUBlockIndex, oop);\n\tif (typeof arrayOop === \"number\") {\n\t\treturn false;\n\t}\n\tif (!interpreterProxy.isPointers(arrayOop)) {\n\t\treturn false;\n\t}\n\tmax = SIZEOF(arrayOop);\n\tif (max > MaxMCUBlocks) {\n\t\treturn false;\n\t}\n\tfor (i = 0; i <= (max - 1); i++) {\n\t\tblockOop = interpreterProxy.fetchPointerofObject(i, arrayOop);\n\t\tif (typeof blockOop === \"number\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (!interpreterProxy.isWords(blockOop)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (SIZEOF(blockOop) !== DCTSize2) {\n\t\t\treturn false;\n\t\t}\n\t\tblocks[i] = blockOop.wordsAsInt32Array();\n\t}\n\treturn !interpreterProxy.failed();\n}\n\nfunction colorConvertGrayscaleMCU() {\n\tvar i;\n\tvar y;\n\n\tyComponent[CurrentXIndex] = 0;\n\tyComponent[CurrentYIndex] = 0;\n\tfor (i = 0; i <= (jpegBitsSize - 1); i++) {\n\t\ty = nextSampleY();\n\t\ty += residuals[GreenIndex];\n\t\ty = Math.min(y, MaxSample);\n\t\tresiduals[GreenIndex] = (y & ditherMask);\n\t\ty = y & (MaxSample - ditherMask);\n\t\ty = Math.max(y, 1);\n\t\tjpegBits[i] = (((4278190080 + (y << 16)) + (y << 8)) + y);\n\t}\n}\n\nfunction colorConvertMCU() {\n\tvar blue;\n\tvar cb;\n\tvar cr;\n\tvar green;\n\tvar i;\n\tvar red;\n\tvar y;\n\n\tyComponent[CurrentXIndex] = 0;\n\tyComponent[CurrentYIndex] = 0;\n\tcbComponent[CurrentXIndex] = 0;\n\tcbComponent[CurrentYIndex] = 0;\n\tcrComponent[CurrentXIndex] = 0;\n\tcrComponent[CurrentYIndex] = 0;\n\tfor (i = 0; i <= (jpegBitsSize - 1); i++) {\n\t\ty = nextSampleY();\n\t\tcb = nextSampleCb();\n\t\tcb -= SampleOffset;\n\t\tcr = nextSampleCr();\n\t\tcr -= SampleOffset;\n\t\tred = (y + ((FIXn1n40200 * cr) >> 16)) + residuals[RedIndex];\n\t\tred = Math.min(red, MaxSample);\n\t\tred = Math.max(red, 0);\n\t\tresiduals[RedIndex] = (red & ditherMask);\n\t\tred = red & (MaxSample - ditherMask);\n\t\tred = Math.max(red, 1);\n\t\tgreen = ((y - ((FIXn0n34414 * cb) >> 16)) - ((FIXn0n71414 * cr) >> 16)) + residuals[GreenIndex];\n\t\tgreen = Math.min(green, MaxSample);\n\t\tgreen = Math.max(green, 0);\n\t\tresiduals[GreenIndex] = (green & ditherMask);\n\t\tgreen = green & (MaxSample - ditherMask);\n\t\tgreen = Math.max(green, 1);\n\t\tblue = (y + ((FIXn1n77200 * cb) >> 16)) + residuals[BlueIndex];\n\t\tblue = Math.min(blue, MaxSample);\n\t\tblue = Math.max(blue, 0);\n\t\tresiduals[BlueIndex] = (blue & ditherMask);\n\t\tblue = blue & (MaxSample - ditherMask);\n\t\tblue = Math.max(blue, 1);\n\t\tjpegBits[i] = (((4278190080 + (red << 16)) + (green << 8)) + blue);\n\t}\n}\n\nfunction crColorComponentFrom(oop) {\n\treturn colorComponentfrom(crComponent, oop) && (colorComponentBlocksfrom(crBlocks, oop));\n}\n\nfunction decodeBlockIntocomponent(anArray, aColorComponent) {\n\tvar bits;\n\tvar byte;\n\tvar i;\n\tvar index;\n\tvar zeroCount;\n\n\tbyte = jpegDecodeValueFromsize(dcTable, dcTableSize);\n\tif (byte < 0) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (byte !== 0) {\n\t\tbits = getBits(byte);\n\t\tbyte = scaleAndSignExtendinFieldWidth(bits, byte);\n\t}\n\tbyte = aColorComponent[PriorDCValueIndex] = (aColorComponent[PriorDCValueIndex] + byte);\n\tanArray[0] = byte;\n\tfor (i = 1; i <= (DCTSize2 - 1); i++) {\n\t\tanArray[i] = 0;\n\t}\n\tindex = 1;\n\twhile (index < DCTSize2) {\n\t\tbyte = jpegDecodeValueFromsize(acTable, acTableSize);\n\t\tif (byte < 0) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\tzeroCount = byte >>> 4;\n\t\tbyte = byte & 15;\n\t\tif (byte !== 0) {\n\t\t\tindex += zeroCount;\n\t\t\tbits = getBits(byte);\n\t\t\tbyte = scaleAndSignExtendinFieldWidth(bits, byte);\n\t\t\tif ((index < 0) || (index >= DCTSize2)) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tanArray[jpegNaturalOrder[index]] = byte;\n\t\t} else {\n\t\t\tif (zeroCount === 15) {\n\t\t\t\tindex += zeroCount;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t++index;\n\t}\n}\n\nfunction fillBuffer() {\n\tvar byte;\n\n\twhile (jsBitCount <= 16) {\n\t\tif (!(jsPosition < jsReadLimit)) {\n\t\t\treturn jsBitCount;\n\t\t}\n\t\tbyte = jsCollection[jsPosition];\n\t\t++jsPosition;\n\t\tif (byte === 255) {\n\n\t\t\t/* peek for 00 */\n\n\t\t\tif (!((jsPosition < jsReadLimit) && (jsCollection[jsPosition] === 0))) {\n\t\t\t\t--jsPosition;\n\t\t\t\treturn jsBitCount;\n\t\t\t}\n\t\t\t++jsPosition;\n\t\t}\n\t\tjsBitBuffer = (jsBitBuffer << 8) | byte;\n\t\tjsBitCount += 8;\n\t}\n\treturn jsBitCount;\n}\n\nfunction getBits(requestedBits) {\n\tvar value;\n\n\tif (requestedBits > jsBitCount) {\n\t\tfillBuffer();\n\t\tif (requestedBits > jsBitCount) {\n\t\t\treturn -1;\n\t\t}\n\t}\n\tjsBitCount -= requestedBits;\n\tvalue = SHR(jsBitBuffer, jsBitCount);\n\tjsBitBuffer = jsBitBuffer & ((SHL(1, jsBitCount)) - 1);\n\treturn value;\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\nfunction idctBlockIntqt(anArray, qt) {\n\tvar anACTerm;\n\tvar dcval;\n\tvar i;\n\tvar j;\n\tvar row;\n\tvar t0;\n\tvar t1;\n\tvar t10;\n\tvar t11;\n\tvar t12;\n\tvar t13;\n\tvar t2;\n\tvar t3;\n\tvar v;\n\tvar ws = new Array(64);\n\tvar z1;\n\tvar z2;\n\tvar z3;\n\tvar z4;\n\tvar z5;\n\n\t;\n\tfor (i = 0; i <= (DCTSize - 1); i++) {\n\t\tanACTerm = -1;\n\t\tfor (row = 1; row <= (DCTSize - 1); row++) {\n\t\t\tif (anACTerm === -1) {\n\t\t\t\tif (anArray[(row * DCTSize) + i] !== 0) {\n\t\t\t\t\tanACTerm = row;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (anACTerm === -1) {\n\t\t\tdcval = (anArray[i] * qt[0]) << 2;\n\t\t\tfor (j = 0; j <= (DCTSize - 1); j++) {\n\t\t\t\tws[(j * DCTSize) + i] = dcval;\n\t\t\t}\n\t\t} else {\n\t\t\tz2 = anArray[(DCTSize * 2) + i] * qt[(DCTSize * 2) + i];\n\t\t\tz3 = anArray[(DCTSize * 6) + i] * qt[(DCTSize * 6) + i];\n\t\t\tz1 = (z2 + z3) * FIXn0n541196100;\n\t\t\tt2 = z1 + (z3 * (0 - FIXn1n847759065));\n\t\t\tt3 = z1 + (z2 * FIXn0n765366865);\n\t\t\tz2 = anArray[i] * qt[i];\n\t\t\tz3 = anArray[(DCTSize * 4) + i] * qt[(DCTSize * 4) + i];\n\t\t\tt0 = (z2 + z3) << 13;\n\t\t\tt1 = (z2 - z3) << 13;\n\t\t\tt10 = t0 + t3;\n\t\t\tt13 = t0 - t3;\n\t\t\tt11 = t1 + t2;\n\t\t\tt12 = t1 - t2;\n\t\t\tt0 = anArray[(DCTSize * 7) + i] * qt[(DCTSize * 7) + i];\n\t\t\tt1 = anArray[(DCTSize * 5) + i] * qt[(DCTSize * 5) + i];\n\t\t\tt2 = anArray[(DCTSize * 3) + i] * qt[(DCTSize * 3) + i];\n\t\t\tt3 = anArray[DCTSize + i] * qt[DCTSize + i];\n\t\t\tz1 = t0 + t3;\n\t\t\tz2 = t1 + t2;\n\t\t\tz3 = t0 + t2;\n\t\t\tz4 = t1 + t3;\n\t\t\tz5 = (z3 + z4) * FIXn1n175875602;\n\t\t\tt0 = t0 * FIXn0n298631336;\n\t\t\tt1 = t1 * FIXn2n053119869;\n\t\t\tt2 = t2 * FIXn3n072711026;\n\t\t\tt3 = t3 * FIXn1n501321110;\n\t\t\tz1 = z1 * (0 - FIXn0n899976223);\n\t\t\tz2 = z2 * (0 - FIXn2n562915447);\n\t\t\tz3 = z3 * (0 - FIXn1n961570560);\n\t\t\tz4 = z4 * (0 - FIXn0n390180644);\n\t\t\tz3 += z5;\n\t\t\tz4 += z5;\n\t\t\tt0 = (t0 + z1) + z3;\n\t\t\tt1 = (t1 + z2) + z4;\n\t\t\tt2 = (t2 + z2) + z3;\n\t\t\tt3 = (t3 + z1) + z4;\n\t\t\tws[i] = ((t10 + t3) >> 11);\n\t\t\tws[(DCTSize * 7) + i] = ((t10 - t3) >> 11);\n\t\t\tws[(DCTSize * 1) + i] = ((t11 + t2) >> 11);\n\t\t\tws[(DCTSize * 6) + i] = ((t11 - t2) >> 11);\n\t\t\tws[(DCTSize * 2) + i] = ((t12 + t1) >> 11);\n\t\t\tws[(DCTSize * 5) + i] = ((t12 - t1) >> 11);\n\t\t\tws[(DCTSize * 3) + i] = ((t13 + t0) >> 11);\n\t\t\tws[(DCTSize * 4) + i] = ((t13 - t0) >> 11);\n\t\t}\n\t}\n\tfor (i = 0; i <= (DCTSize2 - DCTSize); i += DCTSize) {\n\t\tz2 = ws[i + 2];\n\t\tz3 = ws[i + 6];\n\t\tz1 = (z2 + z3) * FIXn0n541196100;\n\t\tt2 = z1 + (z3 * (0 - FIXn1n847759065));\n\t\tt3 = z1 + (z2 * FIXn0n765366865);\n\t\tt0 = (ws[i] + ws[i + 4]) << 13;\n\t\tt1 = (ws[i] - ws[i + 4]) << 13;\n\t\tt10 = t0 + t3;\n\t\tt13 = t0 - t3;\n\t\tt11 = t1 + t2;\n\t\tt12 = t1 - t2;\n\t\tt0 = ws[i + 7];\n\t\tt1 = ws[i + 5];\n\t\tt2 = ws[i + 3];\n\t\tt3 = ws[i + 1];\n\t\tz1 = t0 + t3;\n\t\tz2 = t1 + t2;\n\t\tz3 = t0 + t2;\n\t\tz4 = t1 + t3;\n\t\tz5 = (z3 + z4) * FIXn1n175875602;\n\t\tt0 = t0 * FIXn0n298631336;\n\t\tt1 = t1 * FIXn2n053119869;\n\t\tt2 = t2 * FIXn3n072711026;\n\t\tt3 = t3 * FIXn1n501321110;\n\t\tz1 = z1 * (0 - FIXn0n899976223);\n\t\tz2 = z2 * (0 - FIXn2n562915447);\n\t\tz3 = z3 * (0 - FIXn1n961570560);\n\t\tz4 = z4 * (0 - FIXn0n390180644);\n\t\tz3 += z5;\n\t\tz4 += z5;\n\t\tt0 = (t0 + z1) + z3;\n\t\tt1 = (t1 + z2) + z4;\n\t\tt2 = (t2 + z2) + z3;\n\t\tt3 = (t3 + z1) + z4;\n\t\tv = ((t10 + t3) >> 18) + SampleOffset;\n\t\tv = Math.min(v, MaxSample);\n\t\tv = Math.max(v, 0);\n\t\tanArray[i] = v;\n\t\tv = ((t10 - t3) >> 18) + SampleOffset;\n\t\tv = Math.min(v, MaxSample);\n\t\tv = Math.max(v, 0);\n\t\tanArray[i + 7] = v;\n\t\tv = ((t11 + t2) >> 18) + SampleOffset;\n\t\tv = Math.min(v, MaxSample);\n\t\tv = Math.max(v, 0);\n\t\tanArray[i + 1] = v;\n\t\tv = ((t11 - t2) >> 18) + SampleOffset;\n\t\tv = Math.min(v, MaxSample);\n\t\tv = Math.max(v, 0);\n\t\tanArray[i + 6] = v;\n\t\tv = ((t12 + t1) >> 18) + SampleOffset;\n\t\tv = Math.min(v, MaxSample);\n\t\tv = Math.max(v, 0);\n\t\tanArray[i + 2] = v;\n\t\tv = ((t12 - t1) >> 18) + SampleOffset;\n\t\tv = Math.min(v, MaxSample);\n\t\tv = Math.max(v, 0);\n\t\tanArray[i + 5] = v;\n\t\tv = ((t13 + t0) >> 18) + SampleOffset;\n\t\tv = Math.min(v, MaxSample);\n\t\tv = Math.max(v, 0);\n\t\tanArray[i + 3] = v;\n\t\tv = ((t13 - t0) >> 18) + SampleOffset;\n\t\tv = Math.min(v, MaxSample);\n\t\tv = Math.max(v, 0);\n\t\tanArray[i + 4] = v;\n\t}\n}\n\n\n/*\tDecode the next value in the receiver using the given huffman table. */\n\nfunction jpegDecodeValueFromsize(table, tableSize) {\n\tvar bits;\n\tvar bitsNeeded;\n\tvar index;\n\tvar tableIndex;\n\tvar value;\n\n\n\t/* Initial bits needed */\n\n\tbitsNeeded = table[0] >>> 24;\n\tif (bitsNeeded > MaxBits) {\n\t\treturn -1;\n\t}\n\n\t/* First real table */\n\n\ttableIndex = 2;\n\twhile (true) {\n\n\t\t/* Get bits */\n\n\t\tbits = getBits(bitsNeeded);\n\t\tif (bits < 0) {\n\t\t\treturn -1;\n\t\t}\n\t\tindex = (tableIndex + bits) - 1;\n\t\tif (index >= tableSize) {\n\t\t\treturn -1;\n\t\t}\n\n\t\t/* Lookup entry in table */\n\n\t\tvalue = table[index];\n\t\tif ((value & 1056964608) === 0) {\n\t\t\treturn value;\n\t\t}\n\n\t\t/* Table offset in low 16 bit */\n\n\t\ttableIndex = value & 65535;\n\n\t\t/* Additional bits in high 8 bit */\n\n\t\tbitsNeeded = (value >>> 24) & 255;\n\t\tif (bitsNeeded > MaxBits) {\n\t\t\treturn -1;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction loadJPEGStreamFrom(streamOop) {\n\tvar oop;\n\tvar sz;\n\n\tif (SIZEOF(streamOop) < 5) {\n\t\treturn false;\n\t}\n\tif (!interpreterProxy.isPointers(streamOop)) {\n\t\treturn false;\n\t}\n\toop = interpreterProxy.fetchPointerofObject(0, streamOop);\n\tif (typeof oop === \"number\") {\n\t\treturn false;\n\t}\n\tif (!interpreterProxy.isBytes(oop)) {\n\t\treturn false;\n\t}\n\tjsCollection = oop.bytes;\n\tsz = BYTESIZEOF(oop);\n\tjsPosition = interpreterProxy.fetchIntegerofObject(1, streamOop);\n\tjsReadLimit = interpreterProxy.fetchIntegerofObject(2, streamOop);\n\tjsBitBuffer = interpreterProxy.fetchIntegerofObject(3, streamOop);\n\tjsBitCount = interpreterProxy.fetchIntegerofObject(4, streamOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn false;\n\t}\n\tif (sz < jsReadLimit) {\n\t\treturn false;\n\t}\n\tif ((jsPosition < 0) || (jsPosition >= jsReadLimit)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction nextSampleCb() {\n\tvar blockIndex;\n\tvar curX;\n\tvar dx;\n\tvar dy;\n\tvar sample;\n\tvar sampleIndex;\n\tvar sx;\n\tvar sy;\n\n\tdx = (curX = cbComponent[CurrentXIndex]);\n\tdy = cbComponent[CurrentYIndex];\n\tsx = cbComponent[HScaleIndex];\n\tsy = cbComponent[VScaleIndex];\n\tif ((sx !== 0) && (sy !== 0)) {\n\t\tdx = DIV(dx, sx);\n\t\tdy = DIV(dy, sy);\n\t}\n\tblockIndex = ((dy >>> 3) * cbComponent[BlockWidthIndex]) + (dx >>> 3);\n\tsampleIndex = ((dy & 7) << 3) + (dx & 7);\n\tsample = cbBlocks[blockIndex][sampleIndex];\n\t++curX;\n\tif (curX < (cbComponent[MCUWidthIndex] * 8)) {\n\t\tcbComponent[CurrentXIndex] = curX;\n\t} else {\n\t\tcbComponent[CurrentXIndex] = 0;\n\t\tcbComponent[CurrentYIndex]++;\n\t}\n\treturn sample;\n}\n\nfunction nextSampleCr() {\n\tvar blockIndex;\n\tvar curX;\n\tvar dx;\n\tvar dy;\n\tvar sample;\n\tvar sampleIndex;\n\tvar sx;\n\tvar sy;\n\n\tdx = (curX = crComponent[CurrentXIndex]);\n\tdy = crComponent[CurrentYIndex];\n\tsx = crComponent[HScaleIndex];\n\tsy = crComponent[VScaleIndex];\n\tif ((sx !== 0) && (sy !== 0)) {\n\t\tdx = DIV(dx, sx);\n\t\tdy = DIV(dy, sy);\n\t}\n\tblockIndex = ((dy >>> 3) * crComponent[BlockWidthIndex]) + (dx >>> 3);\n\tsampleIndex = ((dy & 7) << 3) + (dx & 7);\n\tsample = crBlocks[blockIndex][sampleIndex];\n\t++curX;\n\tif (curX < (crComponent[MCUWidthIndex] * 8)) {\n\t\tcrComponent[CurrentXIndex] = curX;\n\t} else {\n\t\tcrComponent[CurrentXIndex] = 0;\n\t\tcrComponent[CurrentYIndex]++;\n\t}\n\treturn sample;\n}\n\nfunction nextSampleY() {\n\tvar blockIndex;\n\tvar curX;\n\tvar dx;\n\tvar dy;\n\tvar sample;\n\tvar sampleIndex;\n\tvar sx;\n\tvar sy;\n\n\tdx = (curX = yComponent[CurrentXIndex]);\n\tdy = yComponent[CurrentYIndex];\n\tsx = yComponent[HScaleIndex];\n\tsy = yComponent[VScaleIndex];\n\tif ((sx !== 0) && (sy !== 0)) {\n\t\tdx = DIV(dx, sx);\n\t\tdy = DIV(dy, sy);\n\t}\n\tblockIndex = ((dy >>> 3) * yComponent[BlockWidthIndex]) + (dx >>> 3);\n\tsampleIndex = ((dy & 7) << 3) + (dx & 7);\n\tsample = yBlocks[blockIndex][sampleIndex];\n\t++curX;\n\tif (curX < (yComponent[MCUWidthIndex] * 8)) {\n\t\tyComponent[CurrentXIndex] = curX;\n\t} else {\n\t\tyComponent[CurrentXIndex] = 0;\n\t\tyComponent[CurrentYIndex]++;\n\t}\n\treturn sample;\n}\n\n\n/*\tRequires:\n\t\tJPEGColorComponent\n\t\tbits\n\t\tWordArray with: 3*Integer (residuals)\n\t\tditherMask\n\t */\n\nfunction primitiveColorConvertGrayscaleMCU() {\n\tvar arrayOop;\n\n\tstInit();\n\tif (interpreterProxy.methodArgumentCount() !== 4) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tditherMask = interpreterProxy.stackIntegerValue(0);\n\tarrayOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!(interpreterProxy.isWords(arrayOop) && (SIZEOF(arrayOop) === 3))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tresiduals = arrayOop.wordsAsInt32Array();\n\tarrayOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(arrayOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tjpegBitsSize = SIZEOF(arrayOop);\n\tjpegBits = arrayOop.wordsAsInt32Array();\n\tarrayOop = interpreterProxy.stackObjectValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!yColorComponentFrom(arrayOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tcolorConvertGrayscaleMCU();\n\tinterpreterProxy.pop(4);\n}\n\n\n/*\tRequires:\n\t\tArray with: 3*JPEGColorComponent\n\t\tbits\n\t\tWordArray with: 3*Integer (residuals)\n\t\tditherMask\n\t */\n\nfunction primitiveColorConvertMCU() {\n\tvar arrayOop;\n\n\tstInit();\n\tif (interpreterProxy.methodArgumentCount() !== 4) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tditherMask = interpreterProxy.stackIntegerValue(0);\n\tarrayOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!(interpreterProxy.isWords(arrayOop) && (SIZEOF(arrayOop) === 3))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tresiduals = arrayOop.wordsAsInt32Array();\n\tarrayOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(arrayOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tjpegBitsSize = SIZEOF(arrayOop);\n\tjpegBits = arrayOop.wordsAsInt32Array();\n\tarrayOop = interpreterProxy.stackObjectValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!(interpreterProxy.isPointers(arrayOop) && (SIZEOF(arrayOop) === 3))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!yColorComponentFrom(interpreterProxy.fetchPointerofObject(0, arrayOop))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!cbColorComponentFrom(interpreterProxy.fetchPointerofObject(1, arrayOop))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!crColorComponentFrom(interpreterProxy.fetchPointerofObject(2, arrayOop))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tcolorConvertMCU();\n\tinterpreterProxy.pop(4);\n}\n\n\n/*\tIn:\n\t\tanArray \t\tWordArray of: DCTSize2\n\t\taColorComponent JPEGColorComponent\n\t\tdcTable\t\t\tWordArray\n\t\tacTable\t\t\tWordArray\n\t\tstream\t\t\tJPEGStream\n\t */\n\nfunction primitiveDecodeMCU() {\n\tvar anArray;\n\tvar arrayOop;\n\tvar oop;\n\n\t;\n\tif (interpreterProxy.methodArgumentCount() !== 5) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\toop = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!loadJPEGStreamFrom(oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tarrayOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(arrayOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tacTableSize = SIZEOF(arrayOop);\n\tacTable = arrayOop.wordsAsInt32Array();\n\tarrayOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(arrayOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdcTableSize = SIZEOF(arrayOop);\n\tdcTable = arrayOop.wordsAsInt32Array();\n\toop = interpreterProxy.stackObjectValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!colorComponentfrom(yComponent, oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tarrayOop = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(arrayOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (SIZEOF(arrayOop) !== DCTSize2) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tanArray = arrayOop.wordsAsInt32Array();\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tdecodeBlockIntocomponent(anArray, yComponent);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tstoreJPEGStreamOn(interpreterProxy.stackValue(0));\n\tinterpreterProxy.storeIntegerofObjectwithValue(PriorDCValueIndex, interpreterProxy.stackValue(3), yComponent[PriorDCValueIndex]);\n\tinterpreterProxy.pop(5);\n}\n\n\n/*\tIn:\n\t\tanArray: IntegerArray new: DCTSize2\n\t\tqt: IntegerArray new: DCTSize2.\n\t */\n\nfunction primitiveIdctInt() {\n\tvar anArray;\n\tvar arrayOop;\n\tvar qt;\n\n\t;\n\tif (interpreterProxy.methodArgumentCount() !== 2) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tarrayOop = interpreterProxy.stackObjectValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!(interpreterProxy.isWords(arrayOop) && (SIZEOF(arrayOop) === DCTSize2))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tqt = arrayOop.wordsAsInt32Array();\n\tarrayOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!(interpreterProxy.isWords(arrayOop) && (SIZEOF(arrayOop) === DCTSize2))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tanArray = arrayOop.wordsAsInt32Array();\n\tidctBlockIntqt(anArray, qt);\n\tinterpreterProxy.pop(2);\n}\n\nfunction scaleAndSignExtendinFieldWidth(aNumber, w) {\n\tif (aNumber < (SHL(1, (w - 1)))) {\n\t\treturn (aNumber - (SHL(1, w))) + 1;\n\t} else {\n\t\treturn aNumber;\n\t}\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\nfunction stInit() {\n\t;\n}\n\nfunction storeJPEGStreamOn(streamOop) {\n\tinterpreterProxy.storeIntegerofObjectwithValue(1, streamOop, jsPosition);\n\tinterpreterProxy.storeIntegerofObjectwithValue(3, streamOop, jsBitBuffer);\n\tinterpreterProxy.storeIntegerofObjectwithValue(4, streamOop, jsBitCount);\n}\n\nfunction yColorComponentFrom(oop) {\n\treturn colorComponentfrom(yComponent, oop) && (colorComponentBlocksfrom(yBlocks, oop));\n}\n\n\nSqueak.registerExternalModule(\"JPEGReaderPlugin\", {\n\tsetInterpreter: setInterpreter,\n\tprimitiveIdctInt: primitiveIdctInt,\n\tprimitiveColorConvertMCU: primitiveColorConvertMCU,\n\tprimitiveColorConvertGrayscaleMCU: primitiveColorConvertGrayscaleMCU,\n\tprimitiveDecodeMCU: primitiveDecodeMCU,\n\tgetModuleName: getModuleName,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:21 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tKedamaPlugin Kedama-Plugins-yo.1 uuid: 3fc7d691-0149-ba4d-a339-5d27cd44a2f8\n */\n\nmodule(\"users.bert.SqueakJS.plugins.KedamaPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar kedamaRandomSeed = 0;\nvar moduleName = \"KedamaPlugin 3 November 2014 (e)\";\nvar randA = 0;\nvar randM = 0;\nvar randQ = 0;\nvar randR = 0;\n\n\nfunction degreesFromXy(x, y) {\n\tvar tanVal;\n\tvar theta;\n\n\t/* inline: true */;\n\tif (x === 0.0) {\n\t\tif (y >= 0.0) {\n\t\t\treturn 90.0;\n\t\t} else {\n\t\t\treturn 270.0;\n\t\t}\n\t} else {\n\t\ttanVal = y / x;\n\t\ttheta = Math.atan(tanVal);\n\t\tif (x >= 0.0) {\n\t\t\tif (y >= 0.0) {\n\t\t\t\treturn theta / 0.0174532925199433;\n\t\t\t} else {\n\t\t\t\treturn 360.0 + (theta / 0.0174532925199433);\n\t\t\t}\n\t\t} else {\n\t\t\treturn 180.0 + (theta / 0.0174532925199433);\n\t\t}\n\t}\n\treturn 0.0;\n}\n\nfunction degreesToRadians(degrees) {\n\tvar deg;\n\tvar headingRadians;\n\tvar q;\n\n\t/* inline: true */;\n\tdeg = 90.0 - degrees;\n\tq = deg / 360.0|0;\n\tif (deg < 0.0) {\n\t\t--q;\n\t}\n\theadingRadians = (deg - (q * 360.0)) * 0.0174532925199433;\n\treturn headingRadians;\n}\n\nfunction drawTurtlesInArray() {\n\tvar bitsIndex;\n\tvar colorArray;\n\tvar colorOop;\n\tvar destBits;\n\tvar destHeight;\n\tvar destOop;\n\tvar destWidth;\n\tvar i;\n\tvar size;\n\tvar visible;\n\tvar visibleArray;\n\tvar visibleOop;\n\tvar x;\n\tvar xArray;\n\tvar xOop;\n\tvar y;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\tvisibleOop = interpreterProxy.stackValue(0);\n\tcolorOop = interpreterProxy.stackValue(1);\n\tyOop = interpreterProxy.stackValue(2);\n\txOop = interpreterProxy.stackValue(3);\n\tdestHeight = interpreterProxy.stackIntegerValue(4);\n\tdestWidth = interpreterProxy.stackIntegerValue(5);\n\tdestOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(destOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(colorOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(visibleOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif ((destHeight * destWidth) !== SIZEOF(destOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(yOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(colorOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(visibleOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\tyArray = yOop.wordsAsFloat32Array();\n\tcolorArray = colorOop.words;\n\tvisibleArray = visibleOop.bytes;\n\tdestBits = destOop.words;\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tx = (xArray[i]|0);\n\t\t;\n\t\ty = (yArray[i]|0);\n\t\t;\n\t\tvisible = visibleArray[i];\n\t\tif ((visible !== 0) && (((x >= 0) && (y >= 0)) && ((x < destWidth) && (y < destHeight)))) {\n\t\t\tbitsIndex = (y * destWidth) + x;\n\t\t\tdestBits[bitsIndex] = colorArray[i];\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction getHeadingArrayInto() {\n\tvar heading;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar resultArray;\n\tvar resultOop;\n\tvar size;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackValue(0);\n\theadingOop = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(resultOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(headingOop);\n\tif (SIZEOF(resultOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tresultArray = resultOop.wordsAsFloat32Array();\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\theading = headingArray[i];\n\t\theading = heading / 0.0174532925199433;\n\t\theading = 90.0 - heading;\n\t\tif (!(heading > 0.0)) {\n\t\t\theading += 360.0;\n\t\t}\n\t\tresultArray[i] = heading;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(2);\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction getScalarHeading() {\n\tvar heading;\n\tvar headingArray;\n\tvar headingOop;\n\tvar index;\n\n\t/* inline: true */;\n\theadingOop = interpreterProxy.stackValue(0);\n\tindex = interpreterProxy.stackIntegerValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) < index) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\theadingArray = headingOop.wordsAsFloat32Array();\n\theading = headingArray[index - 1];\n\theading = radiansToDegrees(heading);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(3);\n\tinterpreterProxy.pushFloat(heading);\n}\n\nfunction halt() {\n\t;\n}\n\nfunction initialiseModule() {\n\tkedamaRandomSeed = 17;\n\n\t/* magic constant = 16807 */\n\n\trandA = 16807;\n\n\t/* magic constant = 2147483647 */\n\n\trandM = 2147483647;\n\trandQ = DIV(randM, randA);\n\trandR = MOD(randM, randA);\n}\n\nfunction kedamaRandom2(range) {\n\tvar hi;\n\tvar lo;\n\tvar r;\n\tvar v;\n\tvar val;\n\n\t/* inline: true */;\n\tif (range < 0) {\n\t\tr = 0 - range;\n\t} else {\n\t\tr = range;\n\t}\n\thi = DIV(kedamaRandomSeed, randQ);\n\tlo = MOD(kedamaRandomSeed, randQ);\n\tkedamaRandomSeed = (randA * lo) - (randR * hi);\n\tv = kedamaRandomSeed & 65535;\n\tval = (v * (r + 1)) >>> 16;\n\tif (range < 0) {\n\t\treturn 0 - val;\n\t} else {\n\t\treturn val;\n\t}\n}\n\nfunction kedamaSetRandomSeed() {\n\tvar seed;\n\n\t/* inline: true */;\n\tseed = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tkedamaRandomSeed = seed & 65536;\n\tinterpreterProxy.pop(1);\n}\n\nfunction makeMask() {\n\tvar alpha;\n\tvar dOrigin;\n\tvar data;\n\tvar dataBits;\n\tvar dataSize;\n\tvar highMask;\n\tvar i;\n\tvar mOrigin;\n\tvar maskBits;\n\tvar maskSize;\n\tvar pixel;\n\tvar shiftAmount;\n\n\t/* inline: true */;\n\tshiftAmount = interpreterProxy.stackIntegerValue(0);\n\tpixel = interpreterProxy.stackIntegerValue(1);\n\tmaskBits = interpreterProxy.stackValue(2);\n\tdataBits = interpreterProxy.stackValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tdataSize = SIZEOF(dataBits);\n\tmaskSize = SIZEOF(maskBits);\n\tif (dataSize !== maskSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (shiftAmount < -32) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (shiftAmount > 8) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tdOrigin = dataBits.words;\n\tmOrigin = maskBits.words;\n\thighMask = 4278190080;\n\tfor (i = 0; i <= (dataSize - 1); i++) {\n\t\tdata = dOrigin[i];\n\t\talpha = SHIFT(data, shiftAmount);\n\t\tif (alpha > 255) {\n\t\t\talpha = 255;\n\t\t}\n\t\tif (alpha < 0) {\n\t\t\talpha = 0;\n\t\t}\n\t\tmOrigin[i] = (((alpha << 24) & highMask) | pixel);\n\t}\n\tinterpreterProxy.pop(4);\n}\n\nfunction makeMaskLog() {\n\tvar alpha;\n\tvar dOrigin;\n\tvar data;\n\tvar dataBits;\n\tvar dataSize;\n\tvar highMask;\n\tvar i;\n\tvar mOrigin;\n\tvar maskBits;\n\tvar maskSize;\n\tvar max;\n\tvar maxFirst;\n\tvar maxLog;\n\tvar maxOop;\n\tvar pixel;\n\n\t/* inline: true */;\n\tmaxOop = interpreterProxy.stackValue(0);\n\tpixel = interpreterProxy.stackIntegerValue(1);\n\tmaskBits = interpreterProxy.stackValue(2);\n\tdataBits = interpreterProxy.stackValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tmaxFirst = maxOop.words;\n\tmax = maxFirst[0];\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tmaxLog = Math.log(max);\n\tdataSize = SIZEOF(dataBits);\n\tmaskSize = SIZEOF(maskBits);\n\tif (dataSize !== maskSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tdOrigin = dataBits.words;\n\tmOrigin = maskBits.words;\n\thighMask = 4278190080;\n\tfor (i = 0; i <= (dataSize - 1); i++) {\n\t\tdata = dOrigin[i];\n\t\tif (data === 0) {\n\t\t\talpha = 0;\n\t\t} else {\n\t\t\talpha = (((255.0 / maxLog) * Math.log(data))|0);\n\t\t}\n\t\tif (alpha > 255) {\n\t\t\talpha = 255;\n\t\t}\n\t\tmOrigin[i] = (((alpha << 24) & highMask) | pixel);\n\t}\n\tinterpreterProxy.pop(4);\n}\n\nfunction makeTurtlesMap() {\n\tvar height;\n\tvar index;\n\tvar map;\n\tvar mapIndex;\n\tvar mapOop;\n\tvar size;\n\tvar whoArray;\n\tvar whoOop;\n\tvar width;\n\tvar x;\n\tvar xArray;\n\tvar xOop;\n\tvar y;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\theight = interpreterProxy.stackIntegerValue(0);\n\twidth = interpreterProxy.stackIntegerValue(1);\n\tyOop = interpreterProxy.stackValue(2);\n\txOop = interpreterProxy.stackValue(3);\n\twhoOop = interpreterProxy.stackValue(4);\n\tmapOop = interpreterProxy.stackValue(5);\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(whoOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(mapOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(whoOop);\n\tif (SIZEOF(xOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(yOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(mapOop) !== (height * width)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\tyArray = yOop.wordsAsFloat32Array();\n\twhoArray = whoOop.words;\n\tmap = mapOop.words;\n\tfor (index = 0; index <= ((height * width) - 1); index++) {\n\t\tmap[index] = 0;\n\t}\n\tfor (index = 0; index <= (size - 1); index++) {\n\t\tx = xArray[index];\n\t\ty = yArray[index];\n\t\tmapIndex = (width * y) + x;\n\t\tif ((mapIndex >= 0) && (mapIndex < (height * width))) {\n\t\t\tmap[mapIndex] = whoArray[index];\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction primPixelAtXY() {\n\tvar bits;\n\tvar bitsOop;\n\tvar height;\n\tvar index;\n\tvar ret;\n\tvar width;\n\tvar x;\n\tvar xPos;\n\tvar y;\n\tvar yPos;\n\n\t/* inline: true */;\n\theight = interpreterProxy.stackIntegerValue(0);\n\twidth = interpreterProxy.stackIntegerValue(1);\n\tyPos = interpreterProxy.stackFloatValue(2);\n\txPos = interpreterProxy.stackFloatValue(3);\n\tbitsOop = interpreterProxy.stackValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(bitsOop) !== (height * width)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tx = xPos|0;\n\ty = yPos|0;\n\tbits = bitsOop.words;\n\tif ((((x >= 0) && (x < width)) && (y >= 0)) && (y < height)) {\n\t\tindex = (y * width) + x;\n\t\tret = bits[index];\n\t} else {\n\t\tret = 0;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n\tinterpreterProxy.pushInteger(ret);\n}\n\nfunction primPixelAtXYPut() {\n\tvar bits;\n\tvar bitsOop;\n\tvar height;\n\tvar index;\n\tvar v;\n\tvar value;\n\tvar width;\n\tvar x;\n\tvar xPos;\n\tvar y;\n\tvar yPos;\n\n\t/* inline: true */;\n\theight = interpreterProxy.stackIntegerValue(0);\n\twidth = interpreterProxy.stackIntegerValue(1);\n\tvalue = interpreterProxy.stackIntegerValue(2);\n\tyPos = interpreterProxy.stackFloatValue(3);\n\txPos = interpreterProxy.stackFloatValue(4);\n\tbitsOop = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(bitsOop) !== (height * width)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tx = xPos|0;\n\ty = yPos|0;\n\tv = value;\n\tif (v > 1073741823) {\n\t\tv = 1073741823;\n\t}\n\tif (v < 0) {\n\t\tv = 0;\n\t}\n\tbits = bitsOop.words;\n\tif ((((x >= 0) && (x < width)) && (y >= 0)) && (y < height)) {\n\t\tindex = (y * width) + x;\n\t\tbits[index] = v;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction primPixelsAtXY() {\n\tvar bits;\n\tvar bitsHeight;\n\tvar bitsIndex;\n\tvar bitsOop;\n\tvar bitsWidth;\n\tvar destWords;\n\tvar destWordsOop;\n\tvar i;\n\tvar size;\n\tvar x;\n\tvar xArray;\n\tvar xArrayOop;\n\tvar y;\n\tvar yArray;\n\tvar yArrayOop;\n\n\t/* inline: true */;\n\tdestWordsOop = interpreterProxy.stackValue(0);\n\tbitsHeight = interpreterProxy.stackIntegerValue(1);\n\tbitsWidth = interpreterProxy.stackIntegerValue(2);\n\tbitsOop = interpreterProxy.stackValue(3);\n\tyArrayOop = interpreterProxy.stackValue(4);\n\txArrayOop = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(destWordsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif ((bitsHeight * bitsWidth) !== SIZEOF(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xArrayOop);\n\tif (SIZEOF(yArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(destWordsOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xArrayOop.wordsAsFloat32Array();\n\tyArray = yArrayOop.wordsAsFloat32Array();\n\tdestWords = destWordsOop.words;\n\tbits = bitsOop.words;\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tx = (xArray[i]|0);\n\t\t;\n\t\ty = (yArray[i]|0);\n\t\t;\n\t\tif (((x >= 0) && (y >= 0)) && ((x < bitsWidth) && (y < bitsHeight))) {\n\t\t\tbitsIndex = (y * bitsWidth) + x;\n\t\t\tdestWords[i] = bits[bitsIndex];\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction primScalarForward() {\n\tvar bottomEdgeMode;\n\tvar destHeight;\n\tvar destWidth;\n\tvar dist;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar index;\n\tvar leftEdgeMode;\n\tvar newX;\n\tvar newY;\n\tvar rightEdgeMode;\n\tvar size;\n\tvar topEdgeMode;\n\tvar val;\n\tvar xArray;\n\tvar xOop;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\tbottomEdgeMode = interpreterProxy.stackIntegerValue(0);\n\ttopEdgeMode = interpreterProxy.stackIntegerValue(1);\n\trightEdgeMode = interpreterProxy.stackIntegerValue(2);\n\tleftEdgeMode = interpreterProxy.stackIntegerValue(3);\n\tdestHeight = interpreterProxy.stackFloatValue(4);\n\tdestWidth = interpreterProxy.stackFloatValue(5);\n\tval = interpreterProxy.stackFloatValue(6);\n\theadingOop = interpreterProxy.stackValue(7);\n\tyOop = interpreterProxy.stackValue(8);\n\txOop = interpreterProxy.stackValue(9);\n\tindex = interpreterProxy.stackIntegerValue(10);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(yOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\tyArray = yOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tdist = val;\n\ti = index - 1;\n\tnewX = xArray[i] + (dist * Math.cos(headingArray[i]));\n\tnewY = yArray[i] - (dist * Math.sin(headingArray[i]));\n\tscalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(i, xArray, headingArray, newX, destWidth, leftEdgeMode, rightEdgeMode);\n\tscalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(i, yArray, headingArray, newY, destHeight, topEdgeMode, bottomEdgeMode);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(11);\n}\n\nfunction primSetPixelsAtXY() {\n\tvar bits;\n\tvar bitsHeight;\n\tvar bitsIndex;\n\tvar bitsOop;\n\tvar bitsWidth;\n\tvar i;\n\tvar intValue;\n\tvar isValueInt;\n\tvar size;\n\tvar value;\n\tvar valueOop;\n\tvar wordsValue;\n\tvar x;\n\tvar xArray;\n\tvar xArrayOop;\n\tvar y;\n\tvar yArray;\n\tvar yArrayOop;\n\n\t/* inline: true */;\n\tvalueOop = interpreterProxy.stackValue(0);\n\tbitsHeight = interpreterProxy.stackIntegerValue(1);\n\tbitsWidth = interpreterProxy.stackIntegerValue(2);\n\tbitsOop = interpreterProxy.stackValue(3);\n\tyArrayOop = interpreterProxy.stackValue(4);\n\txArrayOop = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif ((bitsHeight * bitsWidth) !== SIZEOF(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xArrayOop);\n\tif (SIZEOF(yArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tisValueInt = typeof valueOop === \"number\";\n\tif (isValueInt) {\n\t\tintValue = valueOop;\n\t}\n\tif (!isValueInt) {\n\t\tif (!interpreterProxy.isMemberOf(valueOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\tif (SIZEOF(valueOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\txArray = xArrayOop.wordsAsFloat32Array();\n\tyArray = yArrayOop.wordsAsFloat32Array();\n\tif (!isValueInt) {\n\t\twordsValue = valueOop.words;\n\t}\n\tbits = bitsOop.words;\n\tif (isValueInt) {\n\t\tvalue = intValue;\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tx = (xArray[i]|0);\n\t\t;\n\t\ty = (yArray[i]|0);\n\t\t;\n\t\tif (((x >= 0) && (y >= 0)) && ((x < bitsWidth) && (y < bitsHeight))) {\n\t\t\tbitsIndex = (y * bitsWidth) + x;\n\t\t\tif (!isValueInt) {\n\t\t\t\tvalue = wordsValue[i];\n\t\t\t}\n\t\t\tbits[bitsIndex] = value;\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction primTurtlesForward() {\n\tvar bottomEdgeMode;\n\tvar destHeight;\n\tvar destWidth;\n\tvar dist;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar isValVector;\n\tvar leftEdgeMode;\n\tvar newX;\n\tvar newY;\n\tvar rightEdgeMode;\n\tvar size;\n\tvar topEdgeMode;\n\tvar val;\n\tvar valArray;\n\tvar valOop;\n\tvar xArray;\n\tvar xOop;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\tbottomEdgeMode = interpreterProxy.stackIntegerValue(0);\n\ttopEdgeMode = interpreterProxy.stackIntegerValue(1);\n\trightEdgeMode = interpreterProxy.stackIntegerValue(2);\n\tleftEdgeMode = interpreterProxy.stackIntegerValue(3);\n\tdestHeight = interpreterProxy.stackFloatValue(4);\n\tdestWidth = interpreterProxy.stackFloatValue(5);\n\tvalOop = interpreterProxy.stackValue(6);\n\theadingOop = interpreterProxy.stackValue(7);\n\tyOop = interpreterProxy.stackValue(8);\n\txOop = interpreterProxy.stackValue(9);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (valOop.isFloat) {\n\t\tisValVector = false;\n\t} else {\n\t\tif (interpreterProxy.isWords(valOop)) {\n\t\t\tisValVector = true;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(yOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (isValVector) {\n\t\tif (SIZEOF(valOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\tyArray = yOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tif (isValVector) {\n\t\tvalArray = valOop.wordsAsFloat32Array();\n\t} else {\n\t\tval = interpreterProxy.floatValueOf(valOop);\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (isValVector) {\n\t\t\tdist = valArray[i];\n\t\t} else {\n\t\t\tdist = val;\n\t\t}\n\t\tnewX = xArray[i] + (dist * Math.cos(headingArray[i]));\n\t\tnewY = yArray[i] - (dist * Math.sin(headingArray[i]));\n\t\tscalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(i, xArray, headingArray, newX, destWidth, leftEdgeMode, rightEdgeMode);\n\t\tscalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(i, yArray, headingArray, newY, destHeight, topEdgeMode, bottomEdgeMode);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(10);\n}\n\nfunction primUpHill() {\n\tvar bits;\n\tvar bitsOop;\n\tvar endX;\n\tvar endY;\n\tvar height;\n\tvar maxVal;\n\tvar maxValX;\n\tvar maxValY;\n\tvar ret;\n\tvar rowOffset;\n\tvar sniffRange;\n\tvar startX;\n\tvar startY;\n\tvar tH;\n\tvar tX;\n\tvar tY;\n\tvar thisVal;\n\tvar turtleX;\n\tvar turtleY;\n\tvar width;\n\tvar x;\n\tvar y;\n\n\t/* inline: true */;\n\tsniffRange = interpreterProxy.stackIntegerValue(0);\n\theight = interpreterProxy.stackIntegerValue(1);\n\twidth = interpreterProxy.stackIntegerValue(2);\n\tbitsOop = interpreterProxy.stackValue(3);\n\ttH = interpreterProxy.stackFloatValue(4);\n\ttY = interpreterProxy.stackFloatValue(5);\n\ttX = interpreterProxy.stackFloatValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(bitsOop) !== (height * width)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tbits = bitsOop.words;\n\tturtleX = tX;\n\tturtleY = tY;\n\tturtleX = Math.max(turtleX, 0);\n\tturtleY = Math.max(turtleY, 0);\n\tturtleX = Math.min(turtleX, (width - 1));\n\tturtleY = Math.min(turtleY, (height - 1));\n\tstartX = Math.max((turtleX - sniffRange), 0);\n\tendX = Math.min((turtleX + sniffRange), (width - 1));\n\tstartY = Math.max((turtleY - sniffRange), 0);\n\tendY = Math.min((turtleY + sniffRange), (height - 1));\n\tmaxVal = bits[(turtleY * width) + turtleX];\n\tmaxValX = -1;\n\tfor (y = startY; y <= endY; y++) {\n\t\trowOffset = y * width;\n\t\tfor (x = startX; x <= endX; x++) {\n\t\t\tthisVal = bits[rowOffset + x];\n\t\t\tif (thisVal > maxVal) {\n\t\t\t\tmaxValX = x;\n\t\t\t\tmaxValY = y;\n\t\t\t\tmaxVal = thisVal;\n\t\t\t}\n\t\t}\n\t}\n\tif (-1 === maxValX) {\n\t\tret = radiansToDegrees(tH);\n\t} else {\n\t\tret = degreesFromXy((maxValX - turtleX), (maxValY - turtleY)) + 90.0|0;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(8);\n\tinterpreterProxy.pushFloat(ret);\n}\n\nfunction primitiveAddArrays() {\n\tvar argOop;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] + wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] + floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] + wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] + floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveAddScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] + intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] + floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] + intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] + floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveDivArrays() {\n\tvar argOop;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] / wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] / floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] / wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] / floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveDivScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (DIV(wordsRcvr[i], intArg));\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] / floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] / intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] / floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveMulArrays() {\n\tvar argOop;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] * wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] * floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] * wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] * floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveMulScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] * intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] * floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] * intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] * floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveSubArrays() {\n\tvar argOop;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] - wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] - floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] - wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] - floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveSubScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] - intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] - floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] - intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] - floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction radiansToDegrees(radians) {\n\tvar deg;\n\tvar degrees;\n\n\t/* inline: true */;\n\tdegrees = radians / 0.0174532925199433;\n\tdeg = 90.0 - degrees;\n\tif (!(deg > 0.0)) {\n\t\tdeg += 360.0;\n\t}\n\treturn deg;\n}\n\nfunction randomIntoFloatArray() {\n\tvar factor;\n\tvar floatArray;\n\tvar floatArrayOop;\n\tvar from;\n\tvar index;\n\tvar range;\n\tvar size;\n\tvar to;\n\n\t/* inline: true */;\n\tfactor = interpreterProxy.stackFloatValue(0);\n\tfloatArrayOop = interpreterProxy.stackValue(1);\n\tto = interpreterProxy.stackIntegerValue(2);\n\tfrom = interpreterProxy.stackIntegerValue(3);\n\trange = interpreterProxy.stackIntegerValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(floatArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(floatArrayOop);\n\tif (!((size >= to) && ((from >= 1) && (to >= from)))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tfloatArray = floatArrayOop.wordsAsFloat32Array();\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (index = from; index <= to; index++) {\n\t\tfloatArray[index - 1] = (kedamaRandom2(range) * factor);\n\t}\n\tinterpreterProxy.pop(5);\n}\n\nfunction randomIntoIntegerArray() {\n\tvar factor;\n\tvar from;\n\tvar index;\n\tvar integerArray;\n\tvar integerArrayOop;\n\tvar range;\n\tvar size;\n\tvar to;\n\n\t/* inline: true */;\n\tfactor = interpreterProxy.stackFloatValue(0);\n\tintegerArrayOop = interpreterProxy.stackValue(1);\n\tto = interpreterProxy.stackIntegerValue(2);\n\tfrom = interpreterProxy.stackIntegerValue(3);\n\trange = interpreterProxy.stackIntegerValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(integerArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(integerArrayOop);\n\tif (!((size >= to) && ((from >= 1) && (to >= from)))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tintegerArray = integerArrayOop.words;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (index = from; index <= to; index++) {\n\t\tintegerArray[index - 1] = ((kedamaRandom2(range) * factor)|0);\n\t}\n\tinterpreterProxy.pop(5);\n}\n\nfunction randomRange() {\n\tvar range;\n\tvar ret;\n\n\t/* inline: true */;\n\trange = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tret = kedamaRandom2(range);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(2);\n\tinterpreterProxy.pushInteger(ret);\n}\n\nfunction scalarGetAngleTo() {\n\tvar fromX;\n\tvar fromY;\n\tvar r;\n\tvar toX;\n\tvar toY;\n\tvar x;\n\tvar y;\n\n\t/* inline: true */;\n\tfromY = interpreterProxy.stackFloatValue(0);\n\tfromX = interpreterProxy.stackFloatValue(1);\n\ttoY = interpreterProxy.stackFloatValue(2);\n\ttoX = interpreterProxy.stackFloatValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tx = toX - fromX;\n\ty = toY - fromY;\n\tr = degreesFromXy(x, y);\n\tr += 90.0;\n\tif (r > 360.0) {\n\t\tr -= 360.0;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(5);\n\tinterpreterProxy.pushFloat(r);\n}\n\nfunction scalarGetDistanceTo() {\n\tvar fromX;\n\tvar fromY;\n\tvar r;\n\tvar toX;\n\tvar toY;\n\tvar x;\n\tvar y;\n\n\t/* inline: true */;\n\tfromY = interpreterProxy.stackFloatValue(0);\n\tfromX = interpreterProxy.stackFloatValue(1);\n\ttoY = interpreterProxy.stackFloatValue(2);\n\ttoX = interpreterProxy.stackFloatValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tx = fromX - toX;\n\ty = fromY - toY;\n\tr = Math.sqrt((x * x) + (y * y));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(5);\n\tinterpreterProxy.pushFloat(r);\n}\n\nfunction scalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(index, xArray, headingArray, val, destWidth, leftEdgeMode, rightEdgeMode) {\n\tvar headingRadians;\n\tvar newX;\n\n\t/* inline: true */;\n\tnewX = val;\n\tif (newX < 0.0) {\n\t\tif (leftEdgeMode === 1) {\n\n\t\t\t/* wrap */\n\n\t\t\tnewX += destWidth;\n\t\t}\n\t\tif (leftEdgeMode === 2) {\n\n\t\t\t/* stick */\n\n\t\t\tnewX = 0.0;\n\t\t}\n\t\tif (leftEdgeMode === 3) {\n\n\t\t\t/* bounce */\n\n\t\t\tnewX = 0.0 - newX;\n\t\t\theadingRadians = headingArray[index];\n\t\t\tif (headingRadians < 3.141592653589793) {\n\t\t\t\theadingArray[index] = (3.141592653589793 - headingRadians);\n\t\t\t} else {\n\t\t\t\theadingArray[index] = (9.42477796076938 - headingRadians);\n\t\t\t}\n\t\t}\n\t}\n\tif (newX >= destWidth) {\n\t\tif (rightEdgeMode === 1) {\n\t\t\tnewX -= destWidth;\n\t\t}\n\t\tif (rightEdgeMode === 2) {\n\t\t\tnewX = destWidth - 1.0e-6;\n\t\t}\n\t\tif (rightEdgeMode === 3) {\n\t\t\tnewX = (destWidth - 1.0e-6) - (newX - destWidth);\n\t\t\theadingRadians = headingArray[index];\n\t\t\tif (headingRadians < 3.141592653589793) {\n\t\t\t\theadingArray[index] = (3.141592653589793 - headingRadians);\n\t\t\t} else {\n\t\t\t\theadingArray[index] = (9.42477796076938 - headingRadians);\n\t\t\t}\n\t\t}\n\t}\n\txArray[index] = newX;\n}\n\nfunction scalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(index, yArray, headingArray, val, destHeight, topEdgeMode, bottomEdgeMode) {\n\tvar newY;\n\n\t/* inline: true */;\n\tnewY = val;\n\tif (newY < 0.0) {\n\t\tif (topEdgeMode === 1) {\n\n\t\t\t/* wrap */\n\n\t\t\tnewY += destHeight;\n\t\t}\n\t\tif (topEdgeMode === 2) {\n\n\t\t\t/* stick */\n\n\t\t\tnewY = 0.0;\n\t\t}\n\t\tif (topEdgeMode === 3) {\n\n\t\t\t/* bounce */\n\n\t\t\tnewY = 0.0 - newY;\n\t\t\theadingArray[index] = (6.283185307179586 - headingArray[index]);\n\t\t}\n\t}\n\tif (newY >= destHeight) {\n\t\tif (bottomEdgeMode === 1) {\n\t\t\tnewY -= destHeight;\n\t\t}\n\t\tif (bottomEdgeMode === 2) {\n\t\t\tnewY = destHeight - 1.0e-6;\n\t\t}\n\t\tif (bottomEdgeMode === 3) {\n\t\t\tnewY = (destHeight - 1.0e-6) - (newY - destHeight);\n\t\t\theadingArray[index] = (6.283185307179586 - headingArray[index]);\n\t\t}\n\t}\n\tyArray[index] = newY;\n}\n\nfunction setHeadingArrayFrom() {\n\tvar heading;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar isValVector;\n\tvar resultArray;\n\tvar resultOop;\n\tvar size;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackValue(0);\n\theadingOop = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(headingOop);\n\tif (resultOop.isFloat) {\n\t\tisValVector = false;\n\t} else {\n\t\tif (interpreterProxy.isWords(resultOop)) {\n\t\t\tif (SIZEOF(resultOop) !== size) {\n\t\t\t\tinterpreterProxy.primitiveFail();\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tisValVector = true;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tif (isValVector) {\n\t\tresultArray = resultOop.wordsAsFloat32Array();\n\t} else {\n\t\theading = interpreterProxy.floatValueOf(resultOop);\n\t\theading = degreesToRadians(heading);\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (isValVector) {\n\t\t\theading = resultArray[i];\n\t\t\theading = degreesToRadians(heading);\n\t\t}\n\t\theadingArray[i] = heading;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(2);\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\nfunction setScalarHeading() {\n\tvar heading;\n\tvar headingArray;\n\tvar headingOop;\n\tvar index;\n\n\t/* inline: true */;\n\theading = interpreterProxy.stackFloatValue(0);\n\theadingOop = interpreterProxy.stackValue(1);\n\tindex = interpreterProxy.stackIntegerValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) < index) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\theadingArray = headingOop.wordsAsFloat32Array();\n\theadingArray[index - 1] = degreesToRadians(heading);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(3);\n}\n\nfunction shutdownModule() {\n\treturn true;\n}\n\nfunction turtleScalarSetX() {\n\tvar destWidth;\n\tvar headingArray;\n\tvar headingOop;\n\tvar leftEdgeMode;\n\tvar rightEdgeMode;\n\tvar size;\n\tvar val;\n\tvar xArray;\n\tvar xIndex;\n\tvar xOop;\n\n\t/* inline: true */;\n\trightEdgeMode = interpreterProxy.stackIntegerValue(0);\n\tleftEdgeMode = interpreterProxy.stackIntegerValue(1);\n\tdestWidth = interpreterProxy.stackFloatValue(2);\n\tval = interpreterProxy.stackFloatValue(3);\n\theadingOop = interpreterProxy.stackValue(4);\n\txIndex = interpreterProxy.stackIntegerValue(5);\n\txOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tscalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(xIndex - 1, xArray, headingArray, val, destWidth, leftEdgeMode, rightEdgeMode);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction turtleScalarSetY() {\n\tvar bottomEdgeMode;\n\tvar destHeight;\n\tvar headingArray;\n\tvar headingOop;\n\tvar size;\n\tvar topEdgeMode;\n\tvar val;\n\tvar yArray;\n\tvar yIndex;\n\tvar yOop;\n\n\t/* inline: true */;\n\tbottomEdgeMode = interpreterProxy.stackIntegerValue(0);\n\ttopEdgeMode = interpreterProxy.stackIntegerValue(1);\n\tdestHeight = interpreterProxy.stackFloatValue(2);\n\tval = interpreterProxy.stackFloatValue(3);\n\theadingOop = interpreterProxy.stackValue(4);\n\tyIndex = interpreterProxy.stackIntegerValue(5);\n\tyOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(yOop);\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tyArray = yOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tscalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(yIndex - 1, yArray, headingArray, val, destHeight, topEdgeMode, bottomEdgeMode);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction turtlesSetX() {\n\tvar destWidth;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar isValVector;\n\tvar leftEdgeMode;\n\tvar newX;\n\tvar rightEdgeMode;\n\tvar size;\n\tvar val;\n\tvar valArray;\n\tvar valOop;\n\tvar xArray;\n\tvar xOop;\n\n\t/* inline: true */;\n\trightEdgeMode = interpreterProxy.stackIntegerValue(0);\n\tleftEdgeMode = interpreterProxy.stackIntegerValue(1);\n\tdestWidth = interpreterProxy.stackFloatValue(2);\n\tvalOop = interpreterProxy.stackValue(3);\n\theadingOop = interpreterProxy.stackValue(4);\n\txOop = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (valOop.isFloat) {\n\t\tisValVector = false;\n\t} else {\n\t\tif (interpreterProxy.isWords(valOop)) {\n\t\t\tisValVector = true;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (isValVector) {\n\t\tif (SIZEOF(valOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tif (isValVector) {\n\t\tvalArray = valOop.wordsAsFloat32Array();\n\t} else {\n\t\tval = interpreterProxy.floatValueOf(valOop);\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (isValVector) {\n\t\t\tnewX = valArray[i];\n\t\t} else {\n\t\t\tnewX = val;\n\t\t}\n\t\tscalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(i, xArray, headingArray, newX, destWidth, leftEdgeMode, rightEdgeMode);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction turtlesSetY() {\n\tvar bottomEdgeMode;\n\tvar destHeight;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar isValVector;\n\tvar newY;\n\tvar size;\n\tvar topEdgeMode;\n\tvar val;\n\tvar valArray;\n\tvar valOop;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\tbottomEdgeMode = interpreterProxy.stackIntegerValue(0);\n\ttopEdgeMode = interpreterProxy.stackIntegerValue(1);\n\tdestHeight = interpreterProxy.stackFloatValue(2);\n\tvalOop = interpreterProxy.stackValue(3);\n\theadingOop = interpreterProxy.stackValue(4);\n\tyOop = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (valOop.isFloat) {\n\t\tisValVector = false;\n\t} else {\n\t\tif (interpreterProxy.isWords(valOop)) {\n\t\t\tisValVector = true;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tsize = SIZEOF(yOop);\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (isValVector) {\n\t\tif (SIZEOF(valOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tyArray = yOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tif (isValVector) {\n\t\tvalArray = valOop.wordsAsFloat32Array();\n\t} else {\n\t\tval = interpreterProxy.floatValueOf(valOop);\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (isValVector) {\n\t\t\tnewY = valArray[i];\n\t\t} else {\n\t\t\tnewY = val;\n\t\t}\n\t\tscalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(i, yArray, headingArray, newY, destHeight, topEdgeMode, bottomEdgeMode);\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction vectorGetAngleTo() {\n\tvar index;\n\tvar isVector;\n\tvar pX;\n\tvar pXOop;\n\tvar pY;\n\tvar pYOop;\n\tvar ppx;\n\tvar ppy;\n\tvar r;\n\tvar result;\n\tvar resultOop;\n\tvar size;\n\tvar x;\n\tvar xArray;\n\tvar xArrayOop;\n\tvar y;\n\tvar yArray;\n\tvar yArrayOop;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackValue(0);\n\tyArrayOop = interpreterProxy.stackValue(1);\n\txArrayOop = interpreterProxy.stackValue(2);\n\tpYOop = interpreterProxy.stackValue(3);\n\tpXOop = interpreterProxy.stackValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(resultOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(resultOop);\n\tif (size < 0) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(xArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(yArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (pXOop.isFloat) {\n\t\tif (pYOop.isFloat) {\n\t\t\tisVector = false;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (pYOop.isFloat) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t} else {\n\t\t\tisVector = true;\n\t\t}\n\t}\n\tif (isVector) {\n\t\tif (SIZEOF(pXOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\tif (SIZEOF(pYOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tresult = resultOop.wordsAsFloat32Array();\n\txArray = xArrayOop.wordsAsFloat32Array();\n\tyArray = yArrayOop.wordsAsFloat32Array();\n\tif (isVector) {\n\t\tpX = pXOop.wordsAsFloat32Array();\n\t\tpY = pYOop.wordsAsFloat32Array();\n\t}\n\tif (!isVector) {\n\t\tppx = interpreterProxy.floatValueOf(pXOop);\n\t\tppy = interpreterProxy.floatValueOf(pYOop);\n\t}\n\tfor (index = 0; index <= (size - 1); index++) {\n\t\tif (isVector) {\n\t\t\tppx = pX[index];\n\t\t\tppy = pY[index];\n\t\t}\n\t\tx = ppx - xArray[index];\n\t\ty = ppy - yArray[index];\n\t\tr = degreesFromXy(x, y);\n\t\tr += 90.0;\n\t\tif (r > 360.0) {\n\t\t\tr -= 360.0;\n\t\t}\n\t\tresult[index] = r;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction vectorGetDistanceTo() {\n\tvar index;\n\tvar isVector;\n\tvar pX;\n\tvar pXOop;\n\tvar pY;\n\tvar pYOop;\n\tvar ppx;\n\tvar ppy;\n\tvar result;\n\tvar resultOop;\n\tvar size;\n\tvar x;\n\tvar xArray;\n\tvar xArrayOop;\n\tvar y;\n\tvar yArray;\n\tvar yArrayOop;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackValue(0);\n\tyArrayOop = interpreterProxy.stackValue(1);\n\txArrayOop = interpreterProxy.stackValue(2);\n\tpYOop = interpreterProxy.stackValue(3);\n\tpXOop = interpreterProxy.stackValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(resultOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(resultOop);\n\tif (size < 0) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(xArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(yArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (pXOop.isFloat) {\n\t\tif (pYOop.isFloat) {\n\t\t\tisVector = false;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (pYOop.isFloat) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t} else {\n\t\t\tisVector = true;\n\t\t}\n\t}\n\tif (isVector) {\n\t\tif (SIZEOF(pXOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\tif (SIZEOF(pYOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tresult = resultOop.wordsAsFloat32Array();\n\txArray = xArrayOop.wordsAsFloat32Array();\n\tyArray = yArrayOop.wordsAsFloat32Array();\n\tif (isVector) {\n\t\tpX = pXOop.wordsAsFloat32Array();\n\t\tpY = pYOop.wordsAsFloat32Array();\n\t}\n\tif (!isVector) {\n\t\tppx = interpreterProxy.floatValueOf(pXOop);\n\t\tppy = interpreterProxy.floatValueOf(pYOop);\n\t}\n\tfor (index = 0; index <= (size - 1); index++) {\n\t\tif (isVector) {\n\t\t\tppx = pX[index];\n\t\t\tppy = pY[index];\n\t\t}\n\t\tx = ppx - xArray[index];\n\t\ty = ppy - yArray[index];\n\t\tresult[index] = Math.sqrt((x * x) + (y * y));\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction zoomBitmap() {\n\tvar bit;\n\tvar dOrigin;\n\tvar dst;\n\tvar dstIndex;\n\tvar dstSize;\n\tvar dummy;\n\tvar sHeight;\n\tvar sOrigin;\n\tvar sWidth;\n\tvar src;\n\tvar srcIndex;\n\tvar srcOrigin;\n\tvar srcSize;\n\tvar sx;\n\tvar sy;\n\tvar xFactor;\n\tvar y;\n\tvar yFactor;\n\n\t/* inline: true */;\n\tyFactor = interpreterProxy.stackIntegerValue(0);\n\txFactor = interpreterProxy.stackIntegerValue(1);\n\tsHeight = interpreterProxy.stackIntegerValue(2);\n\tsWidth = interpreterProxy.stackIntegerValue(3);\n\tdst = interpreterProxy.stackValue(4);\n\tsrc = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tsrcSize = SIZEOF(src);\n\tdstSize = SIZEOF(dst);\n\tif ((sWidth * sHeight) !== srcSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (((srcSize * xFactor) * yFactor) !== dstSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsOrigin = src.words;\n\tdOrigin = dst.words;\n\tsrcIndex = 0;\n\tsrcOrigin = 0;\n\tdstIndex = 0;\n\tfor (sy = 0; sy <= (sHeight - 1); sy++) {\n\t\tfor (y = 0; y <= (yFactor - 1); y++) {\n\t\t\tfor (sx = 0; sx <= (sWidth - 1); sx++) {\n\t\t\t\tbit = sOrigin[srcIndex];\n\t\t\t\t++srcIndex;\n\t\t\t\tfor (dummy = 0; dummy <= (xFactor - 1); dummy++) {\n\t\t\t\t\tdOrigin[dstIndex] = bit;\n\t\t\t\t\t++dstIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsrcIndex = srcOrigin;\n\t\t}\n\t\tsrcOrigin += sWidth;\n\t\tsrcIndex = srcOrigin;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\n\nSqueak.registerExternalModule(\"KedamaPlugin\", {\n\tmakeMaskLog: makeMaskLog,\n\tvectorGetDistanceTo: vectorGetDistanceTo,\n\tgetScalarHeading: getScalarHeading,\n\tshutdownModule: shutdownModule,\n\tprimitiveAddScalar: primitiveAddScalar,\n\tprimSetPixelsAtXY: primSetPixelsAtXY,\n\tturtleScalarSetX: turtleScalarSetX,\n\tprimPixelAtXY: primPixelAtXY,\n\tprimUpHill: primUpHill,\n\tprimScalarForward: primScalarForward,\n\tprimitiveDivArrays: primitiveDivArrays,\n\tgetModuleName: getModuleName,\n\tprimitiveSubArrays: primitiveSubArrays,\n\tscalarGetAngleTo: scalarGetAngleTo,\n\trandomRange: randomRange,\n\tsetInterpreter: setInterpreter,\n\tkedamaSetRandomSeed: kedamaSetRandomSeed,\n\tdrawTurtlesInArray: drawTurtlesInArray,\n\tturtleScalarSetY: turtleScalarSetY,\n\trandomIntoIntegerArray: randomIntoIntegerArray,\n\tgetHeadingArrayInto: getHeadingArrayInto,\n\tmakeTurtlesMap: makeTurtlesMap,\n\tsetHeadingArrayFrom: setHeadingArrayFrom,\n\tturtlesSetX: turtlesSetX,\n\tsetScalarHeading: setScalarHeading,\n\tmakeMask: makeMask,\n\tprimitiveDivScalar: primitiveDivScalar,\n\tprimitiveSubScalar: primitiveSubScalar,\n\tprimPixelsAtXY: primPixelsAtXY,\n\tvectorGetAngleTo: vectorGetAngleTo,\n\tprimitiveMulArrays: primitiveMulArrays,\n\tprimPixelAtXYPut: primPixelAtXYPut,\n\tzoomBitmap: zoomBitmap,\n\tinitialiseModule: initialiseModule,\n\tprimitiveAddArrays: primitiveAddArrays,\n\tscalarGetDistanceTo: scalarGetDistanceTo,\n\tturtlesSetY: turtlesSetY,\n\trandomIntoFloatArray: randomIntoFloatArray,\n\tprimTurtlesForward: primTurtlesForward,\n\tprimitiveMulScalar: primitiveMulScalar,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 13 November 2014 7:11:01 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.16 uuid: aa9fd3da-7901-4c62-ae34-c166f1492d3b\n from\n\tKedamaPlugin2 Kedama-Plugins-yo.1 uuid: 3fc7d691-0149-ba4d-a339-5d27cd44a2f8\n */\n\nmodule(\"users.bert.SqueakJS.plugins.KedamaPlugin2\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar kedamaRandomSeed = 0;\nvar moduleName = \"KedamaPlugin2 13 November 2014 (e)\";\nvar randA = 0;\nvar randM = 0;\nvar randQ = 0;\nvar randR = 0;\n\n\nfunction degreesFromXy(x, y) {\n\tvar tanVal;\n\tvar theta;\n\n\t/* inline: true */;\n\tif (x === 0.0) {\n\t\tif (y >= 0.0) {\n\t\t\treturn 90.0;\n\t\t} else {\n\t\t\treturn 270.0;\n\t\t}\n\t} else {\n\t\ttanVal = y / x;\n\t\ttheta = Math.atan(tanVal);\n\t\tif (x >= 0.0) {\n\t\t\tif (y >= 0.0) {\n\t\t\t\treturn theta / 0.0174532925199433;\n\t\t\t} else {\n\t\t\t\treturn 360.0 + (theta / 0.0174532925199433);\n\t\t\t}\n\t\t} else {\n\t\t\treturn 180.0 + (theta / 0.0174532925199433);\n\t\t}\n\t}\n\treturn 0.0;\n}\n\nfunction degreesToRadians(degrees) {\n\tvar deg;\n\tvar headingRadians;\n\tvar q;\n\n\t/* inline: true */;\n\tdeg = 90.0 - degrees;\n\tq = deg / 360.0|0;\n\tif (deg < 0.0) {\n\t\t--q;\n\t}\n\theadingRadians = (deg - (q * 360.0)) * 0.0174532925199433;\n\treturn headingRadians;\n}\n\nfunction drawTurtlesInArray() {\n\tvar bitsIndex;\n\tvar colorArray;\n\tvar colorOop;\n\tvar destBits;\n\tvar destHeight;\n\tvar destOop;\n\tvar destWidth;\n\tvar i;\n\tvar size;\n\tvar visible;\n\tvar visibleArray;\n\tvar visibleOop;\n\tvar x;\n\tvar xArray;\n\tvar xOop;\n\tvar y;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\tvisibleOop = interpreterProxy.stackValue(0);\n\tcolorOop = interpreterProxy.stackValue(1);\n\tyOop = interpreterProxy.stackValue(2);\n\txOop = interpreterProxy.stackValue(3);\n\tdestHeight = interpreterProxy.stackIntegerValue(4);\n\tdestWidth = interpreterProxy.stackIntegerValue(5);\n\tdestOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(destOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(colorOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(visibleOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif ((destHeight * destWidth) !== SIZEOF(destOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(yOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(colorOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(visibleOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\tyArray = yOop.wordsAsFloat32Array();\n\tcolorArray = colorOop.words;\n\tvisibleArray = visibleOop.bytes;\n\tdestBits = destOop.words;\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tx = (xArray[i]|0);\n\t\t;\n\t\ty = (yArray[i]|0);\n\t\t;\n\t\tvisible = visibleArray[i];\n\t\tif ((visible !== 0) && (((x >= 0) && (y >= 0)) && ((x < destWidth) && (y < destHeight)))) {\n\t\t\tbitsIndex = (y * destWidth) + x;\n\t\t\tdestBits[bitsIndex] = colorArray[i];\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction getHeadingArrayInto() {\n\tvar heading;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar resultArray;\n\tvar resultOop;\n\tvar size;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackValue(0);\n\theadingOop = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(resultOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(headingOop);\n\tif (SIZEOF(resultOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tresultArray = resultOop.wordsAsFloat32Array();\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\theading = headingArray[i];\n\t\theading = heading / 0.0174532925199433;\n\t\theading = 90.0 - heading;\n\t\tif (!(heading > 0.0)) {\n\t\t\theading += 360.0;\n\t\t}\n\t\tresultArray[i] = heading;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(2);\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction getScalarHeading() {\n\tvar heading;\n\tvar headingArray;\n\tvar headingOop;\n\tvar index;\n\n\t/* inline: true */;\n\theadingOop = interpreterProxy.stackValue(0);\n\tindex = interpreterProxy.stackIntegerValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) < index) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\theadingArray = headingOop.wordsAsFloat32Array();\n\theading = headingArray[index - 1];\n\theading = radiansToDegrees(heading);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(3);\n\tinterpreterProxy.pushFloat(heading);\n}\n\nfunction halt() {\n\t;\n}\n\nfunction initialiseModule() {\n\tkedamaRandomSeed = 17;\n\n\t/* magic constant = 16807 */\n\n\trandA = 16807;\n\n\t/* magic constant = 2147483647 */\n\n\trandM = 2147483647;\n\trandQ = DIV(randM, randA);\n\trandR = MOD(randM, randA);\n}\n\nfunction kedamaRandom2(range) {\n\tvar hi;\n\tvar lo;\n\tvar r;\n\tvar v;\n\tvar val;\n\n\t/* inline: true */;\n\tif (range < 0) {\n\t\tr = 0 - range;\n\t} else {\n\t\tr = range;\n\t}\n\thi = DIV(kedamaRandomSeed, randQ);\n\tlo = MOD(kedamaRandomSeed, randQ);\n\tkedamaRandomSeed = (randA * lo) - (randR * hi);\n\tv = kedamaRandomSeed & 65535;\n\tval = (v * (r + 1)) >>> 16;\n\tif (range < 0) {\n\t\treturn 0 - val;\n\t} else {\n\t\treturn val;\n\t}\n}\n\nfunction kedamaSetRandomSeed() {\n\tvar seed;\n\n\t/* inline: true */;\n\tseed = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tkedamaRandomSeed = seed & 65536;\n\tinterpreterProxy.pop(1);\n}\n\nfunction makeMask() {\n\tvar alpha;\n\tvar dOrigin;\n\tvar data;\n\tvar dataBits;\n\tvar dataSize;\n\tvar highMask;\n\tvar i;\n\tvar mOrigin;\n\tvar maskBits;\n\tvar maskSize;\n\tvar pixel;\n\tvar shiftAmount;\n\n\t/* inline: true */;\n\tshiftAmount = interpreterProxy.stackIntegerValue(0);\n\tpixel = interpreterProxy.stackIntegerValue(1);\n\tmaskBits = interpreterProxy.stackValue(2);\n\tdataBits = interpreterProxy.stackValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tdataSize = SIZEOF(dataBits);\n\tmaskSize = SIZEOF(maskBits);\n\tif (dataSize !== maskSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (shiftAmount < -32) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (shiftAmount > 8) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tdOrigin = dataBits.words;\n\tmOrigin = maskBits.words;\n\thighMask = 4278190080;\n\tfor (i = 0; i <= (dataSize - 1); i++) {\n\t\tdata = dOrigin[i];\n\t\talpha = SHIFT(data, shiftAmount);\n\t\tif (alpha > 255) {\n\t\t\talpha = 255;\n\t\t}\n\t\tif (alpha < 0) {\n\t\t\talpha = 0;\n\t\t}\n\t\tmOrigin[i] = (((alpha << 24) & highMask) | pixel);\n\t}\n\tinterpreterProxy.pop(4);\n}\n\nfunction makeMaskLog() {\n\tvar alpha;\n\tvar dOrigin;\n\tvar data;\n\tvar dataBits;\n\tvar dataSize;\n\tvar highMask;\n\tvar i;\n\tvar mOrigin;\n\tvar maskBits;\n\tvar maskSize;\n\tvar max;\n\tvar maxFirst;\n\tvar maxLog;\n\tvar maxOop;\n\tvar pixel;\n\n\t/* inline: true */;\n\tmaxOop = interpreterProxy.stackValue(0);\n\tpixel = interpreterProxy.stackIntegerValue(1);\n\tmaskBits = interpreterProxy.stackValue(2);\n\tdataBits = interpreterProxy.stackValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tmaxFirst = maxOop.words;\n\tmax = maxFirst[0];\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tmaxLog = Math.log(max);\n\tdataSize = SIZEOF(dataBits);\n\tmaskSize = SIZEOF(maskBits);\n\tif (dataSize !== maskSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tdOrigin = dataBits.words;\n\tmOrigin = maskBits.words;\n\thighMask = 4278190080;\n\tfor (i = 0; i <= (dataSize - 1); i++) {\n\t\tdata = dOrigin[i];\n\t\tif (data === 0) {\n\t\t\talpha = 0;\n\t\t} else {\n\t\t\talpha = (((255.0 / maxLog) * Math.log(data))|0);\n\t\t}\n\t\tif (alpha > 255) {\n\t\t\talpha = 255;\n\t\t}\n\t\tmOrigin[i] = (((alpha << 24) & highMask) | pixel);\n\t}\n\tinterpreterProxy.pop(4);\n}\n\nfunction makeTurtlesMap() {\n\tvar height;\n\tvar index;\n\tvar map;\n\tvar mapIndex;\n\tvar mapOop;\n\tvar size;\n\tvar whoArray;\n\tvar whoOop;\n\tvar width;\n\tvar x;\n\tvar xArray;\n\tvar xOop;\n\tvar y;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\theight = interpreterProxy.stackIntegerValue(0);\n\twidth = interpreterProxy.stackIntegerValue(1);\n\tyOop = interpreterProxy.stackValue(2);\n\txOop = interpreterProxy.stackValue(3);\n\twhoOop = interpreterProxy.stackValue(4);\n\tmapOop = interpreterProxy.stackValue(5);\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(whoOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(mapOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(whoOop);\n\tif (SIZEOF(xOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(yOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(mapOop) !== (height * width)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\tyArray = yOop.wordsAsFloat32Array();\n\twhoArray = whoOop.words;\n\tmap = mapOop.words;\n\tfor (index = 0; index <= ((height * width) - 1); index++) {\n\t\tmap[index] = 0;\n\t}\n\tfor (index = 0; index <= (size - 1); index++) {\n\t\tx = xArray[index];\n\t\ty = yArray[index];\n\t\tmapIndex = (width * y) + x;\n\t\tif ((mapIndex >= 0) && (mapIndex < (height * width))) {\n\t\t\tmap[mapIndex] = whoArray[index];\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction primPixelAtXY() {\n\tvar bits;\n\tvar bitsOop;\n\tvar height;\n\tvar index;\n\tvar ret;\n\tvar width;\n\tvar x;\n\tvar xPos;\n\tvar y;\n\tvar yPos;\n\n\t/* inline: true */;\n\theight = interpreterProxy.stackIntegerValue(0);\n\twidth = interpreterProxy.stackIntegerValue(1);\n\tyPos = interpreterProxy.stackFloatValue(2);\n\txPos = interpreterProxy.stackFloatValue(3);\n\tbitsOop = interpreterProxy.stackValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(bitsOop) !== (height * width)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tx = xPos|0;\n\ty = yPos|0;\n\tbits = bitsOop.words;\n\tif ((((x >= 0) && (x < width)) && (y >= 0)) && (y < height)) {\n\t\tindex = (y * width) + x;\n\t\tret = bits[index];\n\t} else {\n\t\tret = 0;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n\tinterpreterProxy.pushInteger(ret);\n}\n\nfunction primPixelAtXYPut() {\n\tvar bits;\n\tvar bitsOop;\n\tvar height;\n\tvar index;\n\tvar v;\n\tvar value;\n\tvar width;\n\tvar x;\n\tvar xPos;\n\tvar y;\n\tvar yPos;\n\n\t/* inline: true */;\n\theight = interpreterProxy.stackIntegerValue(0);\n\twidth = interpreterProxy.stackIntegerValue(1);\n\tvalue = interpreterProxy.stackIntegerValue(2);\n\tyPos = interpreterProxy.stackFloatValue(3);\n\txPos = interpreterProxy.stackFloatValue(4);\n\tbitsOop = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(bitsOop) !== (height * width)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tx = xPos|0;\n\ty = yPos|0;\n\tv = value;\n\tif (v > 1073741823) {\n\t\tv = 1073741823;\n\t}\n\tif (v < 0) {\n\t\tv = 0;\n\t}\n\tbits = bitsOop.words;\n\tif ((((x >= 0) && (x < width)) && (y >= 0)) && (y < height)) {\n\t\tindex = (y * width) + x;\n\t\tbits[index] = v;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction primPixelsAtXY() {\n\tvar bits;\n\tvar bitsHeight;\n\tvar bitsIndex;\n\tvar bitsOop;\n\tvar bitsWidth;\n\tvar destWords;\n\tvar destWordsOop;\n\tvar i;\n\tvar size;\n\tvar x;\n\tvar xArray;\n\tvar xArrayOop;\n\tvar y;\n\tvar yArray;\n\tvar yArrayOop;\n\n\t/* inline: true */;\n\tdestWordsOop = interpreterProxy.stackValue(0);\n\tbitsHeight = interpreterProxy.stackIntegerValue(1);\n\tbitsWidth = interpreterProxy.stackIntegerValue(2);\n\tbitsOop = interpreterProxy.stackValue(3);\n\tyArrayOop = interpreterProxy.stackValue(4);\n\txArrayOop = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(destWordsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif ((bitsHeight * bitsWidth) !== SIZEOF(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xArrayOop);\n\tif (SIZEOF(yArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(destWordsOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xArrayOop.wordsAsFloat32Array();\n\tyArray = yArrayOop.wordsAsFloat32Array();\n\tdestWords = destWordsOop.words;\n\tbits = bitsOop.words;\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tx = (xArray[i]|0);\n\t\t;\n\t\ty = (yArray[i]|0);\n\t\t;\n\t\tif (((x >= 0) && (y >= 0)) && ((x < bitsWidth) && (y < bitsHeight))) {\n\t\t\tbitsIndex = (y * bitsWidth) + x;\n\t\t\tdestWords[i] = bits[bitsIndex];\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\nfunction primScalarForward() {\n\tvar bottomEdgeMode;\n\tvar destHeight;\n\tvar destWidth;\n\tvar dist;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar index;\n\tvar leftEdgeMode;\n\tvar newX;\n\tvar newY;\n\tvar rightEdgeMode;\n\tvar size;\n\tvar topEdgeMode;\n\tvar val;\n\tvar xArray;\n\tvar xOop;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\tbottomEdgeMode = interpreterProxy.stackIntegerValue(0);\n\ttopEdgeMode = interpreterProxy.stackIntegerValue(1);\n\trightEdgeMode = interpreterProxy.stackIntegerValue(2);\n\tleftEdgeMode = interpreterProxy.stackIntegerValue(3);\n\tdestHeight = interpreterProxy.stackFloatValue(4);\n\tdestWidth = interpreterProxy.stackFloatValue(5);\n\tval = interpreterProxy.stackFloatValue(6);\n\theadingOop = interpreterProxy.stackValue(7);\n\tyOop = interpreterProxy.stackValue(8);\n\txOop = interpreterProxy.stackValue(9);\n\tindex = interpreterProxy.stackIntegerValue(10);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(yOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\tyArray = yOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tdist = val;\n\ti = index - 1;\n\tnewX = xArray[i] + (dist * Math.cos(headingArray[i]));\n\tnewY = yArray[i] - (dist * Math.sin(headingArray[i]));\n\tscalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(i, xArray, headingArray, newX, destWidth, leftEdgeMode, rightEdgeMode);\n\tscalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(i, yArray, headingArray, newY, destHeight, topEdgeMode, bottomEdgeMode);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(11);\n}\n\nfunction primSetPixelsAtXY() {\n\tvar bits;\n\tvar bitsHeight;\n\tvar bitsIndex;\n\tvar bitsOop;\n\tvar bitsWidth;\n\tvar floatsValue;\n\tvar fv;\n\tvar i;\n\tvar intValue;\n\tvar isValueInt;\n\tvar isValueWordArray;\n\tvar pArray;\n\tvar pArrayOop;\n\tvar size;\n\tvar value;\n\tvar valueOop;\n\tvar wordsValue;\n\tvar x;\n\tvar xArray;\n\tvar xArrayOop;\n\tvar y;\n\tvar yArray;\n\tvar yArrayOop;\n\n\t/* inline: true */;\n\tvalueOop = interpreterProxy.stackValue(0);\n\tbitsHeight = interpreterProxy.stackIntegerValue(1);\n\tbitsWidth = interpreterProxy.stackIntegerValue(2);\n\tbitsOop = interpreterProxy.stackValue(3);\n\tyArrayOop = interpreterProxy.stackValue(4);\n\txArrayOop = interpreterProxy.stackValue(5);\n\tpArrayOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(pArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif ((bitsHeight * bitsWidth) !== SIZEOF(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xArrayOop);\n\tif (SIZEOF(pArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(yArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tpArray = pArrayOop.bytes;\n\txArray = xArrayOop.wordsAsFloat32Array();\n\tyArray = yArrayOop.wordsAsFloat32Array();\n\tisValueInt = typeof valueOop === \"number\";\n\tif (isValueInt) {\n\t\tintValue = valueOop;\n\t\tvalue = intValue;\n\t} else {\n\t\tif (SIZEOF(valueOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\tisValueWordArray = interpreterProxy.isMemberOf(valueOop, \"WordArray\");\n\t\tif (isValueWordArray) {\n\t\t\twordsValue = valueOop.words;\n\t\t} else {\n\t\t\tfloatsValue = valueOop.wordsAsFloat32Array();\n\t\t}\n\t}\n\tbits = bitsOop.words;\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (pArray[i] === 1) {\n\t\t\tx = (xArray[i]|0);\n\t\t\t;\n\t\t\ty = (yArray[i]|0);\n\t\t\t;\n\t\t\tif (((x >= 0) && (y >= 0)) && ((x < bitsWidth) && (y < bitsHeight))) {\n\t\t\t\tbitsIndex = (y * bitsWidth) + x;\n\t\t\t\tif (isValueInt) {\n\t\t\t\t\tbits[bitsIndex] = value;\n\t\t\t\t} else {\n\t\t\t\t\tif (isValueWordArray) {\n\t\t\t\t\t\tbits[bitsIndex] = wordsValue[i];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfv = floatsValue[i];\n\t\t\t\t\t\t;\n\t\t\t\t\t\tbits[bitsIndex] = fv;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction primTurtlesForward() {\n\tvar bottomEdgeMode;\n\tvar destHeight;\n\tvar destWidth;\n\tvar dist;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar isValVector;\n\tvar leftEdgeMode;\n\tvar newX;\n\tvar newY;\n\tvar pArray;\n\tvar pOop;\n\tvar rightEdgeMode;\n\tvar size;\n\tvar topEdgeMode;\n\tvar val;\n\tvar valArray;\n\tvar valOop;\n\tvar xArray;\n\tvar xOop;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\tbottomEdgeMode = interpreterProxy.stackIntegerValue(0);\n\ttopEdgeMode = interpreterProxy.stackIntegerValue(1);\n\trightEdgeMode = interpreterProxy.stackIntegerValue(2);\n\tleftEdgeMode = interpreterProxy.stackIntegerValue(3);\n\tdestHeight = interpreterProxy.stackFloatValue(4);\n\tdestWidth = interpreterProxy.stackFloatValue(5);\n\tvalOop = interpreterProxy.stackValue(6);\n\theadingOop = interpreterProxy.stackValue(7);\n\tyOop = interpreterProxy.stackValue(8);\n\txOop = interpreterProxy.stackValue(9);\n\tpOop = interpreterProxy.stackValue(10);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(pOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (valOop.isFloat) {\n\t\tisValVector = false;\n\t} else {\n\t\tif (interpreterProxy.isWords(valOop)) {\n\t\t\tisValVector = true;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(yOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(pOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (isValVector) {\n\t\tif (SIZEOF(valOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tpArray = pOop.bytes;\n\txArray = xOop.wordsAsFloat32Array();\n\tyArray = yOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tif (isValVector) {\n\t\tvalArray = valOop.wordsAsFloat32Array();\n\t} else {\n\t\tval = interpreterProxy.floatValueOf(valOop);\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (pArray[i] === 1) {\n\t\t\tif (isValVector) {\n\t\t\t\tdist = valArray[i];\n\t\t\t} else {\n\t\t\t\tdist = val;\n\t\t\t}\n\t\t\tnewX = xArray[i] + (dist * Math.cos(headingArray[i]));\n\t\t\tnewY = yArray[i] - (dist * Math.sin(headingArray[i]));\n\t\t\tscalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(i, xArray, headingArray, newX, destWidth, leftEdgeMode, rightEdgeMode);\n\t\t\tscalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(i, yArray, headingArray, newY, destHeight, topEdgeMode, bottomEdgeMode);\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(11);\n}\n\nfunction primUpHill() {\n\tvar bits;\n\tvar bitsOop;\n\tvar endX;\n\tvar endY;\n\tvar height;\n\tvar maxVal;\n\tvar maxValX;\n\tvar maxValY;\n\tvar ret;\n\tvar rowOffset;\n\tvar sniffRange;\n\tvar startX;\n\tvar startY;\n\tvar tH;\n\tvar tX;\n\tvar tY;\n\tvar thisVal;\n\tvar turtleX;\n\tvar turtleY;\n\tvar width;\n\tvar x;\n\tvar y;\n\n\t/* inline: true */;\n\tsniffRange = interpreterProxy.stackIntegerValue(0);\n\theight = interpreterProxy.stackIntegerValue(1);\n\twidth = interpreterProxy.stackIntegerValue(2);\n\tbitsOop = interpreterProxy.stackValue(3);\n\ttH = interpreterProxy.stackFloatValue(4);\n\ttY = interpreterProxy.stackFloatValue(5);\n\ttX = interpreterProxy.stackFloatValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(bitsOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(bitsOop) !== (height * width)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tbits = bitsOop.words;\n\tturtleX = tX;\n\tturtleY = tY;\n\tturtleX = Math.max(turtleX, 0);\n\tturtleY = Math.max(turtleY, 0);\n\tturtleX = Math.min(turtleX, (width - 1));\n\tturtleY = Math.min(turtleY, (height - 1));\n\tstartX = Math.max((turtleX - sniffRange), 0);\n\tendX = Math.min((turtleX + sniffRange), (width - 1));\n\tstartY = Math.max((turtleY - sniffRange), 0);\n\tendY = Math.min((turtleY + sniffRange), (height - 1));\n\tmaxVal = bits[(turtleY * width) + turtleX];\n\tmaxValX = -1;\n\tfor (y = startY; y <= endY; y++) {\n\t\trowOffset = y * width;\n\t\tfor (x = startX; x <= endX; x++) {\n\t\t\tthisVal = bits[rowOffset + x];\n\t\t\tif (thisVal > maxVal) {\n\t\t\t\tmaxValX = x;\n\t\t\t\tmaxValY = y;\n\t\t\t\tmaxVal = thisVal;\n\t\t\t}\n\t\t}\n\t}\n\tif (-1 === maxValX) {\n\t\tret = radiansToDegrees(tH);\n\t} else {\n\t\tret = degreesFromXy((maxValX - turtleX), (maxValY - turtleY)) + 90.0|0;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(8);\n\tinterpreterProxy.pushFloat(ret);\n}\n\nfunction primitiveAddArrays() {\n\tvar argOop;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] + wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] + floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] + wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] + floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveAddScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] + intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] + floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] + intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] + floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveAndByteArray() {\n\tvar i;\n\tvar length;\n\tvar length1;\n\tvar length2;\n\tvar otherArray;\n\tvar otherOop;\n\tvar rcvrArray;\n\tvar rcvrOop;\n\n\t/* inline: true */;\n\totherOop = interpreterProxy.stackObjectValue(0);\n\trcvrOop = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isBytes(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(otherOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength1 = SIZEOF(rcvrOop);\n\tlength2 = SIZEOF(otherOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = length1;\n\tif (length1 > length2) {\n\t\tlength = length2;\n\t}\n\totherArray = otherOop.bytes;\n\trcvrArray = rcvrOop.bytes;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrArray[i] = ((rcvrArray[i] + otherArray[i]) === 2);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitiveDivArrays() {\n\tvar argOop;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] / wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] / floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] / wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] / floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveDivScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (DIV(wordsRcvr[i], intArg));\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] / floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] / intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] / floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveEQArrays() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] === wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] === floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] === wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] === floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveEQScalar() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] === intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] === floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] === intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] === floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveGEArrays() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] >= wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] >= floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] >= wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] >= floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveGEScalar() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] >= intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] >= floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] >= intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] >= floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveGTArrays() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] > wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] > floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] > wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] > floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveGTScalar() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] > intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] > floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] > intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] > floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveLEArrays() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] <= wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] <= floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] <= wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] <= floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveLEScalar() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] <= intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] <= floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] <= intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] <= floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveLTArrays() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] < wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] < floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] < wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] < floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveLTScalar() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] < intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] < floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] < intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] < floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveMulArrays() {\n\tvar argOop;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] * wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] * floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] * wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] * floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveMulScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] * intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] * floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] * intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] * floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveNEArrays() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] !== wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] !== floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] !== wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] !== floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveNEScalar() {\n\tvar argOop;\n\tvar bytesResult;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] !== intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (wordsRcvr[i] !== floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] !== intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tbytesResult = resultOop.bytes;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tbytesResult[i] = (floatsRcvr[i] !== floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveNotByteArray() {\n\tvar i;\n\tvar length;\n\tvar rcvrArray;\n\tvar rcvrOop;\n\n\t/* inline: true */;\n\trcvrOop = interpreterProxy.stackValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isBytes(rcvrOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\trcvrArray = rcvrOop.bytes;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\tif (rcvrArray[i] === 0) {\n\t\t\trcvrArray[i] = 1;\n\t\t} else {\n\t\t\trcvrArray[i] = 0;\n\t\t}\n\t}\n}\n\nfunction primitiveOrByteArray() {\n\tvar i;\n\tvar length;\n\tvar length1;\n\tvar length2;\n\tvar otherArray;\n\tvar otherOop;\n\tvar rcvrArray;\n\tvar rcvrOop;\n\n\t/* inline: true */;\n\totherOop = interpreterProxy.stackObjectValue(0);\n\trcvrOop = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isBytes(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isBytes(otherOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength1 = SIZEOF(rcvrOop);\n\tlength2 = SIZEOF(otherOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = length1;\n\tif (length1 > length2) {\n\t\tlength = length2;\n\t}\n\totherArray = otherOop.bytes;\n\trcvrArray = rcvrOop.bytes;\n\tfor (i = 0; i <= (length - 1); i++) {\n\t\trcvrArray[i] = ((rcvrArray[i] + otherArray[i]) > 0);\n\t}\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitivePredicateAtAllPutBoolean() {\n\tvar i;\n\tvar predicates;\n\tvar predicatesOop;\n\tvar rcvrOop;\n\tvar val;\n\tvar valOop;\n\tvar values;\n\tvar valuesOop;\n\n\t/* inline: true */;\n\tvalOop = interpreterProxy.stackValue(0);\n\trcvrOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (interpreterProxy.isIntegerValue(valOop)) {\n\t\tval = valOop;\n\t} else {\n\t\tval = interpreterProxy.booleanValueOf(valOop);\n\t}\n\tvaluesOop = interpreterProxy.fetchPointerofObject(1, rcvrOop);\n\tpredicatesOop = interpreterProxy.fetchPointerofObject(0, rcvrOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(predicatesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(valuesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tvalues = valuesOop.bytes;\n\tpredicates = predicatesOop.bytes;\n\tfor (i = 0; i <= (SIZEOF(valuesOop) - 1); i++) {\n\t\tif (predicates[i] === 1) {\n\t\t\tvalues[i] = val;\n\t\t}\n\t}\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitivePredicateAtAllPutColor() {\n\tvar i;\n\tvar predicates;\n\tvar predicatesOop;\n\tvar rcvrOop;\n\tvar val;\n\tvar values;\n\tvar valuesOop;\n\n\t/* inline: true */;\n\tval = interpreterProxy.stackIntegerValue(0);\n\trcvrOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tval = val | 4278190080;\n\tvaluesOop = interpreterProxy.fetchPointerofObject(1, rcvrOop);\n\tpredicatesOop = interpreterProxy.fetchPointerofObject(0, rcvrOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(predicatesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(valuesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tvalues = valuesOop.words;\n\tpredicates = predicatesOop.bytes;\n\tfor (i = 0; i <= (SIZEOF(valuesOop) - 1); i++) {\n\t\tif (predicates[i] === 1) {\n\t\t\tvalues[i] = val;\n\t\t}\n\t}\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitivePredicateAtAllPutNumber() {\n\tvar i;\n\tvar predicates;\n\tvar predicatesOop;\n\tvar rcvrOop;\n\tvar val;\n\tvar values;\n\tvar valuesOop;\n\n\t/* inline: true */;\n\tval = interpreterProxy.stackFloatValue(0);\n\trcvrOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tvaluesOop = interpreterProxy.fetchPointerofObject(1, rcvrOop);\n\tpredicatesOop = interpreterProxy.fetchPointerofObject(0, rcvrOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(predicatesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(valuesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tvalues = valuesOop.wordsAsFloat32Array();\n\tpredicates = predicatesOop.bytes;\n\tfor (i = 0; i <= (SIZEOF(valuesOop) - 1); i++) {\n\t\tif (predicates[i] === 1) {\n\t\t\tvalues[i] = val;\n\t\t}\n\t}\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitivePredicateAtAllPutObject() {\n\tvar i;\n\tvar predicates;\n\tvar predicatesOop;\n\tvar rcvrOop;\n\tvar valOop;\n\tvar values;\n\tvar valuesOop;\n\n\t/* inline: true */;\n\tvalOop = interpreterProxy.stackValue(0);\n\trcvrOop = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tvaluesOop = interpreterProxy.fetchPointerofObject(1, rcvrOop);\n\tpredicatesOop = interpreterProxy.fetchPointerofObject(0, rcvrOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(predicatesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isPointers(valuesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tvalues = valuesOop.wordsAsInt32Array();\n\tpredicates = predicatesOop.bytes;\n\tfor (i = 0; i <= (SIZEOF(valuesOop) - 1); i++) {\n\t\tif (predicates[i] === 1) {\n\t\t\tvalues[i] = valOop;\n\t\t}\n\t}\n\tinterpreterProxy.pop(1);\n}\n\nfunction primitivePredicateReplaceBytes() {\n\tvar i;\n\tvar predicates;\n\tvar predicatesOop;\n\tvar predicatesSize;\n\tvar rcvrOop;\n\tvar repOop;\n\tvar repStart;\n\tvar replacement;\n\tvar replacementSize;\n\tvar start;\n\tvar stop;\n\tvar values;\n\tvar valuesOop;\n\tvar valuesSize;\n\n\t/* inline: true */;\n\trepStart = interpreterProxy.stackIntegerValue(0);\n\trepOop = interpreterProxy.stackObjectValue(1);\n\tstop = interpreterProxy.stackIntegerValue(2);\n\tstart = interpreterProxy.stackIntegerValue(3);\n\trcvrOop = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tvaluesOop = interpreterProxy.fetchPointerofObject(1, rcvrOop);\n\tpredicatesOop = interpreterProxy.fetchPointerofObject(0, rcvrOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(predicatesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!(interpreterProxy.isBytes(valuesOop) && (interpreterProxy.isBytes(repOop)))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tvalues = valuesOop.bytes;\n\tpredicates = predicatesOop.bytes;\n\treplacement = repOop.bytes;\n\tvaluesSize = SIZEOF(valuesOop);\n\tpredicatesSize = SIZEOF(predicatesOop);\n\treplacementSize = SIZEOF(repOop);\n\tif (start > stop) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (start < 1) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (start > valuesSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (start > predicatesSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (stop > valuesSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (stop > predicatesSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (repStart < 1) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (repStart > replacementSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (((replacementSize - repStart) + 1) < ((stop - start) + 1)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tfor (i = (start - 1); i <= (stop - 1); i++) {\n\t\tif (predicates[i] === 1) {\n\t\t\tvalues[i] = replacement[(repStart + i) - start];\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n}\n\nfunction primitivePredicateReplaceWords() {\n\tvar floatReplacement;\n\tvar floatValues;\n\tvar fv;\n\tvar i;\n\tvar predicates;\n\tvar predicatesOop;\n\tvar predicatesSize;\n\tvar rIsFloat;\n\tvar rcvrOop;\n\tvar repOop;\n\tvar repStart;\n\tvar replacement;\n\tvar replacementSize;\n\tvar start;\n\tvar stop;\n\tvar vIsFloat;\n\tvar values;\n\tvar valuesOop;\n\tvar valuesSize;\n\n\t/* inline: true */;\n\trepStart = interpreterProxy.stackIntegerValue(0);\n\trepOop = interpreterProxy.stackObjectValue(1);\n\tstop = interpreterProxy.stackIntegerValue(2);\n\tstart = interpreterProxy.stackIntegerValue(3);\n\trcvrOop = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tvaluesOop = interpreterProxy.fetchPointerofObject(1, rcvrOop);\n\tpredicatesOop = interpreterProxy.fetchPointerofObject(0, rcvrOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(predicatesOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!((interpreterProxy.isWords(valuesOop) && (interpreterProxy.isWords(repOop))) || (interpreterProxy.isPointers(valuesOop) && (interpreterProxy.isPointers(repOop))))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tpredicates = predicatesOop.bytes;\n\tvaluesSize = SIZEOF(valuesOop);\n\tpredicatesSize = SIZEOF(predicatesOop);\n\treplacementSize = SIZEOF(repOop);\n\tif (start > stop) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (start < 1) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (start > valuesSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (start > predicatesSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (stop > valuesSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (stop > predicatesSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (repStart < 1) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (repStart > replacementSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (((replacementSize - repStart) + 1) < ((stop - start) + 1)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tvIsFloat = interpreterProxy.isMemberOf(valuesOop, \"KedamaFloatArray\");\n\trIsFloat = interpreterProxy.isMemberOf(repOop, \"KedamaFloatArray\");\n\tif (vIsFloat && (rIsFloat)) {\n\t\tfloatValues = valuesOop.wordsAsFloat32Array();\n\t\tfloatReplacement = repOop.wordsAsFloat32Array();\n\t\tfor (i = (start - 1); i <= (stop - 1); i++) {\n\t\t\tif (predicates[i] === 1) {\n\t\t\t\tfloatValues[i] = floatReplacement[(repStart + i) - start];\n\t\t\t}\n\t\t}\n\t}\n\tif (vIsFloat && (!rIsFloat)) {\n\t\tfloatValues = valuesOop.wordsAsFloat32Array();\n\t\treplacement = repOop.words;\n\t\tfor (i = (start - 1); i <= (stop - 1); i++) {\n\t\t\tif (predicates[i] === 1) {\n\t\t\t\tfloatValues[i] = replacement[(repStart + i) - start];\n\t\t\t}\n\t\t}\n\t}\n\tif (!vIsFloat && (rIsFloat)) {\n\t\tvalues = valuesOop.words;\n\t\tfloatReplacement = repOop.wordsAsFloat32Array();\n\t\tfor (i = (start - 1); i <= (stop - 1); i++) {\n\t\t\tif (predicates[i] === 1) {\n\t\t\t\tfv = (floatReplacement[(repStart + i) - start]>>>0);\n\t\t\t\t;\n\t\t\t\tvalues[i] = fv;\n\t\t\t}\n\t\t}\n\t}\n\tif (!vIsFloat && (!rIsFloat)) {\n\t\tvalues = valuesOop.words;\n\t\treplacement = repOop.words;\n\t\tfor (i = (start - 1); i <= (stop - 1); i++) {\n\t\t\tif (predicates[i] === 1) {\n\t\t\t\tvalues[i] = replacement[(repStart + i) - start];\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n}\n\nfunction primitiveRemArrays() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatRcvr;\n\tvar floatResult;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordArg;\n\tvar wordRcvr;\n\tvar wordResult;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordRcvr = wordsRcvr[i];\n\t\t\t\twordArg = wordsArg[i];\n\n\t\t\t\t/* In this primitive, words are supposed to be unsigned. */\n\n\t\t\t\twordResult = MOD(wordRcvr, wordArg);\n\t\t\t\twordsResult[i] = wordResult;\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordRcvr = wordsRcvr[i];\n\t\t\t\tfloatArg = floatsArg[i];\n\t\t\t\tfloatResult = wordRcvr / floatArg;\n\t\t\t\tfloatResult = Math.floor(floatResult);\n\t\t\t\tfloatsResult[i] = (wordRcvr - (floatResult * floatArg));\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatRcvr = floatsRcvr[i];\n\t\t\t\twordArg = wordsArg[i];\n\t\t\t\tfloatResult = floatRcvr / wordArg;\n\t\t\t\tfloatResult = Math.floor(floatResult);\n\t\t\t\tfloatsResult[i] = (floatRcvr - (floatResult * wordArg));\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatRcvr = floatsRcvr[i];\n\t\t\t\tfloatArg = floatsArg[i];\n\t\t\t\tfloatResult = floatRcvr / floatArg;\n\t\t\t\tfloatResult = Math.floor(floatResult);\n\t\t\t\tfloatsResult[i] = (floatRcvr - (floatResult * floatArg));\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveRemScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatRcvr;\n\tvar floatResult;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordRcvr;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (MOD(wordsRcvr[i], intArg));\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordRcvr = wordsRcvr[i];\n\t\t\t\tfloatResult = wordRcvr / floatArg;\n\t\t\t\tfloatResult = Math.floor(floatResult);\n\t\t\t\tfloatsResult[i] = (wordRcvr - (floatResult * floatArg));\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatRcvr = floatsRcvr[i];\n\t\t\t\tfloatResult = floatRcvr / intArg;\n\t\t\t\tfloatResult = Math.floor(floatResult);\n\t\t\t\tfloatsResult[i] = (floatRcvr - (floatResult * intArg));\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatRcvr = floatsRcvr[i];\n\t\t\t\tfloatResult = floatRcvr / floatArg;\n\t\t\t\tfloatResult = Math.floor(floatResult);\n\t\t\t\tfloatsResult[i] = (floatRcvr - (floatResult * floatArg));\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveSubArrays() {\n\tvar argOop;\n\tvar floatsArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar isArgWords;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsArg;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackObjectValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(argOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(argOop);\n\tinterpreterProxy.success(length === SIZEOF(rcvrOop));\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgWords = interpreterProxy.isMemberOf(argOop, \"WordArray\");\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgWords && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgWords) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\twordsArg = argOop.words;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] - wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] - floatsArg[i]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgWords) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\twordsArg = argOop.words;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] - wordsArg[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatsArg = argOop.wordsAsFloat32Array();\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] - floatsArg[i]);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction primitiveSubScalar() {\n\tvar argOop;\n\tvar floatArg;\n\tvar floatsRcvr;\n\tvar floatsResult;\n\tvar i;\n\tvar intArg;\n\tvar isArgInt;\n\tvar isRcvrWords;\n\tvar length;\n\tvar rcvrOop;\n\tvar resultOop;\n\tvar wordsRcvr;\n\tvar wordsResult;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackObjectValue(0);\n\targOop = interpreterProxy.stackValue(1);\n\trcvrOop = interpreterProxy.stackObjectValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success(interpreterProxy.isWords(rcvrOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlength = SIZEOF(rcvrOop);\n\tinterpreterProxy.success(length === SIZEOF(resultOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisArgInt = typeof argOop === \"number\";\n\tisRcvrWords = interpreterProxy.isMemberOf(rcvrOop, \"WordArray\");\n\tif (isArgInt && isRcvrWords) {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"WordArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (!interpreterProxy.isMemberOf(resultOop, \"KedamaFloatArray\")) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (isRcvrWords) {\n\t\tif (isArgInt) {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tintArg = argOop;\n\t\t\twordsResult = resultOop.words;\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\twordsResult[i] = (wordsRcvr[i] - intArg);\n\t\t\t}\n\t\t} else {\n\t\t\twordsRcvr = rcvrOop.words;\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (wordsRcvr[i] - floatArg);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (isArgInt) {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tintArg = argOop;\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] - intArg);\n\t\t\t}\n\t\t} else {\n\t\t\tfloatsRcvr = rcvrOop.wordsAsFloat32Array();\n\t\t\tfloatArg = interpreterProxy.floatValueOf(argOop);\n\t\t\tfloatsResult = resultOop.wordsAsFloat32Array();\n\t\t\tfor (i = 0; i <= (length - 1); i++) {\n\t\t\t\tfloatsResult[i] = (floatsRcvr[i] - floatArg);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction radiansToDegrees(radians) {\n\tvar deg;\n\tvar degrees;\n\n\t/* inline: true */;\n\tdegrees = radians / 0.0174532925199433;\n\tdeg = 90.0 - degrees;\n\tif (!(deg > 0.0)) {\n\t\tdeg += 360.0;\n\t}\n\treturn deg;\n}\n\nfunction randomIntoFloatArray() {\n\tvar factor;\n\tvar floatArray;\n\tvar floatArrayOop;\n\tvar from;\n\tvar index;\n\tvar range;\n\tvar size;\n\tvar to;\n\n\t/* inline: true */;\n\tfactor = interpreterProxy.stackFloatValue(0);\n\tfloatArrayOop = interpreterProxy.stackValue(1);\n\tto = interpreterProxy.stackIntegerValue(2);\n\tfrom = interpreterProxy.stackIntegerValue(3);\n\trange = interpreterProxy.stackIntegerValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(floatArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(floatArrayOop);\n\tif (!((size >= to) && ((from >= 1) && (to >= from)))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tfloatArray = floatArrayOop.wordsAsFloat32Array();\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (index = from; index <= to; index++) {\n\t\tfloatArray[index - 1] = (kedamaRandom2(range) * factor);\n\t}\n\tinterpreterProxy.pop(5);\n}\n\nfunction randomIntoIntegerArray() {\n\tvar factor;\n\tvar from;\n\tvar index;\n\tvar integerArray;\n\tvar integerArrayOop;\n\tvar range;\n\tvar size;\n\tvar to;\n\n\t/* inline: true */;\n\tfactor = interpreterProxy.stackFloatValue(0);\n\tintegerArrayOop = interpreterProxy.stackValue(1);\n\tto = interpreterProxy.stackIntegerValue(2);\n\tfrom = interpreterProxy.stackIntegerValue(3);\n\trange = interpreterProxy.stackIntegerValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(integerArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(integerArrayOop);\n\tif (!((size >= to) && ((from >= 1) && (to >= from)))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tintegerArray = integerArrayOop.words;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (index = from; index <= to; index++) {\n\t\tintegerArray[index - 1] = ((kedamaRandom2(range) * factor)|0);\n\t}\n\tinterpreterProxy.pop(5);\n}\n\nfunction randomRange() {\n\tvar range;\n\tvar ret;\n\n\t/* inline: true */;\n\trange = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tret = kedamaRandom2(range);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(2);\n\tinterpreterProxy.pushInteger(ret);\n}\n\nfunction scalarGetAngleTo() {\n\tvar fromX;\n\tvar fromY;\n\tvar r;\n\tvar toX;\n\tvar toY;\n\tvar x;\n\tvar y;\n\n\t/* inline: true */;\n\tfromY = interpreterProxy.stackFloatValue(0);\n\tfromX = interpreterProxy.stackFloatValue(1);\n\ttoY = interpreterProxy.stackFloatValue(2);\n\ttoX = interpreterProxy.stackFloatValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tx = toX - fromX;\n\ty = toY - fromY;\n\tr = degreesFromXy(x, y);\n\tr += 90.0;\n\tif (r > 360.0) {\n\t\tr -= 360.0;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(5);\n\tinterpreterProxy.pushFloat(r);\n}\n\nfunction scalarGetDistanceTo() {\n\tvar fromX;\n\tvar fromY;\n\tvar r;\n\tvar toX;\n\tvar toY;\n\tvar x;\n\tvar y;\n\n\t/* inline: true */;\n\tfromY = interpreterProxy.stackFloatValue(0);\n\tfromX = interpreterProxy.stackFloatValue(1);\n\ttoY = interpreterProxy.stackFloatValue(2);\n\ttoX = interpreterProxy.stackFloatValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tx = fromX - toX;\n\ty = fromY - toY;\n\tr = Math.sqrt((x * x) + (y * y));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(5);\n\tinterpreterProxy.pushFloat(r);\n}\n\nfunction scalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(index, xArray, headingArray, val, destWidth, leftEdgeMode, rightEdgeMode) {\n\tvar headingRadians;\n\tvar newX;\n\n\t/* inline: true */;\n\tnewX = val;\n\tif (newX < 0.0) {\n\t\tif (leftEdgeMode === 1) {\n\n\t\t\t/* wrap */\n\n\t\t\tnewX += destWidth;\n\t\t}\n\t\tif (leftEdgeMode === 2) {\n\n\t\t\t/* stick */\n\n\t\t\tnewX = 0.0;\n\t\t}\n\t\tif (leftEdgeMode === 3) {\n\n\t\t\t/* bounce */\n\n\t\t\tnewX = 0.0 - newX;\n\t\t\theadingRadians = headingArray[index];\n\t\t\tif (headingRadians < 3.141592653589793) {\n\t\t\t\theadingArray[index] = (3.141592653589793 - headingRadians);\n\t\t\t} else {\n\t\t\t\theadingArray[index] = (9.42477796076938 - headingRadians);\n\t\t\t}\n\t\t}\n\t}\n\tif (newX >= destWidth) {\n\t\tif (rightEdgeMode === 1) {\n\t\t\tnewX -= destWidth;\n\t\t}\n\t\tif (rightEdgeMode === 2) {\n\t\t\tnewX = destWidth - 1.0e-6;\n\t\t}\n\t\tif (rightEdgeMode === 3) {\n\t\t\tnewX = (destWidth - 1.0e-6) - (newX - destWidth);\n\t\t\theadingRadians = headingArray[index];\n\t\t\tif (headingRadians < 3.141592653589793) {\n\t\t\t\theadingArray[index] = (3.141592653589793 - headingRadians);\n\t\t\t} else {\n\t\t\t\theadingArray[index] = (9.42477796076938 - headingRadians);\n\t\t\t}\n\t\t}\n\t}\n\txArray[index] = newX;\n}\n\nfunction scalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(index, yArray, headingArray, val, destHeight, topEdgeMode, bottomEdgeMode) {\n\tvar newY;\n\n\t/* inline: true */;\n\tnewY = val;\n\tif (newY < 0.0) {\n\t\tif (topEdgeMode === 1) {\n\n\t\t\t/* wrap */\n\n\t\t\tnewY += destHeight;\n\t\t}\n\t\tif (topEdgeMode === 2) {\n\n\t\t\t/* stick */\n\n\t\t\tnewY = 0.0;\n\t\t}\n\t\tif (topEdgeMode === 3) {\n\n\t\t\t/* bounce */\n\n\t\t\tnewY = 0.0 - newY;\n\t\t\theadingArray[index] = (6.283185307179586 - headingArray[index]);\n\t\t}\n\t}\n\tif (newY >= destHeight) {\n\t\tif (bottomEdgeMode === 1) {\n\t\t\tnewY -= destHeight;\n\t\t}\n\t\tif (bottomEdgeMode === 2) {\n\t\t\tnewY = destHeight - 1.0e-6;\n\t\t}\n\t\tif (bottomEdgeMode === 3) {\n\t\t\tnewY = (destHeight - 1.0e-6) - (newY - destHeight);\n\t\t\theadingArray[index] = (6.283185307179586 - headingArray[index]);\n\t\t}\n\t}\n\tyArray[index] = newY;\n}\n\nfunction setHeadingArrayFrom() {\n\tvar heading;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar isValVector;\n\tvar pArray;\n\tvar pOop;\n\tvar resultArray;\n\tvar resultOop;\n\tvar size;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackValue(0);\n\theadingOop = interpreterProxy.stackValue(1);\n\tpOop = interpreterProxy.stackValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(pOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(headingOop);\n\tif (resultOop.isFloat) {\n\t\tisValVector = false;\n\t} else {\n\t\tif (interpreterProxy.isWords(resultOop)) {\n\t\t\tif (SIZEOF(resultOop) !== size) {\n\t\t\t\tinterpreterProxy.primitiveFail();\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tisValVector = true;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tpArray = pOop.bytes;\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tif (isValVector) {\n\t\tresultArray = resultOop.wordsAsFloat32Array();\n\t} else {\n\t\theading = interpreterProxy.floatValueOf(resultOop);\n\t\theading = degreesToRadians(heading);\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (pArray[i] === 1) {\n\t\t\tif (isValVector) {\n\t\t\t\theading = resultArray[i];\n\t\t\t\theading = degreesToRadians(heading);\n\t\t\t}\n\t\t\theadingArray[i] = heading;\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(3);\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\nfunction setScalarHeading() {\n\tvar heading;\n\tvar headingArray;\n\tvar headingOop;\n\tvar index;\n\n\t/* inline: true */;\n\theading = interpreterProxy.stackFloatValue(0);\n\theadingOop = interpreterProxy.stackValue(1);\n\tindex = interpreterProxy.stackIntegerValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) < index) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\theadingArray = headingOop.wordsAsFloat32Array();\n\theadingArray[index - 1] = degreesToRadians(heading);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(3);\n}\n\nfunction shutdownModule() {\n\treturn true;\n}\n\nfunction turtleScalarSetX() {\n\tvar destWidth;\n\tvar headingArray;\n\tvar headingOop;\n\tvar leftEdgeMode;\n\tvar rightEdgeMode;\n\tvar size;\n\tvar val;\n\tvar xArray;\n\tvar xIndex;\n\tvar xOop;\n\n\t/* inline: true */;\n\trightEdgeMode = interpreterProxy.stackIntegerValue(0);\n\tleftEdgeMode = interpreterProxy.stackIntegerValue(1);\n\tdestWidth = interpreterProxy.stackFloatValue(2);\n\tval = interpreterProxy.stackFloatValue(3);\n\theadingOop = interpreterProxy.stackValue(4);\n\txIndex = interpreterProxy.stackIntegerValue(5);\n\txOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\txArray = xOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tscalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(xIndex - 1, xArray, headingArray, val, destWidth, leftEdgeMode, rightEdgeMode);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction turtleScalarSetY() {\n\tvar bottomEdgeMode;\n\tvar destHeight;\n\tvar headingArray;\n\tvar headingOop;\n\tvar size;\n\tvar topEdgeMode;\n\tvar val;\n\tvar yArray;\n\tvar yIndex;\n\tvar yOop;\n\n\t/* inline: true */;\n\tbottomEdgeMode = interpreterProxy.stackIntegerValue(0);\n\ttopEdgeMode = interpreterProxy.stackIntegerValue(1);\n\tdestHeight = interpreterProxy.stackFloatValue(2);\n\tval = interpreterProxy.stackFloatValue(3);\n\theadingOop = interpreterProxy.stackValue(4);\n\tyIndex = interpreterProxy.stackIntegerValue(5);\n\tyOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(yOop);\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tyArray = yOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tscalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(yIndex - 1, yArray, headingArray, val, destHeight, topEdgeMode, bottomEdgeMode);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction turtlesSetX() {\n\tvar destWidth;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar isValVector;\n\tvar isWordVector;\n\tvar leftEdgeMode;\n\tvar newX;\n\tvar pArray;\n\tvar pOop;\n\tvar rightEdgeMode;\n\tvar size;\n\tvar val;\n\tvar valArray;\n\tvar valOop;\n\tvar wordValArray;\n\tvar xArray;\n\tvar xOop;\n\n\t/* inline: true */;\n\trightEdgeMode = interpreterProxy.stackIntegerValue(0);\n\tleftEdgeMode = interpreterProxy.stackIntegerValue(1);\n\tdestWidth = interpreterProxy.stackFloatValue(2);\n\tvalOop = interpreterProxy.stackValue(3);\n\theadingOop = interpreterProxy.stackValue(4);\n\txOop = interpreterProxy.stackValue(5);\n\tpOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(pOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (valOop.isFloat) {\n\t\tisValVector = false;\n\t} else {\n\t\tif (interpreterProxy.isWords(valOop)) {\n\t\t\tisValVector = true;\n\t\t\tisWordVector = interpreterProxy.isMemberOf(valOop, \"WordArray\");\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tsize = SIZEOF(xOop);\n\tif (SIZEOF(pOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (isValVector) {\n\t\tif (SIZEOF(valOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tpArray = pOop.bytes;\n\txArray = xOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tif (isValVector) {\n\t\tif (isWordVector) {\n\t\t\twordValArray = valOop.words;\n\t\t} else {\n\t\t\tvalArray = valOop.wordsAsFloat32Array();\n\t\t}\n\t} else {\n\t\tval = interpreterProxy.floatValueOf(valOop);\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (pArray[i] === 1) {\n\t\t\tif (isValVector) {\n\t\t\t\tif (isWordVector) {\n\t\t\t\t\tnewX = wordValArray[i];\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tnewX = valArray[i];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewX = val;\n\t\t\t}\n\t\t\tscalarXAtxArrayheadingArrayvaluedestWidthleftEdgeModerightEdgeMode(i, xArray, headingArray, newX, destWidth, leftEdgeMode, rightEdgeMode);\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction turtlesSetY() {\n\tvar bottomEdgeMode;\n\tvar destHeight;\n\tvar headingArray;\n\tvar headingOop;\n\tvar i;\n\tvar isValVector;\n\tvar isWordVector;\n\tvar newY;\n\tvar pArray;\n\tvar pOop;\n\tvar size;\n\tvar topEdgeMode;\n\tvar val;\n\tvar valArray;\n\tvar valOop;\n\tvar wordValArray;\n\tvar yArray;\n\tvar yOop;\n\n\t/* inline: true */;\n\tbottomEdgeMode = interpreterProxy.stackIntegerValue(0);\n\ttopEdgeMode = interpreterProxy.stackIntegerValue(1);\n\tdestHeight = interpreterProxy.stackFloatValue(2);\n\tvalOop = interpreterProxy.stackValue(3);\n\theadingOop = interpreterProxy.stackValue(4);\n\tyOop = interpreterProxy.stackValue(5);\n\tpOop = interpreterProxy.stackValue(6);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isBytes(pOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(headingOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (valOop.isFloat) {\n\t\tisValVector = false;\n\t} else {\n\t\tif (interpreterProxy.isWords(valOop)) {\n\t\t\tisValVector = true;\n\t\t\tisWordVector = interpreterProxy.isMemberOf(valOop, \"WordArray\");\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tsize = SIZEOF(yOop);\n\tif (SIZEOF(pOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(headingOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (isValVector) {\n\t\tif (SIZEOF(valOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tpArray = pOop.bytes;\n\tyArray = yOop.wordsAsFloat32Array();\n\theadingArray = headingOop.wordsAsFloat32Array();\n\tif (isValVector) {\n\t\tif (isWordVector) {\n\t\t\twordValArray = valOop.words;\n\t\t} else {\n\t\t\tvalArray = valOop.wordsAsFloat32Array();\n\t\t}\n\t} else {\n\t\tval = interpreterProxy.floatValueOf(valOop);\n\t}\n\tfor (i = 0; i <= (size - 1); i++) {\n\t\tif (pArray[i] === 1) {\n\t\t\tif (isValVector) {\n\t\t\t\tif (isWordVector) {\n\t\t\t\t\tnewY = wordValArray[i];\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tnewY = valArray[i];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewY = val;\n\t\t\t}\n\t\t\tscalarYAtyArrayheadingArrayvaluedestHeighttopEdgeModebottomEdgeMode(i, yArray, headingArray, newY, destHeight, topEdgeMode, bottomEdgeMode);\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(7);\n}\n\nfunction vectorGetAngleTo() {\n\tvar index;\n\tvar isVector;\n\tvar pX;\n\tvar pXOop;\n\tvar pY;\n\tvar pYOop;\n\tvar ppx;\n\tvar ppy;\n\tvar r;\n\tvar result;\n\tvar resultOop;\n\tvar size;\n\tvar x;\n\tvar xArray;\n\tvar xArrayOop;\n\tvar y;\n\tvar yArray;\n\tvar yArrayOop;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackValue(0);\n\tyArrayOop = interpreterProxy.stackValue(1);\n\txArrayOop = interpreterProxy.stackValue(2);\n\tpYOop = interpreterProxy.stackValue(3);\n\tpXOop = interpreterProxy.stackValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(resultOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(resultOop);\n\tif (size < 0) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(xArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(yArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (pXOop.isFloat) {\n\t\tif (pYOop.isFloat) {\n\t\t\tisVector = false;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (pYOop.isFloat) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t} else {\n\t\t\tisVector = true;\n\t\t}\n\t}\n\tif (isVector) {\n\t\tif (SIZEOF(pXOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\tif (SIZEOF(pYOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tresult = resultOop.wordsAsFloat32Array();\n\txArray = xArrayOop.wordsAsFloat32Array();\n\tyArray = yArrayOop.wordsAsFloat32Array();\n\tif (isVector) {\n\t\tpX = pXOop.wordsAsFloat32Array();\n\t\tpY = pYOop.wordsAsFloat32Array();\n\t}\n\tif (!isVector) {\n\t\tppx = interpreterProxy.floatValueOf(pXOop);\n\t\tppy = interpreterProxy.floatValueOf(pYOop);\n\t}\n\tfor (index = 0; index <= (size - 1); index++) {\n\t\tif (isVector) {\n\t\t\tppx = pX[index];\n\t\t\tppy = pY[index];\n\t\t}\n\t\tx = ppx - xArray[index];\n\t\ty = ppy - yArray[index];\n\t\tr = degreesFromXy(x, y);\n\t\tr += 90.0;\n\t\tif (r > 360.0) {\n\t\t\tr -= 360.0;\n\t\t}\n\t\tresult[index] = r;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction vectorGetDistanceTo() {\n\tvar index;\n\tvar isVector;\n\tvar pX;\n\tvar pXOop;\n\tvar pY;\n\tvar pYOop;\n\tvar ppx;\n\tvar ppy;\n\tvar result;\n\tvar resultOop;\n\tvar size;\n\tvar x;\n\tvar xArray;\n\tvar xArrayOop;\n\tvar y;\n\tvar yArray;\n\tvar yArrayOop;\n\n\t/* inline: true */;\n\tresultOop = interpreterProxy.stackValue(0);\n\tyArrayOop = interpreterProxy.stackValue(1);\n\txArrayOop = interpreterProxy.stackValue(2);\n\tpYOop = interpreterProxy.stackValue(3);\n\tpXOop = interpreterProxy.stackValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(resultOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(xArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(yArrayOop)) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsize = SIZEOF(resultOop);\n\tif (size < 0) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(xArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (SIZEOF(yArrayOop) !== size) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (pXOop.isFloat) {\n\t\tif (pYOop.isFloat) {\n\t\t\tisVector = false;\n\t\t} else {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\tif (pYOop.isFloat) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t} else {\n\t\t\tisVector = true;\n\t\t}\n\t}\n\tif (isVector) {\n\t\tif (SIZEOF(pXOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\tif (SIZEOF(pYOop) !== size) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t}\n\tresult = resultOop.wordsAsFloat32Array();\n\txArray = xArrayOop.wordsAsFloat32Array();\n\tyArray = yArrayOop.wordsAsFloat32Array();\n\tif (isVector) {\n\t\tpX = pXOop.wordsAsFloat32Array();\n\t\tpY = pYOop.wordsAsFloat32Array();\n\t}\n\tif (!isVector) {\n\t\tppx = interpreterProxy.floatValueOf(pXOop);\n\t\tppy = interpreterProxy.floatValueOf(pYOop);\n\t}\n\tfor (index = 0; index <= (size - 1); index++) {\n\t\tif (isVector) {\n\t\t\tppx = pX[index];\n\t\t\tppy = pY[index];\n\t\t}\n\t\tx = ppx - xArray[index];\n\t\ty = ppy - yArray[index];\n\t\tresult[index] = Math.sqrt((x * x) + (y * y));\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(6);\n\tinterpreterProxy.push(resultOop);\n}\n\nfunction zoomBitmap() {\n\tvar bit;\n\tvar dOrigin;\n\tvar dst;\n\tvar dstIndex;\n\tvar dstSize;\n\tvar dummy;\n\tvar sHeight;\n\tvar sOrigin;\n\tvar sWidth;\n\tvar src;\n\tvar srcIndex;\n\tvar srcOrigin;\n\tvar srcSize;\n\tvar sx;\n\tvar sy;\n\tvar xFactor;\n\tvar y;\n\tvar yFactor;\n\n\t/* inline: true */;\n\tyFactor = interpreterProxy.stackIntegerValue(0);\n\txFactor = interpreterProxy.stackIntegerValue(1);\n\tsHeight = interpreterProxy.stackIntegerValue(2);\n\tsWidth = interpreterProxy.stackIntegerValue(3);\n\tdst = interpreterProxy.stackValue(4);\n\tsrc = interpreterProxy.stackValue(5);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tsrcSize = SIZEOF(src);\n\tdstSize = SIZEOF(dst);\n\tif ((sWidth * sHeight) !== srcSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (((srcSize * xFactor) * yFactor) !== dstSize) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tsOrigin = src.words;\n\tdOrigin = dst.words;\n\tsrcIndex = 0;\n\tsrcOrigin = 0;\n\tdstIndex = 0;\n\tfor (sy = 0; sy <= (sHeight - 1); sy++) {\n\t\tfor (y = 0; y <= (yFactor - 1); y++) {\n\t\t\tfor (sx = 0; sx <= (sWidth - 1); sx++) {\n\t\t\t\tbit = sOrigin[srcIndex];\n\t\t\t\t++srcIndex;\n\t\t\t\tfor (dummy = 0; dummy <= (xFactor - 1); dummy++) {\n\t\t\t\t\tdOrigin[dstIndex] = bit;\n\t\t\t\t\t++dstIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsrcIndex = srcOrigin;\n\t\t}\n\t\tsrcOrigin += sWidth;\n\t\tsrcIndex = srcOrigin;\n\t}\n\tinterpreterProxy.pop(6);\n}\n\n\nSqueak.registerExternalModule(\"KedamaPlugin2\", {\n\tprimitiveAddArrays: primitiveAddArrays,\n\tgetModuleName: getModuleName,\n\tprimitiveMulArrays: primitiveMulArrays,\n\tdrawTurtlesInArray: drawTurtlesInArray,\n\tprimitiveGTScalar: primitiveGTScalar,\n\tsetScalarHeading: setScalarHeading,\n\tprimitiveSubScalar: primitiveSubScalar,\n\tturtleScalarSetY: turtleScalarSetY,\n\tvectorGetAngleTo: vectorGetAngleTo,\n\tprimitiveRemArrays: primitiveRemArrays,\n\tprimitiveLTArrays: primitiveLTArrays,\n\tprimitiveAddScalar: primitiveAddScalar,\n\tprimPixelsAtXY: primPixelsAtXY,\n\tprimitiveMulScalar: primitiveMulScalar,\n\tprimSetPixelsAtXY: primSetPixelsAtXY,\n\tsetHeadingArrayFrom: setHeadingArrayFrom,\n\tprimPixelAtXYPut: primPixelAtXYPut,\n\tmakeMaskLog: makeMaskLog,\n\tprimitiveLTScalar: primitiveLTScalar,\n\tscalarGetAngleTo: scalarGetAngleTo,\n\tprimitiveOrByteArray: primitiveOrByteArray,\n\tprimitiveLEArrays: primitiveLEArrays,\n\tprimitiveRemScalar: primitiveRemScalar,\n\tgetHeadingArrayInto: getHeadingArrayInto,\n\tturtlesSetX: turtlesSetX,\n\tprimitivePredicateReplaceBytes: primitivePredicateReplaceBytes,\n\tprimitiveDivArrays: primitiveDivArrays,\n\tmakeMask: makeMask,\n\tprimitiveLEScalar: primitiveLEScalar,\n\tkedamaSetRandomSeed: kedamaSetRandomSeed,\n\trandomIntoIntegerArray: randomIntoIntegerArray,\n\tsetInterpreter: setInterpreter,\n\tprimitivePredicateAtAllPutColor: primitivePredicateAtAllPutColor,\n\tmakeTurtlesMap: makeTurtlesMap,\n\trandomIntoFloatArray: randomIntoFloatArray,\n\tprimUpHill: primUpHill,\n\tshutdownModule: shutdownModule,\n\tprimitiveDivScalar: primitiveDivScalar,\n\tprimitiveGEArrays: primitiveGEArrays,\n\tprimitiveNotByteArray: primitiveNotByteArray,\n\trandomRange: randomRange,\n\tinitialiseModule: initialiseModule,\n\tgetScalarHeading: getScalarHeading,\n\tprimPixelAtXY: primPixelAtXY,\n\tprimitivePredicateAtAllPutNumber: primitivePredicateAtAllPutNumber,\n\tprimitiveEQArrays: primitiveEQArrays,\n\tprimitiveNEArrays: primitiveNEArrays,\n\tprimScalarForward: primScalarForward,\n\tvectorGetDistanceTo: vectorGetDistanceTo,\n\tturtlesSetY: turtlesSetY,\n\tturtleScalarSetX: turtleScalarSetX,\n\tprimTurtlesForward: primTurtlesForward,\n\tprimitiveGEScalar: primitiveGEScalar,\n\tprimitiveAndByteArray: primitiveAndByteArray,\n\tprimitivePredicateReplaceWords: primitivePredicateReplaceWords,\n\tprimitiveGTArrays: primitiveGTArrays,\n\tprimitivePredicateAtAllPutObject: primitivePredicateAtAllPutObject,\n\tprimitiveEQScalar: primitiveEQScalar,\n\tprimitivePredicateAtAllPutBoolean: primitivePredicateAtAllPutBoolean,\n\tzoomBitmap: zoomBitmap,\n\tprimitiveNEScalar: primitiveNEScalar,\n\tscalarGetDistanceTo: scalarGetDistanceTo,\n\tprimitiveSubArrays: primitiveSubArrays,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:21 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tKlattSynthesizerPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.Klatt\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Constants ***/\nvar A1v = 46;\nvar A2f = 34;\nvar A2v = 47;\nvar A3f = 35;\nvar A3v = 48;\nvar A4f = 36;\nvar A4v = 49;\nvar A5f = 37;\nvar A6f = 38;\nvar Anv = 45;\nvar Aspiration = 9;\nvar Atv = 50;\nvar B1 = 13;\nvar B2 = 17;\nvar B2f = 40;\nvar B3 = 19;\nvar B3f = 41;\nvar B4 = 21;\nvar B4f = 42;\nvar B5 = 23;\nvar B5f = 43;\nvar B6 = 25;\nvar B6f = 44;\nvar Bnp = 27;\nvar Bnz = 29;\nvar Btp = 31;\nvar Btz = 33;\nvar Bypass = 39;\nvar Diplophonia = 4;\nvar Epsilon = 0.0001;\nvar F0 = 0;\nvar F1 = 12;\nvar F2 = 16;\nvar F3 = 18;\nvar F4 = 20;\nvar F5 = 22;\nvar F6 = 24;\nvar Flutter = 1;\nvar Fnp = 26;\nvar Fnz = 28;\nvar Friction = 10;\nvar Ftp = 30;\nvar Ftz = 32;\nvar Gain = 51;\nvar Jitter = 2;\nvar PI = 3.141592653589793;\nvar R1c = 12;\nvar R1vp = 3;\nvar R2c = 13;\nvar R2fp = 7;\nvar R2vp = 4;\nvar R3c = 14;\nvar R3fp = 8;\nvar R3vp = 5;\nvar R4c = 15;\nvar R4fp = 9;\nvar R4vp = 6;\nvar R5c = 16;\nvar R5fp = 10;\nvar R6c = 17;\nvar R6fp = 11;\nvar R7c = 18;\nvar R8c = 19;\nvar Ra = 7;\nvar Rk = 8;\nvar Rnpc = 20;\nvar Rnpp = 1;\nvar Rnz = 21;\nvar Ro = 6;\nvar Rout = 24;\nvar Rtpc = 22;\nvar Rtpp = 2;\nvar Rtz = 23;\nvar Shimmer = 3;\nvar Turbulence = 11;\nvar Voicing = 5;\n\n/*** Variables ***/\nvar a1 = 0;\nvar a2 = 0;\nvar b1 = 0;\nvar c1 = 0;\nvar cascade = 0;\nvar frame = null;\nvar glast = 0;\nvar interpreterProxy = null;\nvar moduleName = \"Klatt 3 November 2014 (e)\";\nvar nlast = 0;\nvar nmod = 0;\nvar nopen = 0;\nvar nper = 0;\nvar periodCount = 0;\nvar pitch = 0;\nvar resonators = null;\nvar samplesCount = 0;\nvar samplesPerFrame = 0;\nvar samplingRate = 0;\nvar seed = 0;\nvar t0 = 0;\nvar vlast = 0;\nvar x1 = 0;\nvar x2 = 0;\n\n\n\n/*\tAdd diplophonia (bicyclic voice). Change voicing amplitude. */\n\nfunction addAmplitudeDiplophonia() {\n\tif ((MOD(periodCount, 2)) !== 0) {\n\n\t\t/* x1 must be <= 0 */\n\n\t\tx1 = x1 * (1.0 - frame[Diplophonia]);\n\t\tif (x1 > 0) {\n\t\t\tx1 = 0;\n\t\t}\n\t}\n}\n\n\n/*\tAdd F0 flutter, as specified in:\n\t\t'Analysis, synthesis and perception of voice quality variations among\n\t\tfemale and male talkers' D.H. Klatt and L.C. Klatt JASA 87(2) February 1990.\n\tFlutter is added by applying a quasi-random element constructed from three\n\tslowly varying sine waves. */\n\nfunction addFlutter() {\n\tvar asin;\n\tvar bsin;\n\tvar csin;\n\tvar deltaF0;\n\tvar timeCount;\n\n\ttimeCount = samplesCount / samplingRate;\n\tasin = Math.sin(((2.0 * PI) * 12.7) * timeCount);\n\tbsin = Math.sin(((2.0 * PI) * 7.1) * timeCount);\n\tcsin = Math.sin(((2.0 * PI) * 4.7) * timeCount);\n\tdeltaF0 = (((frame[Flutter] * 2.0) * frame[F0]) / 100.0) * ((asin + bsin) + csin);\n\tpitch += deltaF0;\n}\n\n\n/*\tAdd diplophonia (bicyclic voice). Change F0. */\n\nfunction addFrequencyDiplophonia() {\n\tif ((MOD(periodCount, 2)) === 0) {\n\t\tpitch += (frame[Diplophonia] * frame[F0]) * (1.0 - frame[Ro]);\n\t} else {\n\t\tpitch -= (frame[Diplophonia] * frame[F0]) * (1.0 - frame[Ro]);\n\t}\n}\n\n\n/*\tAdd jitter (random F0 perturbation). */\n\nfunction addJitter() {\n\tpitch += (((nextRandom() - 32767) * frame[Jitter]) / 32768.0) * frame[F0];\n}\n\n\n/*\tAdd shimmer (random voicing amplitude perturbation). */\n\nfunction addShimmer() {\n\n\t/* x1 must be <= 0 */\n\n\tx1 += (((nextRandom() - 32767) * frame[Shimmer]) / 32768.0) * x1;\n\tif (x1 > 0) {\n\t\tx1 = 0;\n\t}\n}\n\n\n/*\tSet up an anti-resonator */\n\nfunction antiResonatorfrequencybandwidth(index, freq, bw) {\n\tvar a;\n\tvar arg;\n\tvar b;\n\tvar c;\n\tvar r;\n\n\targ = ((0.0 - PI) / samplingRate) * bw;\n\tr = Math.exp(arg);\n\tc = 0.0 - (r * r);\n\targ = ((PI * 2.0) / samplingRate) * freq;\n\tb = (r * Math.cos(arg)) * 2.0;\n\ta = (1.0 - b) - c;\n\ta = 1.0 / a;\n\tb = (0.0 - b) * a;\n\tc = (0.0 - c) * a;\n\tresonatorAput(index, a);\n\tresonatorBput(index, b);\n\tresonatorCput(index, c);\n}\n\nfunction antiResonatorvalue(index, aFloat) {\n\tvar answer;\n\tvar p1;\n\n\tanswer = ((resonatorA(index) * aFloat) + (resonatorB(index) * ((p1 = resonatorP1(index))))) + (resonatorC(index) * resonatorP2(index));\n\tresonatorP2put(index, p1);\n\tresonatorP1put(index, aFloat);\n\treturn answer;\n}\n\n\n/*\tCascade vocal tract, excited by laryngeal sources.\n\tNasal antiresonator, nasal resonator, tracheal antirresonator,\n\ttracheal resonator, then formants F8, F7, F6, F5, F4, F3, F2, F1. */\n\nfunction cascadeBranch(source) {\n\tvar out;\n\n\tif (!(cascade > 0)) {\n\t\treturn 0.0;\n\t}\n\tout = antiResonatorvalue(Rnz, source);\n\tout = resonatorvalue(Rnpc, out);\n\tout = antiResonatorvalue(Rtz, out);\n\n\t/* Do not use unless sample rate >= 16000 */\n\n\tout = resonatorvalue(Rtpc, out);\n\tif (cascade >= 8) {\n\t\tout = resonatorvalue(R8c, out);\n\t}\n\tif (cascade >= 7) {\n\t\tout = resonatorvalue(R7c, out);\n\t}\n\tif (cascade >= 6) {\n\t\tout = resonatorvalue(R6c, out);\n\t}\n\tif (cascade >= 5) {\n\t\tout = resonatorvalue(R5c, out);\n\t}\n\tif (cascade >= 4) {\n\t\tout = resonatorvalue(R4c, out);\n\t}\n\tif (cascade >= 3) {\n\t\tout = resonatorvalue(R3c, out);\n\t}\n\tif (cascade >= 2) {\n\t\tout = resonatorvalue(R2c, out);\n\t}\n\tif (cascade >= 1) {\n\t\tout = resonatorvalue(R1c, out);\n\t}\n\treturn out;\n}\n\n\n/*\tReturn the first indexable word of oop which is assumed to be variableWordSubclass */\n\nfunction checkedFloatPtrOf(oop) {\n\tinterpreterProxy.success(interpreterProxy.isWords(oop));\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\treturn oop.wordsAsFloat32Array();\n}\n\n\n/*\tReturn the first indexable word of oop which is assumed to be variableWordSubclass */\n\nfunction checkedShortPtrOf(oop) {\n\tinterpreterProxy.success(interpreterProxy.isWords(oop));\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\treturn oop.wordsAsInt16Array();\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction glottalSource() {\n\tvar x0;\n\n\tif (t0 === 0) {\n\t\treturn 0;\n\t}\n\tif (nper < nopen) {\n\t\tx0 = (a1 * x1) + (a2 * x2);\n\t\tx2 = x1;\n\t\tx1 = x0;\n\t} else {\n\t\tx0 = (b1 * x1) - c1;\n\t\tx1 = x0;\n\t}\n\tif (nper >= t0) {\n\t\tnper = 0;\n\t\tpitchSynchronousReset();\n\t}\n\t++nper;\n\treturn x0;\n}\n\nfunction halt() {\n\t;\n}\n\nfunction linearFromdB(aNumber) {\n\treturn Math.pow(2.0,((aNumber - 87.0) / 6.0)) * 32.767;\n}\n\nfunction loadFrom(klattOop) {\n\tvar oop;\n\n\tinterpreterProxy.success(SIZEOF(klattOop) === 22);\n\tif (interpreterProxy.failed()) {\n\t\treturn false;\n\t}\n\toop = interpreterProxy.fetchPointerofObject(0, klattOop);\n\tresonators = checkedFloatPtrOf(oop);\n\tpitch = interpreterProxy.fetchFloatofObject(2, klattOop);\n\tt0 = interpreterProxy.fetchIntegerofObject(3, klattOop);\n\tnper = interpreterProxy.fetchIntegerofObject(4, klattOop);\n\tnopen = interpreterProxy.fetchIntegerofObject(5, klattOop);\n\tnmod = interpreterProxy.fetchIntegerofObject(6, klattOop);\n\ta1 = interpreterProxy.fetchFloatofObject(7, klattOop);\n\ta2 = interpreterProxy.fetchFloatofObject(8, klattOop);\n\tx1 = interpreterProxy.fetchFloatofObject(9, klattOop);\n\tx2 = interpreterProxy.fetchFloatofObject(10, klattOop);\n\tb1 = interpreterProxy.fetchFloatofObject(11, klattOop);\n\tc1 = interpreterProxy.fetchFloatofObject(12, klattOop);\n\tglast = interpreterProxy.fetchFloatofObject(13, klattOop);\n\tvlast = interpreterProxy.fetchFloatofObject(14, klattOop);\n\tnlast = interpreterProxy.fetchFloatofObject(15, klattOop);\n\tperiodCount = interpreterProxy.fetchIntegerofObject(16, klattOop);\n\tsamplesCount = interpreterProxy.fetchIntegerofObject(17, klattOop);\n\tseed = interpreterProxy.fetchIntegerofObject(18, klattOop);\n\tcascade = interpreterProxy.fetchIntegerofObject(19, klattOop);\n\tsamplesPerFrame = interpreterProxy.fetchIntegerofObject(20, klattOop);\n\tsamplingRate = interpreterProxy.fetchIntegerofObject(21, klattOop);\n\treturn interpreterProxy.failed() === false;\n}\n\n\n/*\tAnswer a random number between 0 and 65535. */\n\nfunction nextRandom() {\n\tseed = ((seed * 1309) + 13849) & 65535;\n\treturn seed;\n}\n\nfunction normalizeGlottalPulse() {\n\tvar ingore;\n\tvar s0;\n\tvar s1;\n\tvar s2;\n\n\ts0 = 0.0;\n\ts1 = x1;\n\ts2 = x2;\n\tfor (ingore = 1; ingore <= nopen; ingore++) {\n\t\ts0 = (a1 * s1) + (a2 * s2);\n\t\ts2 = s1;\n\t\ts1 = s0;\n\t}\n\tif (s0 !== 0.0) {\n\t\tx1 = (x1 / s0) * 10000.0;\n\t}\n}\n\n\n/*\tFriction-excited parallel vocal tract formants F6, F5, F4, F3, F2,\n\toutputs added with alternating sign. Sound source for other\n\tparallel resonators is friction plus first difference of\n\tvoicing waveform. */\n\nfunction parallelFrictionBranch(source) {\n\treturn (((resonatorvalue(R2fp, source) - resonatorvalue(R3fp, source)) + resonatorvalue(R4fp, source)) - resonatorvalue(R5fp, source)) + resonatorvalue(R6fp, source);\n}\n\n\n/*\tVoice-excited parallel vocal tract F1, F2, F3, F4, FNP and FTP. */\n\nfunction parallelVoicedBranch(source) {\n\treturn ((((resonatorvalue(R1vp, source) + resonatorvalue(R2vp, source)) + resonatorvalue(R3vp, source)) + resonatorvalue(R4vp, source)) + resonatorvalue(Rnpp, source)) + resonatorvalue(Rtpp, source);\n}\n\nfunction pitchSynchronousReset() {\n\tif (frame[F0] > 0) {\n\t\tvoicedPitchSynchronousReset();\n\t\tperiodCount = MOD((periodCount + 1), 65535);\n\t} else {\n\t\tt0 = 1;\n\t\tnmod = t0;\n\t}\n}\n\nfunction primitiveSynthesizeFrameIntoStartingAt() {\n\tvar aKlattFrame;\n\tvar buffer;\n\tvar bufferOop;\n\tvar rcvr;\n\tvar startIndex;\n\n\taKlattFrame = checkedFloatPtrOf(interpreterProxy.stackValue(2));\n\tbuffer = checkedShortPtrOf((bufferOop = interpreterProxy.stackValue(1)));\n\tstartIndex = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\trcvr = interpreterProxy.stackObjectValue(3);\n\tif (!loadFrom(rcvr)) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.success((SIZEOF(bufferOop) * 2) >= samplesPerFrame);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tsynthesizeFrameintostartingAt(aKlattFrame, buffer, startIndex);\n\tif (!saveTo(rcvr)) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(3);\n}\n\nfunction quphicosphisinphirphid(u, phi, cosphi, sinphi, rphid) {\n\tvar expuphi;\n\n\texpuphi = Math.exp(u * phi);\n\treturn (expuphi * ((((rphid * ((u * u) + 1.0)) + u) * sinphi) - cosphi)) + 1.0;\n}\n\n\n/*\tConvert formant frequencies and bandwidth into\n\tresonator difference equation coefficients. */\n\nfunction resonatorfrequencybandwidth(index, freq, bw) {\n\tvar a;\n\tvar arg;\n\tvar b;\n\tvar c;\n\tvar r;\n\n\targ = ((0.0 - PI) / samplingRate) * bw;\n\tr = Math.exp(arg);\n\tc = 0.0 - (r * r);\n\targ = ((PI * 2.0) / samplingRate) * freq;\n\tb = (r * Math.cos(arg)) * 2.0;\n\ta = (1.0 - b) - c;\n\tresonatorAput(index, a);\n\tresonatorBput(index, b);\n\tresonatorCput(index, c);\n}\n\n\n/*\tConvert formant frequencies and bandwidth into\n\tresonator difference equation coefficients. */\n\nfunction resonatorfrequencybandwidthgain(index, freq, bw, gain) {\n\tresonatorfrequencybandwidth(index, freq, bw);\n\tresonatorAput(index, resonatorA(index) * gain);\n}\n\nfunction resonatorvalue(index, aFloat) {\n\tvar answer;\n\tvar p1;\n\n\n\t/* (p1 between: -100000 and: 100000) ifFalse: [self halt].\n\t(answer between: -100000 and: 100000) ifFalse: [self halt]. */\n\n\tanswer = ((resonatorA(index) * aFloat) + (resonatorB(index) * ((p1 = resonatorP1(index))))) + (resonatorC(index) * resonatorP2(index));\n\tresonatorP2put(index, p1);\n\tresonatorP1put(index, answer);\n\treturn answer;\n}\n\nfunction resonatorA(index) {\n\treturn resonators[(index * 5) - 5];\n}\n\nfunction resonatorAput(index, aFloat) {\n\tresonators[(index * 5) - 5] = aFloat;\n}\n\nfunction resonatorB(index) {\n\treturn resonators[(index * 5) - 4];\n}\n\nfunction resonatorBput(index, aFloat) {\n\tresonators[(index * 5) - 4] = aFloat;\n}\n\nfunction resonatorC(index) {\n\treturn resonators[(index * 5) - 3];\n}\n\nfunction resonatorCput(index, aFloat) {\n\tresonators[(index * 5) - 3] = aFloat;\n}\n\nfunction resonatorP1(index) {\n\treturn resonators[(index * 5) - 2];\n}\n\nfunction resonatorP1put(index, aFloat) {\n\tresonators[(index * 5) - 2] = aFloat;\n}\n\nfunction resonatorP2(index) {\n\treturn resonators[(index * 5) - 1];\n}\n\nfunction resonatorP2put(index, aFloat) {\n\tresonators[(index * 5) - 1] = aFloat;\n}\n\nfunction rorark(roNumber, raNumber, rkNumber) {\n\tvar cosphi;\n\tvar d;\n\tvar gamma;\n\tvar gammapwr;\n\tvar phi;\n\tvar r;\n\tvar ra;\n\tvar rho;\n\tvar rk;\n\tvar ro;\n\tvar rphid;\n\tvar sinphi;\n\tvar te;\n\tvar theta;\n\tvar u;\n\n\tte = ((t0 * roNumber)|0);\n\tro = te / t0;\n\trk = rkNumber;\n\tra = raNumber;\n\tif (ra <= 0.0) {\n\t\td = 1.0;\n\t} else {\n\t\tr = (1.0 - ro) / ra;\n\t\td = 1.0 - (r / (Math.exp(r) - 1.0));\n\t}\n\tphi = PI * (rk + 1.0);\n\tcosphi = Math.cos(phi);\n\tsinphi = Math.sin(phi);\n\trphid = ((ra / ro) * phi) * d;\n\tu = zeroQphicosphisinphirphid(phi, cosphi, sinphi, rphid);\n\ttheta = phi / te;\n\trho = Math.exp(u * theta);\n\ta1 = (2.0 * Math.cos(theta)) * rho;\n\ta2 = 0.0 - (rho * rho);\n\tx2 = 0.0;\n\tx1 = rho * Math.sin(theta);\n\tgamma = Math.exp(-1.0 / (ra * t0));\n\tgammapwr = Math.pow(gamma,(t0 - te));\n\tb1 = gamma;\n\tc1 = ((1.0 - gamma) * gammapwr) / (1.0 - gammapwr);\n\tnormalizeGlottalPulse();\n}\n\nfunction saveTo(origKlattOop) {\n\tvar a1Oop;\n\tvar a2Oop;\n\tvar b1Oop;\n\tvar c1Oop;\n\tvar glastOop;\n\tvar klattOop;\n\tvar nlastOop;\n\tvar pitchOop;\n\tvar vlastOop;\n\tvar x1Oop;\n\tvar x2Oop;\n\n\tinterpreterProxy.pushRemappableOop(origKlattOop);\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(pitch));\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(a1));\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(a2));\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(x1));\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(x2));\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(b1));\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(c1));\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(glast));\n\tinterpreterProxy.pushRemappableOop(interpreterProxy.floatObjectOf(vlast));\n\tnlastOop = interpreterProxy.floatObjectOf(nlast);\n\tvlastOop = interpreterProxy.popRemappableOop();\n\tglastOop = interpreterProxy.popRemappableOop();\n\tc1Oop = interpreterProxy.popRemappableOop();\n\tb1Oop = interpreterProxy.popRemappableOop();\n\tx2Oop = interpreterProxy.popRemappableOop();\n\tx1Oop = interpreterProxy.popRemappableOop();\n\ta2Oop = interpreterProxy.popRemappableOop();\n\ta1Oop = interpreterProxy.popRemappableOop();\n\tpitchOop = interpreterProxy.popRemappableOop();\n\tklattOop = interpreterProxy.popRemappableOop();\n\tif (interpreterProxy.failed()) {\n\t\treturn false;\n\t}\n\tinterpreterProxy.storePointerofObjectwithValue(2, klattOop, pitchOop);\n\tinterpreterProxy.storeIntegerofObjectwithValue(3, klattOop, t0);\n\tinterpreterProxy.storeIntegerofObjectwithValue(4, klattOop, nper);\n\tinterpreterProxy.storeIntegerofObjectwithValue(5, klattOop, nopen);\n\tinterpreterProxy.storeIntegerofObjectwithValue(6, klattOop, nmod);\n\tinterpreterProxy.storePointerofObjectwithValue(7, klattOop, a1Oop);\n\tinterpreterProxy.storePointerofObjectwithValue(8, klattOop, a2Oop);\n\tinterpreterProxy.storePointerofObjectwithValue(9, klattOop, x1Oop);\n\tinterpreterProxy.storePointerofObjectwithValue(10, klattOop, x2Oop);\n\tinterpreterProxy.storePointerofObjectwithValue(11, klattOop, b1Oop);\n\tinterpreterProxy.storePointerofObjectwithValue(12, klattOop, c1Oop);\n\tinterpreterProxy.storePointerofObjectwithValue(13, klattOop, glastOop);\n\tinterpreterProxy.storePointerofObjectwithValue(14, klattOop, vlastOop);\n\tinterpreterProxy.storePointerofObjectwithValue(15, klattOop, nlastOop);\n\tinterpreterProxy.storeIntegerofObjectwithValue(16, klattOop, periodCount);\n\tinterpreterProxy.storeIntegerofObjectwithValue(17, klattOop, samplesCount);\n\tinterpreterProxy.storeIntegerofObjectwithValue(18, klattOop, seed);\n\treturn interpreterProxy.failed() === false;\n}\n\nfunction setCurrentFrame(aKlattFrame) {\n\tvar ampF1V;\n\tvar ampF2F;\n\tvar ampF2V;\n\tvar ampF3F;\n\tvar ampF3V;\n\tvar ampF4F;\n\tvar ampF4V;\n\tvar ampF5F;\n\tvar ampF6F;\n\tvar ampFNV;\n\tvar ampFTV;\n\n\n\t/* Fudge factors... */\n\n\tframe = aKlattFrame;\n\n\t/* -4.44 dB */\n\n\tampFNV = linearFromdB(frame[Anv]) * 0.6;\n\n\t/* -4.44 dB */\n\n\tampFTV = linearFromdB(frame[Atv]) * 0.6;\n\n\t/* -7.96 dB */\n\n\tampF1V = linearFromdB(frame[A1v]) * 0.4;\n\n\t/* -16.5 dB */\n\n\tampF2V = linearFromdB(frame[A2v]) * 0.15;\n\n\t/* -24.4 dB */\n\n\tampF3V = linearFromdB(frame[A3v]) * 0.06;\n\n\t/* -28.0 dB */\n\n\tampF4V = linearFromdB(frame[A4v]) * 0.04;\n\n\t/* -16.5 dB */\n\n\tampF2F = linearFromdB(frame[A2f]) * 0.15;\n\n\t/* -24.4 dB */\n\n\tampF3F = linearFromdB(frame[A3f]) * 0.06;\n\n\t/* -28.0 dB */\n\n\tampF4F = linearFromdB(frame[A4f]) * 0.04;\n\n\t/* -33.2 dB */\n\n\tampF5F = linearFromdB(frame[A5f]) * 0.022;\n\n\t/* -30.5 dB */\n\t/* Set coefficients of variable cascade resonators */\n\n\tampF6F = linearFromdB(frame[A6f]) * 0.03;\n\tif (cascade >= 8) {\n\t\tif (samplingRate >= 16000) {\n\n\t\t\t/* Inside Nyquist rate? */\n\n\t\t\tresonatorfrequencybandwidth(R8c, 7500, 600);\n\t\t} else {\n\t\t\tcascade = 6;\n\t\t}\n\t}\n\tif (cascade >= 7) {\n\t\tif (samplingRate >= 16000) {\n\n\t\t\t/* Inside Nyquist rate? */\n\n\t\t\tresonatorfrequencybandwidth(R7c, 6500, 500);\n\t\t} else {\n\t\t\tcascade = 6;\n\t\t}\n\t}\n\tif (cascade >= 6) {\n\t\tresonatorfrequencybandwidth(R6c, frame[F6], frame[B6]);\n\t}\n\tif (cascade >= 5) {\n\t\tresonatorfrequencybandwidth(R5c, frame[F5], frame[B5]);\n\t}\n\tresonatorfrequencybandwidth(R4c, frame[F4], frame[B4]);\n\tresonatorfrequencybandwidth(R3c, frame[F3], frame[B3]);\n\tresonatorfrequencybandwidth(R2c, frame[F2], frame[B2]);\n\tresonatorfrequencybandwidth(R1c, frame[F1], frame[B1]);\n\tresonatorfrequencybandwidth(Rnpc, frame[Fnp], frame[Bnp]);\n\tresonatorfrequencybandwidth(Rtpc, frame[Ftp], frame[Btp]);\n\tantiResonatorfrequencybandwidth(Rnz, frame[Fnz], frame[Bnz]);\n\tantiResonatorfrequencybandwidth(Rtz, frame[Ftz], frame[Btz]);\n\tresonatorfrequencybandwidthgain(Rnpp, frame[Fnp], frame[Bnp], ampFNV);\n\tresonatorfrequencybandwidthgain(Rtpp, frame[Ftp], frame[Btp], ampFTV);\n\tresonatorfrequencybandwidthgain(R1vp, frame[F1], frame[B1], ampF1V);\n\tresonatorfrequencybandwidthgain(R2vp, frame[F2], frame[B2], ampF2V);\n\tresonatorfrequencybandwidthgain(R3vp, frame[F3], frame[B3], ampF3V);\n\tresonatorfrequencybandwidthgain(R4vp, frame[F4], frame[B4], ampF4V);\n\tresonatorfrequencybandwidthgain(R2fp, frame[F2], frame[B2f], ampF2F);\n\tresonatorfrequencybandwidthgain(R3fp, frame[F3], frame[B3f], ampF3F);\n\tresonatorfrequencybandwidthgain(R4fp, frame[F4], frame[B4f], ampF4F);\n\tresonatorfrequencybandwidthgain(R5fp, frame[F5], frame[B5f], ampF5F);\n\tresonatorfrequencybandwidthgain(R6fp, frame[F6], frame[B6f], ampF6F);\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\nfunction synthesizeFrameintostartingAt(aKlattFrame, buffer, startIndex) {\n\tvar ampGain;\n\tvar aspiration;\n\tvar aspirationNoise;\n\tvar bypass;\n\tvar friction;\n\tvar frictionNoise;\n\tvar gain;\n\tvar glotout;\n\tvar index;\n\tvar noise;\n\tvar out;\n\tvar parGlotout;\n\tvar parVoicing;\n\tvar source;\n\tvar temp;\n\tvar top;\n\tvar turbulence;\n\tvar voice;\n\tvar voicing;\n\n\tsetCurrentFrame(aKlattFrame);\n\tif (pitch > 0) {\n\t\tvoicing = linearFromdB(frame[Voicing] - 7);\n\t\tparVoicing = linearFromdB(frame[Voicing]);\n\t\tturbulence = linearFromdB(frame[Turbulence]) * 0.1;\n\t} else {\n\t\tvoicing = (parVoicing = (turbulence = 0.0));\n\t}\n\tfriction = linearFromdB(frame[Friction]) * 0.25;\n\taspiration = linearFromdB(frame[Aspiration]) * 0.05;\n\n\t/* -26.0 dB */\n\t/* Flod overall gain into output resonator (low-pass filter) */\n\n\tbypass = linearFromdB(frame[Bypass]) * 0.05;\n\tgain = frame[Gain] - 3;\n\tif (gain <= 0) {\n\t\tgain = 57;\n\t}\n\tampGain = linearFromdB(gain);\n\tresonatorfrequencybandwidthgain(Rout, 0, samplingRate, ampGain);\n\tnoise = nlast;\n\tindex = startIndex;\n\ttop = (samplesPerFrame + startIndex) - 1;\n\twhile (index <= top) {\n\n\t\t/* Get low-passed random number for aspiration and friction noise */\n\n\n\t\t/* radom number between -8196.0 and 8196.0 */\n\t\t/* Tilt down noise spectrum by soft low-pass filter having\n\t\t a pole near the origin in the z-plane. */\n\n\t\tnoise = (nextRandom() - 32768) / 4.0;\n\t\tnoise += 0.75 * nlast;\n\n\t\t/* Amplitude modulate noise (reduce noise amplitude during second\n\t\t half of glottal period) if voicing simultaneously present. */\n\n\t\tnlast = noise;\n\t\tif (nper > nmod) {\n\t\t\tnoise = noise * 0.5;\n\t\t}\n\n\t\t/* Compute voicing waveform. */\n\n\t\tfrictionNoise = friction * noise;\n\t\tvoice = glottalSource();\n\n\t\t/* Add turbulence during glottal open phase.\n\t\t Use random rather than noise because noise is low-passed. */\n\n\t\tvlast = voice;\n\t\tif (nper < nopen) {\n\t\t\tvoice += (turbulence * (nextRandom() - 32768)) / 4.0;\n\t\t}\n\t\tglotout = voicing * voice;\n\n\t\t/* Compute aspiration amplitude and add to voicing source. */\n\n\t\tparGlotout = parVoicing * voice;\n\t\taspirationNoise = aspiration * noise;\n\t\tglotout += aspirationNoise;\n\n\t\t/* Cascade vocal tract, excited by laryngeal sources.\n\t\t Nasal antiresonator, nasal resonator, trachearl antirresonator,\n\t\t tracheal resonator, then formants F8, F7, F6, F5, F4, F3, F2, F1. */\n\n\t\tparGlotout += aspirationNoise;\n\n\t\t/* Voice-excited parallel vocal tract F1, F2, F3, F4, FNP and FTP. */\n\n\t\tout = cascadeBranch(glotout);\n\n\t\t/* Source is voicing plus aspiration. */\n\n\t\tsource = parGlotout;\n\n\t\t/* Friction-excited parallel vocal tract formants F6, F5, F4, F3, F2,\n\t\t outputs added with alternating sign. Sound source for other\n\t\t parallel resonators is friction plus first difference of\n\t\t voicing waveform. */\n\n\t\tout += parallelVoicedBranch(source);\n\t\tsource = (frictionNoise + parGlotout) - glast;\n\t\tglast = parGlotout;\n\n\t\t/* Apply bypas and output low-pass filter */\n\n\t\tout = parallelFrictionBranch(source) - out;\n\t\tout = (bypass * source) - out;\n\t\tout = resonatorvalue(Rout, out);\n\t\ttemp = ((out * ampGain)|0);\n\t\tif (temp < -32768) {\n\t\t\ttemp = -32768;\n\t\t}\n\t\tif (temp > 32767) {\n\t\t\ttemp = 32767;\n\t\t}\n\t\tbuffer[index - 1] = temp;\n\t\t++index;\n\t\t++samplesCount;\n\t}\n}\n\n\n/*\tSet the pitch. */\n\nfunction voicedPitchSynchronousReset() {\n\n\t/* Add flutter and jitter (F0 perturbations). */\n\n\tpitch = frame[F0];\n\taddFlutter();\n\taddJitter();\n\taddFrequencyDiplophonia();\n\tif (pitch < 0) {\n\t\tpitch = 0;\n\t}\n\n\t/* Duration of period before amplitude modulation. */\n\n\tt0 = ((samplingRate / pitch)|0);\n\tnmod = t0;\n\tif (frame[Voicing] > 0) {\n\t\tnmod = nmod >> 1;\n\t}\n\n\t/* Set the LF glottal pulse model parameters. */\n\n\tnopen = ((t0 * frame[Ro])|0);\n\trorark(frame[Ro], frame[Ra], frame[Rk]);\n\taddShimmer();\n\taddAmplitudeDiplophonia();\n}\n\nfunction zeroQphicosphisinphirphid(phi, cosphi, sinphi, rphid) {\n\tvar qa;\n\tvar qb;\n\tvar qc;\n\tvar qzero;\n\tvar ua;\n\tvar ub;\n\tvar uc;\n\n\tqzero = quphicosphisinphirphid(0, phi, cosphi, sinphi, rphid);\n\tif (qzero > 0) {\n\t\tua = 0;\n\t\tub = 1;\n\t\tqa = qzero;\n\t\tqb = quphicosphisinphirphid(ub, phi, cosphi, sinphi, rphid);\n\t\twhile (qb > 0) {\n\t\t\tua = ub;\n\t\t\tqa = qb;\n\t\t\tub = ub * 2;\n\t\t\tqb = quphicosphisinphirphid(ub, phi, cosphi, sinphi, rphid);\n\t\t}\n\t} else {\n\t\tua = -1;\n\t\tub = 0;\n\t\tqa = quphicosphisinphirphid(ua, phi, cosphi, sinphi, rphid);\n\t\tqb = qzero;\n\t\twhile (qa < 0) {\n\t\t\tub = ua;\n\t\t\tqb = qa;\n\t\t\tua = ua * 2;\n\t\t\tqa = quphicosphisinphirphid(ua, phi, cosphi, sinphi, rphid);\n\t\t}\n\t}\n\twhile ((ub - ua) > Epsilon) {\n\t\tuc = (ub + ua) / 2.0;\n\t\tqc = quphicosphisinphirphid(uc, phi, cosphi, sinphi, rphid);\n\t\tif (qc > 0) {\n\t\t\tua = uc;\n\t\t\tqa = qc;\n\t\t} else {\n\t\t\tub = uc;\n\t\t\tqb = qc;\n\t\t}\n\t}\n\treturn (ub + ua) / 2.0;\n}\n\n\nSqueak.registerExternalModule(\"Klatt\", {\n\tsetInterpreter: setInterpreter,\n\tprimitiveSynthesizeFrameIntoStartingAt: primitiveSynthesizeFrameIntoStartingAt,\n\tgetModuleName: getModuleName,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:21 pm */\n/* Automatically generated by\n\tJSSmartSyntaxPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tLargeIntegersPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.LargeIntegers\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar andOpIndex = 0;\nvar interpreterProxy = null;\nvar moduleName = \"LargeIntegers v1.5 (e)\";\nvar orOpIndex = 1;\nvar xorOpIndex = 2;\n\n\n\n/*\tArgument has to be aBytesOop! */\n/*\tTests for any magnitude bits in the interval from start to stopArg. */\n\nfunction anyBitOfBytesfromto(aBytesOop, start, stopArg) {\n\tvar lastByteIx;\n\tvar digit;\n\tvar magnitude;\n\tvar leftShift;\n\tvar rightShift;\n\tvar firstByteIx;\n\tvar stop;\n\tvar mask;\n\tvar ix;\n\n\t// missing DebugCode;\n\tif ((start < 1) || (stopArg < 1)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tmagnitude = aBytesOop;\n\tstop = Math.min(stopArg, highBitOfBytes(magnitude));\n\tif (start > stop) {\n\t\treturn false;\n\t}\n\tfirstByteIx = ((start - 1) >> 3) + 1;\n\tlastByteIx = ((stop - 1) >> 3) + 1;\n\trightShift = MOD((start - 1), 8);\n\tleftShift = 7 - (MOD((stop - 1), 8));\n\tif (firstByteIx === lastByteIx) {\n\t\tmask = (SHL(255, rightShift)) & (SHR(255, leftShift));\n\t\tdigit = digitOfBytesat(magnitude, firstByteIx);\n\t\treturn (digit & mask) !== 0;\n\t}\n\tif ((SHR(digitOfBytesat(magnitude, firstByteIx), rightShift)) !== 0) {\n\t\treturn true;\n\t}\n\tfor (ix = (firstByteIx + 1); ix <= (lastByteIx - 1); ix++) {\n\t\tif (digitOfBytesat(magnitude, ix) !== 0) {\n\t\t\treturn true;\n\t\t}\n\t}\n\tif (((SHL(digitOfBytesat(magnitude, lastByteIx), leftShift)) & 255) !== 0) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n\n/*\tPrecondition: bytesOop is not anInteger and a bytes object. */\n/*\tFunction #byteSizeOf: is used by the interpreter, be careful with name\n\tclashes... */\n\nfunction byteSizeOfBytes(bytesOop) {\n\treturn SIZEOF(bytesOop);\n}\n\n\n/*\tAttention: this method invalidates all oop's! Only newBytes is valid at return. */\n/*\tDoes not normalize. */\n\nfunction bytesgrowTo(aBytesObject, newLen) {\n\tvar oldLen;\n\tvar copyLen;\n\tvar newBytes;\n\n\tnewBytes = interpreterProxy.instantiateClassindexableSize(CLASSOF(aBytesObject), newLen);\n;\n\toldLen = BYTESIZEOF(aBytesObject);\n\tif (oldLen < newLen) {\n\t\tcopyLen = oldLen;\n\t} else {\n\t\tcopyLen = newLen;\n\t}\n\tcDigitCopyFromtolen(aBytesObject.bytes, newBytes.bytes, copyLen);\n\treturn newBytes;\n}\n\n\n/*\tAttention: this method invalidates all oop's! Only newBytes is valid at return. */\n\nfunction bytesOrIntgrowTo(oop, len) {\n\tvar sq_class;\n\tvar val;\n\tvar newBytes;\n\n\tif (typeof oop === \"number\") {\n\t\tval = oop;\n\t\tif (val < 0) {\n\t\t\tsq_class = interpreterProxy.classLargeNegativeInteger();\n\t\t} else {\n\t\t\tsq_class = interpreterProxy.classLargePositiveInteger();\n\t\t}\n\t\tnewBytes = interpreterProxy.instantiateClassindexableSize(sq_class, len);\n\t\tcCopyIntValtoBytes(val, newBytes);\n\t} else {\n\t\tnewBytes = bytesgrowTo(oop, len);\n\t}\n\treturn newBytes;\n}\n\nfunction cCopyIntValtoBytes(val, bytes) {\n\tvar pByte;\n\tvar ix;\n\tvar ixLimiT;\n\n\tpByte = bytes.bytes;\n\tfor (ix = 1, ixLimiT = cDigitLengthOfCSI(val); ix <= ixLimiT; ix++) {\n\t\tpByte[ix - 1] = cDigitOfCSIat(val, ix);\n\t}\n}\n\n\n/*\tpByteRes len = longLen; returns over.. */\n\nfunction cDigitAddlenwithleninto(pByteShort, shortLen, pByteLong, longLen, pByteRes) {\n\tvar i;\n\tvar limit;\n\tvar accum;\n\n\taccum = 0;\n\tlimit = shortLen - 1;\n\tfor (i = 0; i <= limit; i++) {\n\t\taccum = ((accum >>> 8) + pByteShort[i]) + pByteLong[i];\n\t\tpByteRes[i] = (accum & 255);\n\t}\n\tlimit = longLen - 1;\n\tfor (i = shortLen; i <= limit; i++) {\n\t\taccum = (accum >>> 8) + pByteLong[i];\n\t\tpByteRes[i] = (accum & 255);\n\t}\n\treturn accum >>> 8;\n}\n\n\n/*\tPrecondition: pFirst len = pSecond len. */\n\nfunction cDigitComparewithlen(pFirst, pSecond, len) {\n\tvar firstDigit;\n\tvar secondDigit;\n\tvar ix;\n\n\tix = len - 1;\n\twhile (ix >= 0) {\n\t\tif (((secondDigit = pSecond[ix])) !== ((firstDigit = pFirst[ix]))) {\n\t\t\tif (secondDigit < firstDigit) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t\t--ix;\n\t}\n\treturn 0;\n}\n\nfunction cDigitCopyFromtolen(pFrom, pTo, len) {\n\tvar limit;\n\tvar i;\n\n\t;\n\tlimit = len - 1;\n\tfor (i = 0; i <= limit; i++) {\n\t\tpTo[i] = pFrom[i];\n\t}\n\treturn 0;\n}\n\nfunction cDigitDivlenremlenquolen(pDiv, divLen, pRem, remLen, pQuo, quoLen) {\n\tvar b;\n\tvar q;\n\tvar a;\n\tvar dnh;\n\tvar lo;\n\tvar hi;\n\tvar r3;\n\tvar mul;\n\tvar cond;\n\tvar l;\n\tvar k;\n\tvar j;\n\tvar i;\n\tvar dl;\n\tvar ql;\n\tvar r1r2;\n\tvar dh;\n\tvar t;\n\n\n\t/* Last actual byte of data (ST ix) */\n\n\tdl = divLen - 1;\n\tql = quoLen;\n\tdh = pDiv[dl - 1];\n\tif (dl === 1) {\n\t\tdnh = 0;\n\t} else {\n\t\tdnh = pDiv[dl - 2];\n\t}\n\tfor (k = 1; k <= ql; k++) {\n\n\t\t/* maintain quo*arg+rem=self */\n\t\t/* Estimate rem/div by dividing the leading two digits of rem by dh. */\n\t\t/* The estimate is q = qhi*16r100+qlo, where qhi and qlo are unsigned char. */\n\n\n\t\t/* r1 := rem digitAt: j. */\n\n\t\tj = (remLen + 1) - k;\n\t\tif (pRem[j - 1] === dh) {\n\t\t\tq = 255;\n\t\t} else {\n\n\t\t\t/* Compute q = (r1,r2)//dh, t = (r1,r2)\\\\dh. */\n\t\t\t/* r2 := (rem digitAt: j - 2). */\n\n\t\t\tr1r2 = pRem[j - 1];\n\t\t\tr1r2 = (r1r2 << 8) + pRem[j - 2];\n\t\t\tt = MOD(r1r2, dh);\n\n\t\t\t/* Next compute (hi,lo) := q*dnh */\n\n\t\t\tq = DIV(r1r2, dh);\n\t\t\tmul = q * dnh;\n\t\t\thi = mul >>> 8;\n\n\t\t\t/* Correct overestimate of q. \n\t\t\t\tMax of 2 iterations through loop -- see Knuth vol. 2 */\n\n\t\t\tlo = mul & 255;\n\t\t\tif (j < 3) {\n\t\t\t\tr3 = 0;\n\t\t\t} else {\n\t\t\t\tr3 = pRem[j - 3];\n\t\t\t}\n\t\t\t\t\twhile (true) {\n\t\t\t\tif ((t < hi) || ((t === hi) && (r3 < lo))) {\n\n\t\t\t\t\t/* i.e. (t,r3) < (hi,lo) */\n\n\t\t\t\t\t--q;\n\t\t\t\t\tif (lo < dnh) {\n\t\t\t\t\t\t--hi;\n\t\t\t\t\t\tlo = (lo + 256) - dnh;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlo -= dnh;\n\t\t\t\t\t}\n\t\t\t\t\tcond = hi >= dh;\n\t\t\t\t} else {\n\t\t\t\t\tcond = false;\n\t\t\t\t}\n\t\t\t\tif (!(cond)) break;\n\t\t\t\thi -= dh;\n\t\t\t}\n\t\t}\n\t\tl = j - dl;\n\t\ta = 0;\n\t\tfor (i = 1; i <= divLen; i++) {\n\t\t\thi = pDiv[i - 1] * (q >>> 8);\n\t\t\tlo = pDiv[i - 1] * (q & 255);\n\t\t\tb = (pRem[l - 1] - a) - (lo & 255);\n\t\t\tpRem[l - 1] = (b & 255);\n\n\t\t\t/* This is a possible replacement to simulate arithmetic shift (preserving sign of b) */\n\t\t\t/* b := b >> 8 bitOr: (0 - (b >> ((interpreterProxy sizeof: b)*8 */\n\t\t\t/* CHAR_BIT */\n\t\t\t/* -1)) << 8). */\n\n\t\t\tb = b >> 8;\n\t\t\ta = (hi + (lo >>> 8)) - b;\n\t\t\t++l;\n\t\t}\n\t\tif (a > 0) {\n\n\t\t\t/* Add div back into rem, decrease q by 1 */\n\n\t\t\t--q;\n\t\t\tl = j - dl;\n\t\t\ta = 0;\n\t\t\tfor (i = 1; i <= divLen; i++) {\n\t\t\t\ta = ((a >>> 8) + pRem[l - 1]) + pDiv[i - 1];\n\t\t\t\tpRem[l - 1] = (a & 255);\n\t\t\t\t++l;\n\t\t\t}\n\t\t}\n\t\tpQuo[quoLen - k] = q;\n\t}\n\treturn 0;\n}\n\n\n/*\tAnswer the index (in bits) of the high order bit of the receiver, or zero if the \n\t receiver is zero. This method is allowed (and needed) for \n\tLargeNegativeIntegers as well, since Squeak's LargeIntegers are \n\tsign/magnitude. */\n\nfunction cDigitHighBitlen(pByte, len) {\n\tvar lastDigit;\n\tvar realLength;\n\n\trealLength = len;\n\twhile (((lastDigit = pByte[realLength - 1])) === 0) {\n\t\tif (((--realLength)) === 0) {\n\t\t\treturn 0;\n\t\t}\n\t}\n\treturn cHighBit(lastDigit) + (8 * (realLength - 1));\n}\n\n\n/*\tAnswer the number of indexable fields of a CSmallInteger. This value is \n\t the same as the largest legal subscript. */\n\nfunction cDigitLengthOfCSI(csi) {\n\tif ((csi < 256) && (csi > -256)) {\n\t\treturn 1;\n\t}\n\tif ((csi < 65536) && (csi > -65536)) {\n\t\treturn 2;\n\t}\n\tif ((csi < 16777216) && (csi > -16777216)) {\n\t\treturn 3;\n\t}\n\treturn 4;\n}\n\n\n/*\tC indexed! */\n\nfunction cDigitLshiftfromlentolen(shiftCount, pFrom, lenFrom, pTo, lenTo) {\n\tvar digitShift;\n\tvar carry;\n\tvar digit;\n\tvar i;\n\tvar bitShift;\n\tvar rshift;\n\tvar limit;\n\n\tdigitShift = shiftCount >> 3;\n\tbitShift = MOD(shiftCount, 8);\n\tlimit = digitShift - 1;\n\tfor (i = 0; i <= limit; i++) {\n\t\tpTo[i] = 0;\n\t}\n\tif (bitShift === 0) {\n\n\t\t/* Fast version for digit-aligned shifts */\n\t\t/* C indexed! */\n\n\t\treturn cDigitReplacefromtowithstartingAt(pTo, digitShift, lenTo - 1, pFrom, 0);\n\t}\n\trshift = 8 - bitShift;\n\tcarry = 0;\n\tlimit = lenFrom - 1;\n\tfor (i = 0; i <= limit; i++) {\n\t\tdigit = pFrom[i];\n\t\tpTo[i + digitShift] = ((carry | (SHL(digit, bitShift))) & 255);\n\t\tcarry = SHR(digit, rshift);\n\t}\n\tif (carry !== 0) {\n\t\tpTo[lenTo - 1] = carry;\n\t}\n\treturn 0;\n}\n\nfunction cDigitMontgomerylentimeslenmodulolenmInvModBinto(pBytesFirst, firstLen, pBytesSecond, secondLen, pBytesThird, thirdLen, mInv, pBytesRes) {\n\tvar k;\n\tvar i;\n\tvar lastByte;\n\tvar limit3;\n\tvar limit2;\n\tvar limit1;\n\tvar u;\n\tvar accum;\n\n\tlimit1 = firstLen - 1;\n\tlimit2 = secondLen - 1;\n\tlimit3 = thirdLen - 1;\n\tlastByte = 0;\n\tfor (i = 0; i <= limit1; i++) {\n\t\taccum = pBytesRes[0] + (pBytesFirst[i] * pBytesSecond[0]);\n\t\tu = (accum * mInv) & 255;\n\t\taccum += u * pBytesThird[0];\n\t\tfor (k = 1; k <= limit2; k++) {\n\t\t\taccum = (((accum >>> 8) + pBytesRes[k]) + (pBytesFirst[i] * pBytesSecond[k])) + (u * pBytesThird[k]);\n\t\t\tpBytesRes[k - 1] = (accum & 255);\n\t\t}\n\t\tfor (k = secondLen; k <= limit3; k++) {\n\t\t\taccum = ((accum >>> 8) + pBytesRes[k]) + (u * pBytesThird[k]);\n\t\t\tpBytesRes[k - 1] = (accum & 255);\n\t\t}\n\t\taccum = (accum >>> 8) + lastByte;\n\t\tpBytesRes[limit3] = (accum & 255);\n\t\tlastByte = accum >>> 8;\n\t}\n\tfor (i = firstLen; i <= limit3; i++) {\n\t\taccum = pBytesRes[0];\n\t\tu = (accum * mInv) & 255;\n\t\taccum += u * pBytesThird[0];\n\t\tfor (k = 1; k <= limit3; k++) {\n\t\t\taccum = ((accum >>> 8) + pBytesRes[k]) + (u * pBytesThird[k]);\n\t\t\tpBytesRes[k - 1] = (accum & 255);\n\t\t}\n\t\taccum = (accum >>> 8) + lastByte;\n\t\tpBytesRes[limit3] = (accum & 255);\n\t\tlastByte = accum >>> 8;\n\t}\n\tif (!((lastByte === 0) && (cDigitComparewithlen(pBytesThird, pBytesRes, thirdLen) === 1))) {\n\n\t\t/* self cDigitSub: pBytesThird len: thirdLen with: pBytesRes len: thirdLen into: pBytesRes */\n\n\t\taccum = 0;\n\t\tfor (i = 0; i <= limit3; i++) {\n\t\t\taccum = (accum + pBytesRes[i]) - pBytesThird[i];\n\t\t\tpBytesRes[i] = (accum & 255);\n\t\t\taccum = accum >> 8;\n\t\t}\n\t}\n}\n\nfunction cDigitMultiplylenwithleninto(pByteShort, shortLen, pByteLong, longLen, pByteRes) {\n\tvar ab;\n\tvar j;\n\tvar digit;\n\tvar carry;\n\tvar i;\n\tvar limitLong;\n\tvar k;\n\tvar limitShort;\n\n\tif ((shortLen === 1) && (pByteShort[0] === 0)) {\n\t\treturn 0;\n\t}\n\tif ((longLen === 1) && (pByteLong[0] === 0)) {\n\t\treturn 0;\n\t}\n\tlimitShort = shortLen - 1;\n\tlimitLong = longLen - 1;\n\tfor (i = 0; i <= limitShort; i++) {\n\t\tif (((digit = pByteShort[i])) !== 0) {\n\t\t\tk = i;\n\n\t\t\t/* Loop invariant: 0<=carry<=0377, k=i+j-1 (ST) */\n\t\t\t/* -> Loop invariant: 0<=carry<=0377, k=i+j (C) (?) */\n\n\t\t\tcarry = 0;\n\t\t\tfor (j = 0; j <= limitLong; j++) {\n\t\t\t\tab = pByteLong[j];\n\t\t\t\tab = ((ab * digit) + carry) + pByteRes[k];\n\t\t\t\tcarry = ab >>> 8;\n\t\t\t\tpByteRes[k] = (ab & 255);\n\t\t\t\t++k;\n\t\t\t}\n\t\t\tpByteRes[k] = carry;\n\t\t}\n\t}\n\treturn 0;\n}\n\n\n/*\tAnswer the value of an indexable field in the receiver. \n\tLargePositiveInteger uses bytes of base two number, and each is a \n\t 'digit' base 256. */\n/*\tST indexed! */\n\nfunction cDigitOfCSIat(csi, ix) {\n\tif (ix < 1) {\n\t\tinterpreterProxy.primitiveFail();\n\t}\n\tif (ix > 4) {\n\t\treturn 0;\n\t}\n\tif (csi < 0) {\n\t\t;\n\t\treturn (SHR((0 - csi), ((ix - 1) * 8))) & 255;\n\t} else {\n\t\treturn (SHR(csi, ((ix - 1) * 8))) & 255;\n\t}\n}\n\n\n/*\tpByteRes len = longLen. */\n\nfunction cDigitOpshortlenlongleninto(opIndex, pByteShort, shortLen, pByteLong, longLen, pByteRes) {\n\tvar i;\n\tvar limit;\n\n\tlimit = shortLen - 1;\n\tif (opIndex === andOpIndex) {\n\t\tfor (i = 0; i <= limit; i++) {\n\t\t\tpByteRes[i] = (pByteShort[i] & pByteLong[i]);\n\t\t}\n\t\tlimit = longLen - 1;\n\t\tfor (i = shortLen; i <= limit; i++) {\n\t\t\tpByteRes[i] = 0;\n\t\t}\n\t\treturn 0;\n\t}\n\tif (opIndex === orOpIndex) {\n\t\tfor (i = 0; i <= limit; i++) {\n\t\t\tpByteRes[i] = (pByteShort[i] | pByteLong[i]);\n\t\t}\n\t\tlimit = longLen - 1;\n\t\tfor (i = shortLen; i <= limit; i++) {\n\t\t\tpByteRes[i] = pByteLong[i];\n\t\t}\n\t\treturn 0;\n\t}\n\tif (opIndex === xorOpIndex) {\n\t\tfor (i = 0; i <= limit; i++) {\n\t\t\tpByteRes[i] = (pByteShort[i] ^ pByteLong[i]);\n\t\t}\n\t\tlimit = longLen - 1;\n\t\tfor (i = shortLen; i <= limit; i++) {\n\t\t\tpByteRes[i] = pByteLong[i];\n\t\t}\n\t\treturn 0;\n\t}\n\treturn interpreterProxy.primitiveFail();\n}\n\n\n/*\tC indexed! */\n\nfunction cDigitReplacefromtowithstartingAt(pTo, start, stop, pFrom, repStart) {\n\treturn function() {\n\t\t// inlining self cDigitCopyFrom: pFrom + repStart to: pTo + start len: stop - start + 1\n\t\tvar len = stop - start + 1;\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tpTo[i + start] = pFrom[i + repStart];\n\t\t}\n\t\treturn 0;\n\t}();\n;\n}\n\nfunction cDigitRshiftfromlentolen(shiftCount, pFrom, fromLen, pTo, toLen) {\n\tvar j;\n\tvar digitShift;\n\tvar carry;\n\tvar digit;\n\tvar bitShift;\n\tvar leftShift;\n\tvar limit;\n\tvar start;\n\n\tdigitShift = shiftCount >> 3;\n\tbitShift = MOD(shiftCount, 8);\n\tif (bitShift === 0) {\n\n\t\t/* Fast version for byte-aligned shifts */\n\t\t/* C indexed! */\n\n\t\treturn cDigitReplacefromtowithstartingAt(pTo, 0, toLen - 1, pFrom, digitShift);\n\t}\n\tleftShift = 8 - bitShift;\n\tcarry = SHR(pFrom[digitShift], bitShift);\n\tstart = digitShift + 1;\n\tlimit = fromLen - 1;\n\tfor (j = start; j <= limit; j++) {\n\t\tdigit = pFrom[j];\n\t\tpTo[j - start] = ((carry | (SHL(digit, leftShift))) & 255);\n\t\tcarry = SHR(digit, bitShift);\n\t}\n\tif (carry !== 0) {\n\t\tpTo[toLen - 1] = carry;\n\t}\n\treturn 0;\n}\n\nfunction cDigitSublenwithleninto(pByteSmall, smallLen, pByteLarge, largeLen, pByteRes) {\n\tvar i;\n\tvar z;\n\n\n\t/* Loop invariant is -1<=z<=0 */\n\n\tz = 0;\n\tfor (i = 0; i <= (smallLen - 1); i++) {\n\t\tz = (z + pByteLarge[i]) - pByteSmall[i];\n\t\tpByteRes[i] = (z & 255);\n\t\tz = z >> 8;\n\t}\n\tfor (i = smallLen; i <= (largeLen - 1); i++) {\n\t\tz += pByteLarge[i];\n\t\tpByteRes[i] = (z & 255);\n\t\tz = z >> 8;\n\t}\n}\n\n\n/*\tAnswer the index of the high order bit of the argument, or zero if the \n\targument is zero. */\n/*\tFor 64 bit uints there could be added a 32-shift. */\n\nfunction cHighBit(uint) {\n\tvar shifted;\n\tvar bitNo;\n\n\tshifted = uint;\n\tbitNo = 0;\n\tif (!(shifted < (1 << 16))) {\n\t\tshifted = shifted >>> 16;\n\t\tbitNo += 16;\n\t}\n\tif (!(shifted < (1 << 8))) {\n\t\tshifted = shifted >>> 8;\n\t\tbitNo += 8;\n\t}\n\tif (!(shifted < (1 << 4))) {\n\t\tshifted = shifted >>> 4;\n\t\tbitNo += 4;\n\t}\n\tif (!(shifted < (1 << 2))) {\n\t\tshifted = shifted >>> 2;\n\t\tbitNo += 2;\n\t}\n\tif (!(shifted < (1 << 1))) {\n\t\tshifted = shifted >>> 1;\n\t\t++bitNo;\n\t}\n\treturn bitNo + shifted;\n}\n\n\n/*\tanOop has to be a SmallInteger! */\n\nfunction createLargeFromSmallInteger(anOop) {\n\tvar size;\n\tvar res;\n\tvar pByte;\n\tvar ix;\n\tvar sq_class;\n\tvar val;\n\n\tval = anOop;\n\tif (val < 0) {\n\t\tsq_class = interpreterProxy.classLargeNegativeInteger();\n\t} else {\n\t\tsq_class = interpreterProxy.classLargePositiveInteger();\n\t}\n\tsize = cDigitLengthOfCSI(val);\n\tres = interpreterProxy.instantiateClassindexableSize(sq_class, size);\n\tpByte = res.bytes;\n\tfor (ix = 1; ix <= size; ix++) {\n\t\tpByte[ix - 1] = cDigitOfCSIat(val, ix);\n\t}\n\treturn res;\n}\n\n\n/*\tAttention: this method invalidates all oop's! Only newBytes is valid at return. */\n/*\tDoes not normalize. */\n\nfunction digitLshift(aBytesOop, shiftCount) {\n\tvar newLen;\n\tvar oldLen;\n\tvar newBytes;\n\tvar highBit;\n\n\toldLen = BYTESIZEOF(aBytesOop);\n\tif (((highBit = cDigitHighBitlen(aBytesOop.bytes, oldLen))) === 0) {\n\t\treturn 0;\n\t}\n\tnewLen = ((highBit + shiftCount) + 7) >> 3;\n\tnewBytes = interpreterProxy.instantiateClassindexableSize(CLASSOF(aBytesOop), newLen);\n;\n\tcDigitLshiftfromlentolen(shiftCount, aBytesOop.bytes, oldLen, newBytes.bytes, newLen);\n\treturn newBytes;\n}\n\n\n/*\tAttention: this method invalidates all oop's! Only newBytes is valid at return. */\n/*\tShift right shiftCount bits, 0<=shiftCount. \n\tDiscard all digits beyond a, and all zeroes at or below a. */\n/*\tDoes not normalize. */\n\nfunction digitRshiftlookfirst(aBytesOop, shiftCount, a) {\n\tvar newOop;\n\tvar oldDigitLen;\n\tvar newByteLen;\n\tvar newBitLen;\n\tvar oldBitLen;\n\n\toldBitLen = cDigitHighBitlen(aBytesOop.bytes, a);\n\toldDigitLen = (oldBitLen + 7) >> 3;\n\tnewBitLen = oldBitLen - shiftCount;\n\tif (newBitLen <= 0) {\n\n\t\t/* All bits lost */\n\n\t\treturn interpreterProxy.instantiateClassindexableSize(CLASSOF(aBytesOop), 0);\n\t}\n\tnewByteLen = (newBitLen + 7) >> 3;\n\tnewOop = interpreterProxy.instantiateClassindexableSize(CLASSOF(aBytesOop), newByteLen);\n;\n\tcDigitRshiftfromlentolen(shiftCount, aBytesOop.bytes, oldDigitLen, newOop.bytes, newByteLen);\n\treturn newOop;\n}\n\n\n/*\tDoes not need to normalize! */\n\nfunction digitAddLargewith(firstInteger, secondInteger) {\n\tvar sum;\n\tvar shortLen;\n\tvar over;\n\tvar shortInt;\n\tvar resClass;\n\tvar newSum;\n\tvar longLen;\n\tvar firstLen;\n\tvar secondLen;\n\tvar longInt;\n\n\tfirstLen = BYTESIZEOF(firstInteger);\n\tsecondLen = BYTESIZEOF(secondInteger);\n\tresClass = CLASSOF(firstInteger);\n\tif (firstLen <= secondLen) {\n\t\tshortInt = firstInteger;\n\t\tshortLen = firstLen;\n\t\tlongInt = secondInteger;\n\t\tlongLen = secondLen;\n\t} else {\n\t\tshortInt = secondInteger;\n\t\tshortLen = secondLen;\n\t\tlongInt = firstInteger;\n\t\tlongLen = firstLen;\n\t}\n\tsum = interpreterProxy.instantiateClassindexableSize(resClass, longLen);\n;\n\tover = cDigitAddlenwithleninto(shortInt.bytes, shortLen, longInt.bytes, longLen, sum.bytes);\n\tif (over > 0) {\n\n\t\t/* sum := sum growby: 1. */\n\n\t\t\tnewSum = interpreterProxy.instantiateClassindexableSize(resClass, longLen + 1);\n;\n\t\tcDigitCopyFromtolen(sum.bytes, newSum.bytes, longLen);\n\n\t\t/* C index! */\n\n\t\tsum = newSum;\n\t\tsum.bytes[longLen] = over;\n\t}\n\treturn sum;\n}\n\n\n/*\tBit logic here is only implemented for positive integers or Zero;\n\tif rec or arg is negative, it fails. */\n\nfunction digitBitLogicwithopIndex(firstInteger, secondInteger, opIx) {\n\tvar shortLen;\n\tvar shortLarge;\n\tvar firstLarge;\n\tvar secondLarge;\n\tvar longLen;\n\tvar longLarge;\n\tvar firstLen;\n\tvar secondLen;\n\tvar result;\n\n\tif (typeof firstInteger === \"number\") {\n\t\tif (firstInteger < 0) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\t\tfirstLarge = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tif (CLASSOF(firstInteger) === interpreterProxy.classLargeNegativeInteger()) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\tfirstLarge = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\t\tif (secondInteger < 0) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\t\tsecondLarge = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tif (CLASSOF(secondInteger) === interpreterProxy.classLargeNegativeInteger()) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\tsecondLarge = secondInteger;\n\t}\n\tfirstLen = BYTESIZEOF(firstLarge);\n\tsecondLen = BYTESIZEOF(secondLarge);\n\tif (firstLen < secondLen) {\n\t\tshortLen = firstLen;\n\t\tshortLarge = firstLarge;\n\t\tlongLen = secondLen;\n\t\tlongLarge = secondLarge;\n\t} else {\n\t\tshortLen = secondLen;\n\t\tshortLarge = secondLarge;\n\t\tlongLen = firstLen;\n\t\tlongLarge = firstLarge;\n\t}\n\tresult = interpreterProxy.instantiateClassindexableSize(interpreterProxy.classLargePositiveInteger(), longLen);\n;\n\tcDigitOpshortlenlongleninto(opIx, shortLarge.bytes, shortLen, longLarge.bytes, longLen, result.bytes);\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\treturn normalizePositive(result);\n}\n\n\n/*\tCompare the magnitude of firstInteger with that of secondInteger. \n\tReturn a code of 1, 0, -1 for firstInteger >, = , < secondInteger */\n\nfunction digitCompareLargewith(firstInteger, secondInteger) {\n\tvar secondLen;\n\tvar firstLen;\n\n\tfirstLen = BYTESIZEOF(firstInteger);\n\tsecondLen = BYTESIZEOF(secondInteger);\n\tif (secondLen !== firstLen) {\n\t\tif (secondLen > firstLen) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\treturn 1;\n\t\t}\n\t}\n\treturn cDigitComparewithlen(firstInteger.bytes, secondInteger.bytes, firstLen);\n}\n\n\n/*\tDoes not normalize. */\n/*\tDivision by zero has to be checked in caller. */\n\nfunction digitDivLargewithnegative(firstInteger, secondInteger, neg) {\n\tvar resultClass;\n\tvar result;\n\tvar rem;\n\tvar div;\n\tvar quo;\n\tvar d;\n\tvar l;\n\tvar secondLen;\n\tvar firstLen;\n\n\tfirstLen = BYTESIZEOF(firstInteger);\n\tsecondLen = BYTESIZEOF(secondInteger);\n\tif (neg) {\n\t\tresultClass = interpreterProxy.classLargeNegativeInteger();\n\t} else {\n\t\tresultClass = interpreterProxy.classLargePositiveInteger();\n\t}\n\tl = (firstLen - secondLen) + 1;\n\tif (l <= 0) {\n\t\t\tresult = interpreterProxy.instantiateClassindexableSize(interpreterProxy.classArray(), 2);\n;\n\t\tinterpreterProxy.stObjectatput(result,1,0);\n\t\tinterpreterProxy.stObjectatput(result,2,firstInteger);\n\t\treturn result;\n\t}\n\td = 8 - cHighBit(unsafeByteOfat(secondInteger, secondLen));\n\tdiv = digitLshift(secondInteger, d);\ndiv = bytesOrIntgrowTo(div, digitLength(div) + 1);\n;\n\trem = digitLshift(firstInteger, d);\nif (digitLength(rem) === firstLen) {\n\trem = bytesOrIntgrowTo(rem, firstLen + 1);\n}\n;\n\tquo = interpreterProxy.instantiateClassindexableSize(resultClass, l);\n;\n\tcDigitDivlenremlenquolen(div.bytes, digitLength(div), rem.bytes, digitLength(rem), quo.bytes, digitLength(quo));\n\trem = digitRshiftlookfirst(rem, d, digitLength(div) - 1);\n;\n\tresult = interpreterProxy.instantiateClassindexableSize(interpreterProxy.classArray(), 2);\n;\n\tinterpreterProxy.stObjectatput(result,1,quo);\n\tinterpreterProxy.stObjectatput(result,2,rem);\n\treturn result;\n}\n\nfunction digitLength(oop) {\n\tif (typeof oop === \"number\") {\n\t\treturn cDigitLengthOfCSI(oop);\n\t} else {\n\t\treturn BYTESIZEOF(oop);\n\t}\n}\n\nfunction digitMontgomerytimesmodulomInvModB(firstLarge, secondLarge, thirdLarge, mInv) {\n\tvar prod;\n\tvar thirdLen;\n\tvar firstLen;\n\tvar secondLen;\n\n\tfirstLen = BYTESIZEOF(firstLarge);\n\tsecondLen = BYTESIZEOF(secondLarge);\n\tthirdLen = BYTESIZEOF(thirdLarge);\n\tif (!(firstLen <= thirdLen)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!(secondLen <= thirdLen)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!((mInv >= 0) && (mInv <= 255))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tprod = interpreterProxy.instantiateClassindexableSize(interpreterProxy.classLargePositiveInteger(), thirdLen);\n;\n\tcDigitMontgomerylentimeslenmodulolenmInvModBinto(firstLarge.bytes, firstLen, secondLarge.bytes, secondLen, thirdLarge.bytes, thirdLen, mInv, prod.bytes);\n\treturn normalizePositive(prod);\n}\n\n\n/*\tNormalizes. */\n\nfunction digitMultiplyLargewithnegative(firstInteger, secondInteger, neg) {\n\tvar longInt;\n\tvar resultClass;\n\tvar shortLen;\n\tvar shortInt;\n\tvar longLen;\n\tvar prod;\n\tvar secondLen;\n\tvar firstLen;\n\n\tfirstLen = BYTESIZEOF(firstInteger);\n\tsecondLen = BYTESIZEOF(secondInteger);\n\tif (firstLen <= secondLen) {\n\t\tshortInt = firstInteger;\n\t\tshortLen = firstLen;\n\t\tlongInt = secondInteger;\n\t\tlongLen = secondLen;\n\t} else {\n\t\tshortInt = secondInteger;\n\t\tshortLen = secondLen;\n\t\tlongInt = firstInteger;\n\t\tlongLen = firstLen;\n\t}\n\tif (neg) {\n\t\tresultClass = interpreterProxy.classLargeNegativeInteger();\n\t} else {\n\t\tresultClass = interpreterProxy.classLargePositiveInteger();\n\t}\n\tprod = interpreterProxy.instantiateClassindexableSize(resultClass, longLen + shortLen);\n;\n\tcDigitMultiplylenwithleninto(shortInt.bytes, shortLen, longInt.bytes, longLen, prod.bytes);\n\treturn normalize(prod);\n}\n\n\n/*\tArgument has to be aLargeInteger! */\n\nfunction digitOfBytesat(aBytesOop, ix) {\n\tif (ix > BYTESIZEOF(aBytesOop)) {\n\t\treturn 0;\n\t} else {\n\t\treturn unsafeByteOfat(aBytesOop, ix);\n\t}\n}\n\n\n/*\tNormalizes. */\n\nfunction digitSubLargewith(firstInteger, secondInteger) {\n\tvar smallerLen;\n\tvar larger;\n\tvar res;\n\tvar smaller;\n\tvar resLen;\n\tvar largerLen;\n\tvar firstNeg;\n\tvar firstLen;\n\tvar secondLen;\n\tvar neg;\n\n\tfirstNeg = CLASSOF(firstInteger) === interpreterProxy.classLargeNegativeInteger();\n\tfirstLen = BYTESIZEOF(firstInteger);\n\tsecondLen = BYTESIZEOF(secondInteger);\n\tif (firstLen === secondLen) {\n\t\twhile ((firstLen > 1) && (digitOfBytesat(firstInteger, firstLen) === digitOfBytesat(secondInteger, firstLen))) {\n\t\t\t--firstLen;\n\t\t}\n\t\tsecondLen = firstLen;\n\t}\n\tif ((firstLen < secondLen) || ((firstLen === secondLen) && (digitOfBytesat(firstInteger, firstLen) < digitOfBytesat(secondInteger, firstLen)))) {\n\t\tlarger = secondInteger;\n\t\tlargerLen = secondLen;\n\t\tsmaller = firstInteger;\n\t\tsmallerLen = firstLen;\n\t\tneg = firstNeg === false;\n\t} else {\n\t\tlarger = firstInteger;\n\t\tlargerLen = firstLen;\n\t\tsmaller = secondInteger;\n\t\tsmallerLen = secondLen;\n\t\tneg = firstNeg;\n\t}\n\tresLen = largerLen;\n\tres = interpreterProxy.instantiateClassindexableSize((neg\n\t? interpreterProxy.classLargeNegativeInteger()\n\t: interpreterProxy.classLargePositiveInteger()), resLen);\n;\n\tcDigitSublenwithleninto(smaller.bytes, smallerLen, larger.bytes, largerLen, res.bytes);\n\treturn (neg\n\t\t? normalizeNegative(res)\n\t\t: normalizePositive(res));\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\nfunction highBitOfBytes(aBytesOop) {\n\treturn cDigitHighBitlen(aBytesOop.bytes, BYTESIZEOF(aBytesOop));\n}\n\nfunction isNormalized(anInteger) {\n\tvar ix;\n\tvar len;\n\tvar sLen;\n\tvar minVal;\n\tvar maxVal;\n\n\tif (typeof anInteger === \"number\") {\n\t\treturn true;\n\t}\n\tlen = digitLength(anInteger);\n\tif (len === 0) {\n\t\treturn false;\n\t}\n\tif (unsafeByteOfat(anInteger, len) === 0) {\n\t\treturn false;\n\t}\n\n\t/* maximal digitLength of aSmallInteger */\n\n\tsLen = 4;\n\tif (len > sLen) {\n\t\treturn true;\n\t}\n\tif (len < sLen) {\n\t\treturn false;\n\t}\n\tif (CLASSOF(anInteger) === interpreterProxy.classLargePositiveInteger()) {\n\n\t\t/* SmallInteger maxVal */\n\t\t/* all bytes of maxVal but the highest one are just FF's */\n\n\t\tmaxVal = 1073741823;\n\t\treturn unsafeByteOfat(anInteger, sLen) > cDigitOfCSIat(maxVal, sLen);\n\t} else {\n\n\t\t/* SmallInteger minVal */\n\t\t/* all bytes of minVal but the highest one are just 00's */\n\n\t\tminVal = -1073741824;\n\t\tif (unsafeByteOfat(anInteger, sLen) < cDigitOfCSIat(minVal, sLen)) {\n\t\t\treturn false;\n\t\t} else {\n\n\t\t\t/* if just one digit differs, then anInteger < minval (the corresponding digit byte is greater!)\n\t\t\t\t\t\tand therefore a LargeNegativeInteger */\n\n\t\t\tfor (ix = 1; ix <= sLen; ix++) {\n\t\t\t\tif (unsafeByteOfat(anInteger, ix) !== cDigitOfCSIat(minVal, ix)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction msg(s) {\n\tconsole.log(moduleName + \": \" + s);\n}\n\n\n/*\tCheck for leading zeroes and return shortened copy if so. */\n\nfunction normalize(aLargeInteger) {\n\t// missing DebugCode;\n\tif (CLASSOF(aLargeInteger) === interpreterProxy.classLargePositiveInteger()) {\n\t\treturn normalizePositive(aLargeInteger);\n\t} else {\n\t\treturn normalizeNegative(aLargeInteger);\n\t}\n}\n\n\n/*\tCheck for leading zeroes and return shortened copy if so. */\n/*\tFirst establish len = significant length. */\n\nfunction normalizeNegative(aLargeNegativeInteger) {\n\tvar i;\n\tvar len;\n\tvar sLen;\n\tvar minVal;\n\tvar oldLen;\n\tvar val;\n\n\tlen = (oldLen = digitLength(aLargeNegativeInteger));\n\twhile ((len !== 0) && (unsafeByteOfat(aLargeNegativeInteger, len) === 0)) {\n\t\t--len;\n\t}\n\tif (len === 0) {\n\t\treturn 0;\n\t}\n\n\t/* SmallInteger minVal digitLength */\n\n\tsLen = 4;\n\tif (len <= sLen) {\n\n\t\t/* SmallInteger minVal */\n\n\t\tminVal = -1073741824;\n\t\tif ((len < sLen) || (digitOfBytesat(aLargeNegativeInteger, sLen) < cDigitOfCSIat(minVal, sLen))) {\n\n\t\t\t/* If high digit less, then can be small */\n\n\t\t\tval = 0;\n\t\t\tfor (i = len; i >= 1; i += -1) {\n\t\t\t\tval = (val * 256) - unsafeByteOfat(aLargeNegativeInteger, i);\n\t\t\t}\n\t\t\treturn val;\n\t\t}\n\t\tfor (i = 1; i <= sLen; i++) {\n\n\t\t\t/* If all digits same, then = minVal (sr: minVal digits 1 to 3 are \n\t\t\t\t 0) */\n\n\t\t\tif (digitOfBytesat(aLargeNegativeInteger, i) !== cDigitOfCSIat(minVal, i)) {\n\n\t\t\t\t/* Not so; return self shortened */\n\n\t\t\t\tif (len < oldLen) {\n\n\t\t\t\t\t/* ^ self growto: len */\n\n\t\t\t\t\treturn bytesgrowTo(aLargeNegativeInteger, len);\n\t\t\t\t} else {\n\t\t\t\t\treturn aLargeNegativeInteger;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn minVal;\n\t}\n\tif (len < oldLen) {\n\n\t\t/* ^ self growto: len */\n\n\t\treturn bytesgrowTo(aLargeNegativeInteger, len);\n\t} else {\n\t\treturn aLargeNegativeInteger;\n\t}\n}\n\n\n/*\tCheck for leading zeroes and return shortened copy if so. */\n/*\tFirst establish len = significant length. */\n\nfunction normalizePositive(aLargePositiveInteger) {\n\tvar i;\n\tvar len;\n\tvar sLen;\n\tvar val;\n\tvar oldLen;\n\n\tlen = (oldLen = digitLength(aLargePositiveInteger));\n\twhile ((len !== 0) && (unsafeByteOfat(aLargePositiveInteger, len) === 0)) {\n\t\t--len;\n\t}\n\tif (len === 0) {\n\t\treturn 0;\n\t}\n\n\t/* SmallInteger maxVal digitLength. */\n\n\tsLen = 4;\n\tif ((len <= sLen) && (digitOfBytesat(aLargePositiveInteger, sLen) <= cDigitOfCSIat(1073741823, sLen))) {\n\n\t\t/* If so, return its SmallInt value */\n\n\t\tval = 0;\n\t\tfor (i = len; i >= 1; i += -1) {\n\t\t\tval = (val * 256) + unsafeByteOfat(aLargePositiveInteger, i);\n\t\t}\n\t\treturn val;\n\t}\n\tif (len < oldLen) {\n\n\t\t/* ^ self growto: len */\n\n\t\treturn bytesgrowTo(aLargePositiveInteger, len);\n\t} else {\n\t\treturn aLargePositiveInteger;\n\t}\n}\n\nfunction primAnyBitFromTo() {\n\tvar integer;\n\tvar large;\n\tvar from;\n\tvar to;\n\tvar _return_value;\n\n\tfrom = interpreterProxy.stackIntegerValue(1);\n\tto = interpreterProxy.stackIntegerValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(2)));\n\tinteger = interpreterProxy.stackValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof integer === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\tlarge = createLargeFromSmallInteger(integer);\n\t} else {\n\t\tlarge = integer;\n\t}\n\t_return_value = (anyBitOfBytesfromto(large, from, to)? interpreterProxy.trueObject() : interpreterProxy.falseObject());\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(3, _return_value);\n\treturn null;\n}\n\n\n/*\tConverts a SmallInteger into a - non normalized! - LargeInteger; \n\t aLargeInteger will be returned unchanged. */\n/*\tDo not check for forced fail, because we need this conversion to test the \n\tplugin in ST during forced fail, too. */\n\nfunction primAsLargeInteger() {\n\tvar anInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tanInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof anInteger === \"number\") {\n\t\t_return_value = createLargeFromSmallInteger(anInteger);\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\treturn null;\n\t} else {\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(2, anInteger);\n\t\treturn null;\n\t}\n}\n\n\n/*\tIf calling this primitive fails, then C module does not exist. Do not check for forced fail, because we want to know if module exists during forced fail, too. */\n\nfunction primCheckIfCModuleExists() {\n\tvar _return_value;\n\n\t_return_value = (true? interpreterProxy.trueObject() : interpreterProxy.falseObject());\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(1, _return_value);\n\treturn null;\n}\n\nfunction _primDigitBitShift() {\n\tvar rShift;\n\tvar aLarge;\n\tvar anInteger;\n\tvar shiftCount;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tanInteger = interpreterProxy.stackValue(1);\n\tshiftCount = interpreterProxy.stackIntegerValue(0);\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof anInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\taLarge = createLargeFromSmallInteger(anInteger);\n\t} else {\n\t\taLarge = anInteger;\n\t}\n\tif (shiftCount >= 0) {\n\t\t_return_value = digitLshift(aLarge, shiftCount);\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\treturn null;\n\t} else {\n\t\trShift = 0 - shiftCount;\n\t\t_return_value = normalize(digitRshiftlookfirst(aLarge, rShift, BYTESIZEOF(aLarge)));\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\treturn null;\n\t}\n}\n\nfunction primDigitAdd() {\n\tvar firstLarge;\n\tvar firstInteger;\n\tvar secondLarge;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tfirstLarge = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstLarge = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tsecondLarge = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tsecondLarge = secondInteger;\n\t}\n\t_return_value = digitAddLargewith(firstLarge, secondLarge);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(2, _return_value);\n\treturn null;\n}\n\nfunction primDigitAddWith() {\n\tvar firstLarge;\n\tvar secondLarge;\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tfirstLarge = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstLarge = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tsecondLarge = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tsecondLarge = secondInteger;\n\t}\n\t_return_value = digitAddLargewith(firstLarge, secondLarge);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(3, _return_value);\n\treturn null;\n}\n\n\n/*\tBit logic here is only implemented for positive integers or Zero; if rec \n\tor arg is negative, it fails. */\n\nfunction primDigitBitAnd() {\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\t_return_value = digitBitLogicwithopIndex(firstInteger, secondInteger, andOpIndex);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(2, _return_value);\n\treturn null;\n}\n\n\n/*\tBit logic here is only implemented for positive integers or Zero; if any arg is negative, it fails. */\n\nfunction primDigitBitLogicWithOp() {\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar opIndex;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(2)));\n\tfirstInteger = interpreterProxy.stackValue(2);\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tsecondInteger = interpreterProxy.stackValue(1);\n\topIndex = interpreterProxy.stackIntegerValue(0);\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\t_return_value = digitBitLogicwithopIndex(firstInteger, secondInteger, opIndex);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(4, _return_value);\n\treturn null;\n}\n\n\n/*\tBit logic here is only implemented for positive integers or Zero; if rec \n\tor arg is negative, it fails. */\n\nfunction primDigitBitOr() {\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\t_return_value = digitBitLogicwithopIndex(firstInteger, secondInteger, orOpIndex);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(2, _return_value);\n\treturn null;\n}\n\nfunction primDigitBitShift() {\n\tvar aLarge;\n\tvar rShift;\n\tvar anInteger;\n\tvar shiftCount;\n\tvar _return_value;\n\n\tshiftCount = interpreterProxy.stackIntegerValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tanInteger = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof anInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\taLarge = createLargeFromSmallInteger(anInteger);\n\t} else {\n\t\taLarge = anInteger;\n\t}\n\tif (shiftCount >= 0) {\n\t\t_return_value = digitLshift(aLarge, shiftCount);\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\treturn null;\n\t} else {\n\t\trShift = 0 - shiftCount;\n\t\t_return_value = normalize(digitRshiftlookfirst(aLarge, rShift, BYTESIZEOF(aLarge)));\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\treturn null;\n\t}\n}\n\nfunction primDigitBitShiftMagnitude() {\n\tvar aLarge;\n\tvar rShift;\n\tvar anInteger;\n\tvar shiftCount;\n\tvar _return_value;\n\n\tshiftCount = interpreterProxy.stackIntegerValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tanInteger = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof anInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\taLarge = createLargeFromSmallInteger(anInteger);\n\t} else {\n\t\taLarge = anInteger;\n\t}\n\tif (shiftCount >= 0) {\n\t\t_return_value = digitLshift(aLarge, shiftCount);\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\treturn null;\n\t} else {\n\t\trShift = 0 - shiftCount;\n\t\t_return_value = normalize(digitRshiftlookfirst(aLarge, rShift, BYTESIZEOF(aLarge)));\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\treturn null;\n\t}\n}\n\n\n/*\tBit logic here is only implemented for positive integers or Zero; if rec \n\tor arg is negative, it fails. */\n\nfunction primDigitBitXor() {\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\t_return_value = digitBitLogicwithopIndex(firstInteger, secondInteger, xorOpIndex);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(2, _return_value);\n\treturn null;\n}\n\nfunction primDigitCompare() {\n\tvar firstVal;\n\tvar firstInteger;\n\tvar secondVal;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* first */\n\n\t\tif (typeof secondInteger === \"number\") {\n\n\t\t\t/* second */\n\n\t\t\tif (((firstVal = firstInteger)) > ((secondVal = secondInteger))) {\n\t\t\t\t_return_value = 1;\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\tif (firstVal < secondVal) {\n\t\t\t\t\t_return_value = -1;\n\t\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\t\t\t\treturn null;\n\t\t\t\t} else {\n\t\t\t\t\t_return_value = 0;\n\t\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\n\t\t\t/* SECOND */\n\n\t\t\t_return_value = -1;\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\t\treturn null;\n\t\t}\n\t} else {\n\n\t\t/* FIRST */\n\n\t\tif (typeof secondInteger === \"number\") {\n\n\t\t\t/* second */\n\n\t\t\t_return_value = 1;\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\t\treturn null;\n\t\t} else {\n\n\t\t\t/* SECOND */\n\n\t\t\t_return_value = digitCompareLargewith(firstInteger, secondInteger);\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tinterpreterProxy.popthenPush(2, _return_value);\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\nfunction primDigitCompareWith() {\n\tvar firstVal;\n\tvar secondVal;\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* first */\n\n\t\tif (typeof secondInteger === \"number\") {\n\n\t\t\t/* second */\n\n\t\t\tif (((firstVal = firstInteger)) > ((secondVal = secondInteger))) {\n\t\t\t\t_return_value = 1;\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\tif (firstVal < secondVal) {\n\t\t\t\t\t_return_value = -1;\n\t\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\t\t\t\treturn null;\n\t\t\t\t} else {\n\t\t\t\t\t_return_value = 0;\n\t\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\n\t\t\t/* SECOND */\n\n\t\t\t_return_value = -1;\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\t\treturn null;\n\t\t}\n\t} else {\n\n\t\t/* FIRST */\n\n\t\tif (typeof secondInteger === \"number\") {\n\n\t\t\t/* second */\n\n\t\t\t_return_value = 1;\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\t\treturn null;\n\t\t} else {\n\n\t\t\t/* SECOND */\n\n\t\t\t_return_value = digitCompareLargewith(firstInteger, secondInteger);\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tinterpreterProxy.popthenPush(3, _return_value);\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n\n/*\tAnswer the result of dividing firstInteger by secondInteger. \n\tFail if parameters are not integers, not normalized or secondInteger is \n\tzero. */\n\nfunction primDigitDivNegative() {\n\tvar firstAsLargeInteger;\n\tvar firstInteger;\n\tvar secondAsLargeInteger;\n\tvar secondInteger;\n\tvar neg;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tsecondInteger = interpreterProxy.stackValue(1);\n\tneg = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(0));\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(2)));\n\tfirstInteger = interpreterProxy.stackValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!isNormalized(firstInteger)) {\n\t\t// missing DebugCode;\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (!isNormalized(secondInteger)) {\n\t\t// missing DebugCode;\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert to LargeInteger */\n\n\t\t\tfirstAsLargeInteger = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstAsLargeInteger = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\n\t\t/* check for zerodivide and convert to LargeInteger */\n\n\t\tif (secondInteger === 0) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\t\tsecondAsLargeInteger = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tsecondAsLargeInteger = secondInteger;\n\t}\n\t_return_value = digitDivLargewithnegative(firstAsLargeInteger, secondAsLargeInteger, neg);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(3, _return_value);\n\treturn null;\n}\n\n\n/*\tAnswer the result of dividing firstInteger by secondInteger.\n\tFail if parameters are not integers or secondInteger is zero. */\n\nfunction primDigitDivWithNegative() {\n\tvar firstAsLargeInteger;\n\tvar secondAsLargeInteger;\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar neg;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(2)));\n\tfirstInteger = interpreterProxy.stackValue(2);\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tsecondInteger = interpreterProxy.stackValue(1);\n\tneg = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(0));\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert to LargeInteger */\n\n\t\t\tfirstAsLargeInteger = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstAsLargeInteger = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\n\t\t/* check for zerodivide and convert to LargeInteger */\n\n\t\tif (secondInteger === 0) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\t\tsecondAsLargeInteger = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tsecondAsLargeInteger = secondInteger;\n\t}\n\t_return_value = digitDivLargewithnegative(firstAsLargeInteger, secondAsLargeInteger, neg);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(4, _return_value);\n\treturn null;\n}\n\nfunction primDigitMultiplyNegative() {\n\tvar firstLarge;\n\tvar firstInteger;\n\tvar secondLarge;\n\tvar secondInteger;\n\tvar neg;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tsecondInteger = interpreterProxy.stackValue(1);\n\tneg = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(0));\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(2)));\n\tfirstInteger = interpreterProxy.stackValue(2);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tfirstLarge = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstLarge = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tsecondLarge = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tsecondLarge = secondInteger;\n\t}\n\t_return_value = digitMultiplyLargewithnegative(firstLarge, secondLarge, neg);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(3, _return_value);\n\treturn null;\n}\n\nfunction primDigitMultiplyWithNegative() {\n\tvar firstLarge;\n\tvar secondLarge;\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar neg;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(2)));\n\tfirstInteger = interpreterProxy.stackValue(2);\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tsecondInteger = interpreterProxy.stackValue(1);\n\tneg = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(0));\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tfirstLarge = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstLarge = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tsecondLarge = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tsecondLarge = secondInteger;\n\t}\n\t_return_value = digitMultiplyLargewithnegative(firstLarge, secondLarge, neg);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(4, _return_value);\n\treturn null;\n}\n\nfunction primDigitSubtract() {\n\tvar firstLarge;\n\tvar firstInteger;\n\tvar secondLarge;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tfirstLarge = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstLarge = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tsecondLarge = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tsecondLarge = secondInteger;\n\t}\n\t_return_value = digitSubLargewith(firstLarge, secondLarge);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(2, _return_value);\n\treturn null;\n}\n\nfunction primDigitSubtractWith() {\n\tvar firstLarge;\n\tvar secondLarge;\n\tvar firstInteger;\n\tvar secondInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tfirstInteger = interpreterProxy.stackValue(1);\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tsecondInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tfirstLarge = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstLarge = firstInteger;\n\t}\n\tif (typeof secondInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tsecondLarge = createLargeFromSmallInteger(secondInteger);\n;\n\t} else {\n\t\tsecondLarge = secondInteger;\n\t}\n\t_return_value = digitSubLargewith(firstLarge, secondLarge);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(3, _return_value);\n\treturn null;\n}\n\n\n/*\tIf calling this primitive fails, then C module does not exist. */\n\nfunction primGetModuleName() {\n\tvar strPtr;\n\tvar strLen;\n\tvar i;\n\tvar strOop;\n\n\t// missing DebugCode;\n\tstrLen = strlen(getModuleName());\n\tstrOop = interpreterProxy.instantiateClassindexableSize(interpreterProxy.classString(), strLen);\n\tstrPtr = strOop.bytes;\n\tfor (i = 0; i <= (strLen - 1); i++) {\n\t\tstrPtr[i] = getModuleName()[i];\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(1, strOop);\n\treturn null;\n}\n\nfunction primMontgomeryTimesModulo() {\n\tvar firstLarge;\n\tvar secondLarge;\n\tvar firstInteger;\n\tvar thirdLarge;\n\tvar secondOperandInteger;\n\tvar thirdModuloInteger;\n\tvar smallInverseInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(2)));\n\tsecondOperandInteger = interpreterProxy.stackValue(2);\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(1)));\n\tthirdModuloInteger = interpreterProxy.stackValue(1);\n\tsmallInverseInteger = interpreterProxy.stackIntegerValue(0);\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(3)));\n\tfirstInteger = interpreterProxy.stackValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof firstInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tfirstLarge = createLargeFromSmallInteger(firstInteger);\n;\n\t} else {\n\t\tfirstLarge = firstInteger;\n\t}\n\tif (typeof secondOperandInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tsecondLarge = createLargeFromSmallInteger(secondOperandInteger);\n;\n\t} else {\n\t\tsecondLarge = secondOperandInteger;\n\t}\n\tif (typeof thirdModuloInteger === \"number\") {\n\n\t\t/* convert it to a not normalized LargeInteger */\n\n\t\t\tthirdLarge = createLargeFromSmallInteger(thirdModuloInteger);\n;\n\t} else {\n\t\tthirdLarge = thirdModuloInteger;\n\t}\n\t_return_value = digitMontgomerytimesmodulomInvModB(firstLarge, secondLarge, thirdLarge, smallInverseInteger);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(4, _return_value);\n\treturn null;\n}\n\n\n/*\tParameter specification #(Integer) doesn't convert! */\n\nfunction primNormalize() {\n\tvar anInteger;\n\tvar _return_value;\n\n\tinterpreterProxy.success(interpreterProxy.isKindOfInteger(interpreterProxy.stackValue(0)));\n\tanInteger = interpreterProxy.stackValue(0);\n\t// missing DebugCode;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (typeof anInteger === \"number\") {\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(2, anInteger);\n\t\treturn null;\n\t}\n\t_return_value = normalize(anInteger);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(2, _return_value);\n\treturn null;\n}\n\nfunction primNormalizeNegative() {\n\tvar rcvr;\n\tvar _return_value;\n\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.stackValue(0).sqClass === interpreterProxy.classLargeNegativeInteger());\n\trcvr = interpreterProxy.stackValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\t_return_value = normalizeNegative(rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(1, _return_value);\n\treturn null;\n}\n\nfunction primNormalizePositive() {\n\tvar rcvr;\n\tvar _return_value;\n\n\t// missing DebugCode;\n\tinterpreterProxy.success(interpreterProxy.stackValue(0).sqClass === interpreterProxy.classLargePositiveInteger());\n\trcvr = interpreterProxy.stackValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\t_return_value = normalizePositive(rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(1, _return_value);\n\treturn null;\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\n/*\tArgument bytesOop must not be aSmallInteger! */\n\nfunction unsafeByteOfat(bytesOop, ix) {\n\tvar pointer;\n\n\treturn ((pointer = bytesOop.bytes))[ix - 1];\n}\n\n\nSqueak.registerExternalModule(\"LargeIntegers\", {\n\tprimDigitAddWith: primDigitAddWith,\n\tprimDigitBitShiftMagnitude: primDigitBitShiftMagnitude,\n\tprimGetModuleName: primGetModuleName,\n\tprimDigitBitLogicWithOp: primDigitBitLogicWithOp,\n\tprimCheckIfCModuleExists: primCheckIfCModuleExists,\n\tprimDigitCompare: primDigitCompare,\n\tprimDigitMultiplyNegative: primDigitMultiplyNegative,\n\tprimDigitBitShift: primDigitBitShift,\n\tprimNormalizePositive: primNormalizePositive,\n\tprimDigitSubtractWith: primDigitSubtractWith,\n\t_primDigitBitShift: _primDigitBitShift,\n\tprimDigitMultiplyWithNegative: primDigitMultiplyWithNegative,\n\tprimDigitSubtract: primDigitSubtract,\n\tprimDigitDivNegative: primDigitDivNegative,\n\tprimNormalizeNegative: primNormalizeNegative,\n\tprimDigitBitOr: primDigitBitOr,\n\tprimMontgomeryTimesModulo: primMontgomeryTimesModulo,\n\tprimDigitBitAnd: primDigitBitAnd,\n\tprimDigitDivWithNegative: primDigitDivWithNegative,\n\tsetInterpreter: setInterpreter,\n\tprimNormalize: primNormalize,\n\tprimDigitBitXor: primDigitBitXor,\n\tprimDigitCompareWith: primDigitCompareWith,\n\tprimDigitAdd: primDigitAdd,\n\tgetModuleName: getModuleName,\n\tprimAsLargeInteger: primAsLargeInteger,\n\tprimAnyBitFromTo: primAnyBitFromTo,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:21 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tMatrix2x3Plugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.Matrix2x3Plugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar m23ArgX = 0;\nvar m23ArgY = 0;\nvar m23ResultX = 0;\nvar m23ResultY = 0;\nvar moduleName = \"Matrix2x3Plugin 3 November 2014 (e)\";\n\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\n\n/*\tLoad the argument matrix */\n\nfunction loadArgumentMatrix(matrix) {\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!(interpreterProxy.isWords(matrix) && (SIZEOF(matrix) === 6))) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn null;\n\t}\n\treturn matrix.wordsAsFloat32Array();\n}\n\n\n/*\tLoad the argument point into m23ArgX and m23ArgY */\n\nfunction loadArgumentPoint(point) {\n\tvar isInt;\n\tvar oop;\n\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (CLASSOF(point) !== interpreterProxy.classPoint()) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\toop = interpreterProxy.fetchPointerofObject(0, point);\n\tisInt = typeof oop === \"number\";\n\tif (!(isInt || (oop.isFloat))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (isInt) {\n\t\tm23ArgX = oop;\n\t} else {\n\t\tm23ArgX = interpreterProxy.floatValueOf(oop);\n\t}\n\toop = interpreterProxy.fetchPointerofObject(1, point);\n\tisInt = typeof oop === \"number\";\n\tif (!(isInt || (oop.isFloat))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (isInt) {\n\t\tm23ArgY = oop;\n\t} else {\n\t\tm23ArgY = interpreterProxy.floatValueOf(oop);\n\t}\n}\n\n\n/*\tMultiply matrix m1 with m2 and store the result into m3. */\n\nfunction matrix2x3ComposeMatrixwithinto(m1, m2, m3) {\n\tvar a11;\n\tvar a12;\n\tvar a13;\n\tvar a21;\n\tvar a22;\n\tvar a23;\n\n\ta11 = (m1[0] * m2[0]) + (m1[1] * m2[3]);\n\ta12 = (m1[0] * m2[1]) + (m1[1] * m2[4]);\n\ta13 = ((m1[0] * m2[2]) + (m1[1] * m2[5])) + m1[2];\n\ta21 = (m1[3] * m2[0]) + (m1[4] * m2[3]);\n\ta22 = (m1[3] * m2[1]) + (m1[4] * m2[4]);\n\ta23 = ((m1[3] * m2[2]) + (m1[4] * m2[5])) + m1[5];\n\tm3[0] = a11;\n\tm3[1] = a12;\n\tm3[2] = a13;\n\tm3[3] = a21;\n\tm3[4] = a22;\n\tm3[5] = a23;\n}\n\n\n/*\tInvert the pre-loaded argument point by the given matrix */\n\nfunction matrix2x3InvertPoint(m) {\n\tvar det;\n\tvar detX;\n\tvar detY;\n\tvar x;\n\tvar y;\n\n\tx = m23ArgX - m[2];\n\ty = m23ArgY - m[5];\n\tdet = (m[0] * m[4]) - (m[1] * m[3]);\n\tif (det === 0.0) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdet = 1.0 / det;\n\tdetX = (x * m[4]) - (m[1] * y);\n\tdetY = (m[0] * y) - (x * m[3]);\n\tm23ResultX = detX * det;\n\tm23ResultY = detY * det;\n}\n\n\n/*\tTransform the pre-loaded argument point by the given matrix */\n\nfunction matrix2x3TransformPoint(m) {\n\tm23ResultX = ((m23ArgX * m[0]) + (m23ArgY * m[1])) + m[2];\n\tm23ResultY = ((m23ArgX * m[3]) + (m23ArgY * m[4])) + m[5];\n}\n\nfunction okayIntValue(value) {\n\treturn (value >= -1073741824) && (m23ResultX <= 1073741823);\n}\n\nfunction primitiveComposeMatrix() {\n\tvar m1;\n\tvar m2;\n\tvar m3;\n\tvar result;\n\n\t;\n\tm3 = loadArgumentMatrix((result = interpreterProxy.stackObjectValue(0)));\n\tm2 = loadArgumentMatrix(interpreterProxy.stackObjectValue(1));\n\tm1 = loadArgumentMatrix(interpreterProxy.stackObjectValue(2));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tmatrix2x3ComposeMatrixwithinto(m1, m2, m3);\n\tinterpreterProxy.popthenPush(3, result);\n}\n\nfunction primitiveInvertPoint() {\n\tvar matrix;\n\n\tloadArgumentPoint(interpreterProxy.stackObjectValue(0));\n\tmatrix = loadArgumentMatrix(interpreterProxy.stackObjectValue(1));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tmatrix2x3InvertPoint(matrix);\n\tif (!interpreterProxy.failed()) {\n\t\troundAndStoreResultPoint(2);\n\t}\n}\n\nfunction primitiveInvertRectInto() {\n\tvar cornerX;\n\tvar cornerY;\n\tvar dstOop;\n\tvar matrix;\n\tvar maxX;\n\tvar maxY;\n\tvar minX;\n\tvar minY;\n\tvar originX;\n\tvar originY;\n\tvar srcOop;\n\n\tdstOop = interpreterProxy.stackObjectValue(0);\n\tsrcOop = interpreterProxy.stackObjectValue(1);\n\tmatrix = loadArgumentMatrix(interpreterProxy.stackObjectValue(2));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (CLASSOF(srcOop) !== CLASSOF(dstOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!interpreterProxy.isPointers(srcOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (SIZEOF(srcOop) !== 2) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tloadArgumentPoint(interpreterProxy.fetchPointerofObject(0, srcOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\toriginX = m23ArgX;\n\toriginY = m23ArgY;\n\tmatrix2x3InvertPoint(matrix);\n\tminX = (maxX = m23ResultX);\n\n\t/* Load bottom-right point */\n\n\tminY = (maxY = m23ResultY);\n\tloadArgumentPoint(interpreterProxy.fetchPointerofObject(1, srcOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tcornerX = m23ArgX;\n\tcornerY = m23ArgY;\n\tmatrix2x3InvertPoint(matrix);\n\tminX = Math.min(minX, m23ResultX);\n\tmaxX = Math.max(maxX, m23ResultX);\n\tminY = Math.min(minY, m23ResultY);\n\n\t/* Load top-right point */\n\n\tmaxY = Math.max(maxY, m23ResultY);\n\tm23ArgX = cornerX;\n\tm23ArgY = originY;\n\tmatrix2x3InvertPoint(matrix);\n\tminX = Math.min(minX, m23ResultX);\n\tmaxX = Math.max(maxX, m23ResultX);\n\tminY = Math.min(minY, m23ResultY);\n\n\t/* Load bottom-left point */\n\n\tmaxY = Math.max(maxY, m23ResultY);\n\tm23ArgX = originX;\n\tm23ArgY = cornerY;\n\tmatrix2x3InvertPoint(matrix);\n\tminX = Math.min(minX, m23ResultX);\n\tmaxX = Math.max(maxX, m23ResultX);\n\tminY = Math.min(minY, m23ResultY);\n\tmaxY = Math.max(maxY, m23ResultY);\n\tif (!interpreterProxy.failed()) {\n\t\tdstOop = roundAndStoreResultRectx0y0x1y1(dstOop, minX, minY, maxX, maxY);\n\t}\n\tif (!interpreterProxy.failed()) {\n\t\tinterpreterProxy.popthenPush(3, dstOop);\n\t}\n}\n\nfunction primitiveIsIdentity() {\n\tvar matrix;\n\n\tmatrix = loadArgumentMatrix(interpreterProxy.stackObjectValue(0));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(1);\n\tinterpreterProxy.pushBool((((((matrix[0] === 1.0) && (matrix[1] === 0.0)) && (matrix[2] === 0.0)) && (matrix[3] === 0.0)) && (matrix[4] === 1.0)) && (matrix[5] === 0.0));\n}\n\nfunction primitiveIsPureTranslation() {\n\tvar matrix;\n\n\tmatrix = loadArgumentMatrix(interpreterProxy.stackObjectValue(0));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(1);\n\tinterpreterProxy.pushBool((((matrix[0] === 1.0) && (matrix[1] === 0.0)) && (matrix[3] === 0.0)) && (matrix[4] === 1.0));\n}\n\nfunction primitiveTransformPoint() {\n\tvar matrix;\n\n\tloadArgumentPoint(interpreterProxy.stackObjectValue(0));\n\tmatrix = loadArgumentMatrix(interpreterProxy.stackObjectValue(1));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tmatrix2x3TransformPoint(matrix);\n\troundAndStoreResultPoint(2);\n}\n\nfunction primitiveTransformRectInto() {\n\tvar cornerX;\n\tvar cornerY;\n\tvar dstOop;\n\tvar matrix;\n\tvar maxX;\n\tvar maxY;\n\tvar minX;\n\tvar minY;\n\tvar originX;\n\tvar originY;\n\tvar srcOop;\n\n\tdstOop = interpreterProxy.stackObjectValue(0);\n\tsrcOop = interpreterProxy.stackObjectValue(1);\n\tmatrix = loadArgumentMatrix(interpreterProxy.stackObjectValue(2));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (CLASSOF(srcOop) !== CLASSOF(dstOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!interpreterProxy.isPointers(srcOop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (SIZEOF(srcOop) !== 2) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tloadArgumentPoint(interpreterProxy.fetchPointerofObject(0, srcOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\toriginX = m23ArgX;\n\toriginY = m23ArgY;\n\tmatrix2x3TransformPoint(matrix);\n\tminX = (maxX = m23ResultX);\n\n\t/* Load bottom-right point */\n\n\tminY = (maxY = m23ResultY);\n\tloadArgumentPoint(interpreterProxy.fetchPointerofObject(1, srcOop));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tcornerX = m23ArgX;\n\tcornerY = m23ArgY;\n\tmatrix2x3TransformPoint(matrix);\n\tminX = Math.min(minX, m23ResultX);\n\tmaxX = Math.max(maxX, m23ResultX);\n\tminY = Math.min(minY, m23ResultY);\n\n\t/* Load top-right point */\n\n\tmaxY = Math.max(maxY, m23ResultY);\n\tm23ArgX = cornerX;\n\tm23ArgY = originY;\n\tmatrix2x3TransformPoint(matrix);\n\tminX = Math.min(minX, m23ResultX);\n\tmaxX = Math.max(maxX, m23ResultX);\n\tminY = Math.min(minY, m23ResultY);\n\n\t/* Load bottom-left point */\n\n\tmaxY = Math.max(maxY, m23ResultY);\n\tm23ArgX = originX;\n\tm23ArgY = cornerY;\n\tmatrix2x3TransformPoint(matrix);\n\tminX = Math.min(minX, m23ResultX);\n\tmaxX = Math.max(maxX, m23ResultX);\n\tminY = Math.min(minY, m23ResultY);\n\tmaxY = Math.max(maxY, m23ResultY);\n\tdstOop = roundAndStoreResultRectx0y0x1y1(dstOop, minX, minY, maxX, maxY);\n\tif (!interpreterProxy.failed()) {\n\t\tinterpreterProxy.popthenPush(3, dstOop);\n\t}\n}\n\n\n/*\tStore the result of a previous operation.\n\tFail if we cannot represent the result as SmallInteger */\n\nfunction roundAndStoreResultPoint(nItemsToPop) {\n\tm23ResultX += 0.5;\n\tm23ResultY += 0.5;\n\tif (!okayIntValue(m23ResultX)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!okayIntValue(m23ResultY)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tinterpreterProxy.popthenPush(nItemsToPop, interpreterProxy.makePointwithxValueyValue((m23ResultX|0), (m23ResultY|0)));\n}\n\n\n/*\tCheck, round and store the result of a rectangle operation */\n\nfunction roundAndStoreResultRectx0y0x1y1(dstOop, x0, y0, x1, y1) {\n\tvar cornerOop;\n\tvar maxX;\n\tvar maxY;\n\tvar minX;\n\tvar minY;\n\tvar originOop;\n\tvar rectOop;\n\n\tminX = x0 + 0.5;\n\tif (!okayIntValue(minX)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tmaxX = x1 + 0.5;\n\tif (!okayIntValue(maxX)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tminY = y0 + 0.5;\n\tif (!okayIntValue(minY)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tmaxY = y1 + 0.5;\n\tif (!okayIntValue(maxY)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tinterpreterProxy.pushRemappableOop(dstOop);\n\toriginOop = interpreterProxy.makePointwithxValueyValue((minX|0), (minY|0));\n\tinterpreterProxy.pushRemappableOop(originOop);\n\tcornerOop = interpreterProxy.makePointwithxValueyValue((maxX|0), (maxY|0));\n\toriginOop = interpreterProxy.popRemappableOop();\n\trectOop = interpreterProxy.popRemappableOop();\n\tinterpreterProxy.storePointerofObjectwithValue(0, rectOop, originOop);\n\tinterpreterProxy.storePointerofObjectwithValue(1, rectOop, cornerOop);\n\treturn rectOop;\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\nSqueak.registerExternalModule(\"Matrix2x3Plugin\", {\n\tprimitiveInvertPoint: primitiveInvertPoint,\n\tprimitiveInvertRectInto: primitiveInvertRectInto,\n\tprimitiveIsIdentity: primitiveIsIdentity,\n\tprimitiveComposeMatrix: primitiveComposeMatrix,\n\tsetInterpreter: setInterpreter,\n\tprimitiveTransformRectInto: primitiveTransformRectInto,\n\tprimitiveIsPureTranslation: primitiveIsPureTranslation,\n\tgetModuleName: getModuleName,\n\tprimitiveTransformPoint: primitiveTransformPoint,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:23 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tMiscPrimitivePlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.MiscPrimitivePlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar moduleName = \"MiscPrimitivePlugin 3 November 2014 (e)\";\n\n\n\n/*\tCopy the integer anInt into byteArray ba at index i, and return the next index */\n\nfunction encodeBytesOfinat(anInt, ba, i) {\n\tvar j;\n\n\tfor (j = 0; j <= 3; j++) {\n\t\tba[(i + j) - 1] = ((SHR(anInt, ((3 - j) * 8))) & 255);\n\t}\n\treturn i + 4;\n}\n\n\n/*\tEncode the integer anInt in byteArray ba at index i, and return the next index.\n\tThe encoding is as follows...\n\t\t0-223\t0-223\n\t\t224-254\t(0-30)*256 + next byte (0-7935)\n\t\t255\t\tnext 4 bytes */\n\nfunction encodeIntinat(anInt, ba, i) {\n\tif (anInt <= 223) {\n\t\tba[i - 1] = anInt;\n\t\treturn i + 1;\n\t}\n\tif (anInt <= 7935) {\n\t\tba[i - 1] = ((anInt >> 8) + 224);\n\t\tba[i] = (MOD(anInt, 256));\n\t\treturn i + 2;\n\t}\n\tba[i - 1] = 255;\n\treturn encodeBytesOfinat(anInt, ba, i + 1);\n}\n\n\n/*\tNote: This is coded so that plugins can be run from Squeak. */\n\nfunction getInterpreter() {\n\treturn interpreterProxy;\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\nfunction msg(s) {\n\tconsole.log(moduleName + \": \" + s);\n}\n\n\n/*\tReturn 1, 2 or 3, if string1 is <, =, or > string2, with the collating order of characters given by the order array. */\n\nfunction primitiveCompareString() {\n\tvar rcvr;\n\tvar string1;\n\tvar string2;\n\tvar order;\n\tvar c1;\n\tvar c2;\n\tvar i;\n\tvar len1;\n\tvar len2;\n\n\trcvr = interpreterProxy.stackValue(3);\n\tstring1 = interpreterProxy.stackBytes(2);\n\tstring2 = interpreterProxy.stackBytes(1);\n\torder = interpreterProxy.stackBytes(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlen1 = string1.length;\n\tlen2 = string2.length;\n\tfor (i = 1; i <= Math.min(len1, len2); i++) {\n\t\tc1 = order[string1[i - 1]];\n\t\tc2 = order[string2[i - 1]];\n\t\tif (c1 !== c2) {\n\t\t\tif (c1 < c2) {\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tinterpreterProxy.popthenPush(4, 1);\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tinterpreterProxy.popthenPush(4, 3);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\tif (len1 === len2) {\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(4, 2);\n\t\treturn null;\n\t}\n\tif (len1 < len2) {\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(4, 1);\n\t\treturn null;\n\t} else {\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(4, 3);\n\t\treturn null;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(3);\n}\n\n\n/*\tStore a run-coded compression of the receiver into the byteArray ba,\n\tand return the last index stored into. ba is assumed to be large enough.\n\tThe encoding is as follows...\n\t\tS {N D}*.\n\t\tS is the size of the original bitmap, followed by run-coded pairs.\n\t\tN is a run-length * 4 + data code.\n\t\tD, the data, depends on the data code...\n\t\t\t0\tskip N words, D is absent\n\t\t\t1\tN words with all 4 bytes = D (1 byte)\n\t\t\t2\tN words all = D (4 bytes)\n\t\t\t3\tN words follow in D (4N bytes)\n\t\tS and N are encoded as follows...\n\t\t\t0-223\t0-223\n\t\t\t224-254\t(0-30)*256 + next byte (0-7935)\n\t\t\t255\t\tnext 4 bytes */\n\nfunction primitiveCompressToByteArray() {\n\tvar rcvr;\n\tvar bm;\n\tvar ba;\n\tvar eqBytes;\n\tvar i;\n\tvar j;\n\tvar k;\n\tvar lowByte;\n\tvar m;\n\tvar size;\n\tvar word;\n\n\trcvr = interpreterProxy.stackValue(2);\n\tbm = interpreterProxy.stackInt32Array(1);\n\tba = interpreterProxy.stackBytes(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tsize = bm.length;\n\ti = encodeIntinat(size, ba, 1);\n\tk = 1;\n\twhile (k <= size) {\n\t\tword = bm[k - 1];\n\t\tlowByte = word & 255;\n\t\teqBytes = (((word >>> 8) & 255) === lowByte) && ((((word >>> 16) & 255) === lowByte) && (((word >>> 24) & 255) === lowByte));\n\t\tj = k;\n\t\twhile ((j < size) && (word === bm[j])) {\n\t\t\t++j;\n\t\t}\n\t\tif (j > k) {\n\n\t\t\t/* We have two or more = words, ending at j */\n\n\t\t\tif (eqBytes) {\n\n\t\t\t\t/* Actually words of = bytes */\n\n\t\t\t\ti = encodeIntinat((((j - k) + 1) * 4) + 1, ba, i);\n\t\t\t\tba[i - 1] = lowByte;\n\t\t\t\t++i;\n\t\t\t} else {\n\t\t\t\ti = encodeIntinat((((j - k) + 1) * 4) + 2, ba, i);\n\t\t\t\ti = encodeBytesOfinat(word, ba, i);\n\t\t\t}\n\t\t\tk = j + 1;\n\t\t} else {\n\n\t\t\t/* Check for word of 4 = bytes */\n\n\t\t\tif (eqBytes) {\n\n\t\t\t\t/* Note 1 word of 4 = bytes */\n\n\t\t\t\ti = encodeIntinat((1 * 4) + 1, ba, i);\n\t\t\t\tba[i - 1] = lowByte;\n\t\t\t\t++i;\n\t\t\t\t++k;\n\t\t\t} else {\n\n\t\t\t\t/* Finally, check for junk */\n\n\t\t\t\twhile ((j < size) && (bm[j - 1] !== bm[j])) {\n\t\t\t\t\t++j;\n\t\t\t\t}\n\t\t\t\tif (j === size) {\n\t\t\t\t\t++j;\n\t\t\t\t}\n\t\t\t\ti = encodeIntinat(((j - k) * 4) + 3, ba, i);\n\t\t\t\tfor (m = k; m <= (j - 1); m++) {\n\t\t\t\t\ti = encodeBytesOfinat(bm[m - 1], ba, i);\n\t\t\t\t}\n\t\t\t\tk = j;\n\t\t\t}\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(3, i - 1);\n\treturn null;\n}\n\n\n/*\tCopy the contents of the given array of signed 8-bit samples into the given array of 16-bit signed samples. */\n\nfunction primitiveConvert8BitSigned() {\n\tvar rcvr;\n\tvar aByteArray;\n\tvar aSoundBuffer;\n\tvar i;\n\tvar n;\n\tvar s;\n\n\trcvr = interpreterProxy.stackValue(2);\n\taByteArray = interpreterProxy.stackBytes(1);\n\taSoundBuffer = interpreterProxy.stackUint16Array(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tn = aByteArray.length;\n\tfor (i = 1; i <= n; i++) {\n\t\ts = aByteArray[i - 1];\n\t\tif (s > 127) {\n\t\t\taSoundBuffer[i - 1] = ((s - 256) << 8);\n\t\t} else {\n\t\t\taSoundBuffer[i - 1] = (s << 8);\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(2);\n}\n\n\n/*\tDecompress the body of a byteArray encoded by compressToByteArray (qv)...\n\tThe format is simply a sequence of run-coded pairs, {N D}*.\n\t\tN is a run-length * 4 + data code.\n\t\tD, the data, depends on the data code...\n\t\t\t0\tskip N words, D is absent\n\t\t\t\t(could be used to skip from one raster line to the next)\n\t\t\t1\tN words with all 4 bytes = D (1 byte)\n\t\t\t2\tN words all = D (4 bytes)\n\t\t\t3\tN words follow in D (4N bytes)\n\t\tS and N are encoded as follows (see decodeIntFrom:)...\n\t\t\t0-223\t0-223\n\t\t\t224-254\t(0-30)*256 + next byte (0-7935)\n\t\t\t255\t\tnext 4 bytes */\n/*\tNOTE: If fed with garbage, this routine could read past the end of ba, but it should fail before writing past the ned of bm. */\n\nfunction primitiveDecompressFromByteArray() {\n\tvar rcvr;\n\tvar bm;\n\tvar ba;\n\tvar index;\n\tvar anInt;\n\tvar code;\n\tvar data;\n\tvar end;\n\tvar i;\n\tvar j;\n\tvar k;\n\tvar m;\n\tvar n;\n\tvar pastEnd;\n\n\trcvr = interpreterProxy.stackValue(3);\n\tbm = interpreterProxy.stackInt32Array(2);\n\tba = interpreterProxy.stackBytes(1);\n\tindex = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\n\t/* byteArray read index */\n\n\ti = index;\n\tend = ba.length;\n\n\t/* bitmap write index */\n\n\tk = 1;\n\tpastEnd = bm.length + 1;\n\twhile (i <= end) {\n\n\t\t/* Decode next run start N */\n\n\t\tanInt = ba[i - 1];\n\t\t++i;\n\t\tif (!(anInt <= 223)) {\n\t\t\tif (anInt <= 254) {\n\t\t\t\tanInt = ((anInt - 224) * 256) + ba[i - 1];\n\t\t\t\t++i;\n\t\t\t} else {\n\t\t\t\tanInt = 0;\n\t\t\t\tfor (j = 1; j <= 4; j++) {\n\t\t\t\t\tanInt = (anInt << 8) + ba[i - 1];\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tn = anInt >>> 2;\n\t\tif ((k + n) > pastEnd) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn null;\n\t\t}\n\t\tcode = anInt & 3;\n\t\tif (code === 0) {\n\n\t\t\t/* skip */\n\n\t\t\tnull;\n\t\t}\n\t\tif (code === 1) {\n\n\t\t\t/* n consecutive words of 4 bytes = the following byte */\n\n\t\t\tdata = ba[i - 1];\n\t\t\t++i;\n\t\t\tdata = data | (data << 8);\n\t\t\tdata = data | (data << 16);\n\t\t\tfor (j = 1; j <= n; j++) {\n\t\t\t\tbm[k - 1] = data;\n\t\t\t\t++k;\n\t\t\t}\n\t\t}\n\t\tif (code === 2) {\n\n\t\t\t/* n consecutive words = 4 following bytes */\n\n\t\t\tdata = 0;\n\t\t\tfor (j = 1; j <= 4; j++) {\n\t\t\t\tdata = (data << 8) | ba[i - 1];\n\t\t\t\t++i;\n\t\t\t}\n\t\t\tfor (j = 1; j <= n; j++) {\n\t\t\t\tbm[k - 1] = data;\n\t\t\t\t++k;\n\t\t\t}\n\t\t}\n\t\tif (code === 3) {\n\n\t\t\t/* n consecutive words from the data... */\n\n\t\t\tfor (m = 1; m <= n; m++) {\n\t\t\t\tdata = 0;\n\t\t\t\tfor (j = 1; j <= 4; j++) {\n\t\t\t\t\tdata = (data << 8) | ba[i - 1];\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t\tbm[k - 1] = data;\n\t\t\t\t++k;\n\t\t\t}\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(3);\n}\n\nfunction primitiveFindFirstInString() {\n\tvar rcvr;\n\tvar aString;\n\tvar inclusionMap;\n\tvar start;\n\tvar i;\n\tvar stringSize;\n\n\trcvr = interpreterProxy.stackValue(3);\n\taString = interpreterProxy.stackBytes(2);\n\tinclusionMap = interpreterProxy.stackBytes(1);\n\tstart = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (inclusionMap.length !== 256) {\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(4, 0);\n\t\treturn null;\n\t}\n\ti = start;\n\tstringSize = aString.length;\n\twhile ((i <= stringSize) && (inclusionMap[aString[i - 1]] === 0)) {\n\t\t++i;\n\t}\n\tif (i > stringSize) {\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(4, 0);\n\t\treturn null;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(4, i);\n\treturn null;\n}\n\n\n/*\tAnswer the index in the string body at which the substring key first occurs, at or beyond start. The match is determined using matchTable, which can be used to effect, eg, case-insensitive matches. If no match is found, zero will be returned.\n\n\tThe algorithm below is not optimum -- it is intended to be translated to C which will go so fast that it wont matter. */\n\nfunction primitiveFindSubstring() {\n\tvar rcvr;\n\tvar key;\n\tvar body;\n\tvar start;\n\tvar matchTable;\n\tvar index;\n\tvar startIndex;\n\n\trcvr = interpreterProxy.stackValue(4);\n\tkey = interpreterProxy.stackBytes(3);\n\tbody = interpreterProxy.stackBytes(2);\n\tstart = interpreterProxy.stackIntegerValue(1);\n\tmatchTable = interpreterProxy.stackBytes(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (key.length === 0) {\n\t\tif (interpreterProxy.failed()) {\n\t\t\treturn null;\n\t\t}\n\t\tinterpreterProxy.popthenPush(5, 0);\n\t\treturn null;\n\t}\n\tfor (startIndex = start; startIndex <= ((body.length - key.length) + 1); startIndex++) {\n\t\tindex = 1;\n\t\twhile (matchTable[body[((startIndex + index) - 1) - 1]] === matchTable[key[index - 1]]) {\n\t\t\tif (index === key.length) {\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tinterpreterProxy.popthenPush(5, startIndex);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t++index;\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(5, 0);\n\treturn null;\n}\n\nfunction primitiveIndexOfAsciiInString() {\n\tvar rcvr;\n\tvar anInteger;\n\tvar aString;\n\tvar start;\n\tvar pos;\n\tvar stringSize;\n\n\trcvr = interpreterProxy.stackValue(3);\n\tanInteger = interpreterProxy.stackIntegerValue(2);\n\taString = interpreterProxy.stackBytes(1);\n\tstart = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tstringSize = aString.length;\n\tfor (pos = start; pos <= stringSize; pos++) {\n\t\tif (aString[pos - 1] === anInteger) {\n\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tinterpreterProxy.popthenPush(4, pos);\n\t\t\treturn null;\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(4, 0);\n\treturn null;\n}\n\n\n/*\tAnswer the hash of a byte-indexed collection,\n\tusing speciesHash as the initial value.\n\tSee SmallInteger>>hashMultiply.\n\n\tThe primitive should be renamed at a\n\tsuitable point in the future */\n\nfunction primitiveStringHash() {\n\tvar rcvr;\n\tvar aByteArray;\n\tvar speciesHash;\n\tvar byteArraySize;\n\tvar hash;\n\tvar low;\n\tvar pos;\n\n\trcvr = interpreterProxy.stackValue(2);\n\taByteArray = interpreterProxy.stackBytes(1);\n\tspeciesHash = interpreterProxy.stackIntegerValue(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tbyteArraySize = aByteArray.length;\n\thash = speciesHash & 268435455;\n\tfor (pos = 1; pos <= byteArraySize; pos++) {\n\n\t\t/* Begin hashMultiply */\n\n\t\thash += aByteArray[pos - 1];\n\t\tlow = hash & 16383;\n\t\thash = ((9741 * low) + ((((9741 * (hash >>> 14)) + (101 * low)) & 16383) * 16384)) & 268435455;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.popthenPush(3, hash);\n\treturn null;\n}\n\n\n/*\ttranslate the characters in the string by the given table, in place */\n\nfunction primitiveTranslateStringWithTable() {\n\tvar rcvr;\n\tvar aString;\n\tvar start;\n\tvar stop;\n\tvar table;\n\tvar i;\n\n\trcvr = interpreterProxy.stackValue(4);\n\taString = interpreterProxy.stackBytes(3);\n\tstart = interpreterProxy.stackIntegerValue(2);\n\tstop = interpreterProxy.stackIntegerValue(1);\n\ttable = interpreterProxy.stackBytes(0);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (i = start; i <= stop; i++) {\n\t\taString[i - 1] = table[aString[i - 1]];\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.pop(4);\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\nSqueak.registerExternalModule(\"MiscPrimitivePlugin\", {\n\tprimitiveConvert8BitSigned: primitiveConvert8BitSigned,\n\tprimitiveCompareString: primitiveCompareString,\n\tprimitiveTranslateStringWithTable: primitiveTranslateStringWithTable,\n\tprimitiveStringHash: primitiveStringHash,\n\tprimitiveCompressToByteArray: primitiveCompressToByteArray,\n\tprimitiveFindSubstring: primitiveFindSubstring,\n\tprimitiveIndexOfAsciiInString: primitiveIndexOfAsciiInString,\n\tsetInterpreter: setInterpreter,\n\tprimitiveDecompressFromByteArray: primitiveDecompressFromByteArray,\n\tgetModuleName: getModuleName,\n\tprimitiveFindFirstInString: primitiveFindFirstInString,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:23 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tScratchPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.ScratchPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar moduleName = \"ScratchPlugin 3 November 2014 (e)\";\n\n\nfunction bitmapatputHsv(bitmap, i, hue, saturation, brightness) {\n\tvar hF;\n\tvar hI;\n\tvar outPix;\n\tvar p;\n\tvar q;\n\tvar t;\n\tvar v;\n\n\n\t/* integer part of hue (0..5) */\n\n\thI = DIV(hue, 60);\n\n\t/* fractional part ofhue */\n\n\thF = MOD(hue, 60);\n\tp = (1000 - saturation) * brightness;\n\tq = (1000 - (DIV((saturation * hF), 60))) * brightness;\n\tt = (1000 - (DIV((saturation * (60 - hF)), 60))) * brightness;\n\tv = DIV((brightness * 1000), 3922);\n\tp = DIV(p, 3922);\n\tq = DIV(q, 3922);\n\tt = DIV(t, 3922);\n\tif (0 === hI) {\n\t\toutPix = ((v << 16) + (t << 8)) + p;\n\t}\n\tif (1 === hI) {\n\t\toutPix = ((q << 16) + (v << 8)) + p;\n\t}\n\tif (2 === hI) {\n\t\toutPix = ((p << 16) + (v << 8)) + t;\n\t}\n\tif (3 === hI) {\n\t\toutPix = ((p << 16) + (q << 8)) + v;\n\t}\n\tif (4 === hI) {\n\t\toutPix = ((t << 16) + (p << 8)) + v;\n\t}\n\tif (5 === hI) {\n\t\toutPix = ((v << 16) + (p << 8)) + q;\n\t}\n\tif (outPix === 0) {\n\t\toutPix = 1;\n\t}\n\tbitmap[i] = outPix;\n\treturn 0;\n}\n\n\n/*\tReturn an unsigned int pointer to the first indexable word of oop, which must be a words object. */\n\nfunction checkedFloatPtrOf(oop) {\n\tinterpreterProxy.success(interpreterProxy.isWordsOrBytes(oop));\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\treturn oop.wordsAsFloat64Array();\n}\n\n\n/*\tReturn an unsigned int pointer to the first indexable word of oop, which must be a words object. */\n\nfunction checkedUnsignedIntPtrOf(oop) {\n\tinterpreterProxy.success(interpreterProxy.isWords(oop));\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\treturn oop.words;\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\n\n/*\tAnswer the hue, an angle between 0 and 360. */\n\nfunction hueFromRGBminmax(r, g, b, min, max) {\n\tvar result;\n\tvar span;\n\n\tspan = max - min;\n\tif (span === 0) {\n\t\treturn 0;\n\t}\n\tif (r === max) {\n\t\tresult = DIV((60 * (g - b)), span);\n\t} else {\n\t\tif (g === max) {\n\t\t\tresult = 120 + (DIV((60 * (b - r)), span));\n\t\t} else {\n\t\t\tresult = 240 + (DIV((60 * (r - g)), span));\n\t\t}\n\t}\n\tif (result < 0) {\n\t\treturn result + 360;\n\t}\n\treturn result;\n}\n\n\n/*\tAnswer the interpolated pixel value between the given two pixel values. If either pixel is zero (transparent) answer the other pixel. If both pixels are transparent, answer transparent. The fraction is between 0 and 1023, out of a total range of 1024. */\n\nfunction interpolateandfrac(pix1, pix2, frac2) {\n\tvar b;\n\tvar frac1;\n\tvar g;\n\tvar r;\n\tvar result;\n\n\tif (pix1 === 0) {\n\t\treturn pix2;\n\t}\n\tif (pix2 === 0) {\n\t\treturn pix1;\n\t}\n\tfrac1 = 1024 - frac2;\n\tr = ((frac1 * ((pix1 >>> 16) & 255)) + (frac2 * ((pix2 >>> 16) & 255))) >> 10;\n\tg = ((frac1 * ((pix1 >>> 8) & 255)) + (frac2 * ((pix2 >>> 8) & 255))) >> 10;\n\tb = ((frac1 * (pix1 & 255)) + (frac2 * (pix2 & 255))) >> 10;\n\tresult = ((r << 16) + (g << 8)) + b;\n\tif (result === 0) {\n\t\tresult = 1;\n\t}\n\treturn result;\n}\n\n\n/*\tAnswer the interpolated pixel value from the given bitmap at the given point. The x and y coordinates are fixed-point integers with 10 bits of fraction (i.e. they were multiplied by 1024, then truncated). If the given point is right on an edge, answer the nearest edge pixel value. If it is entirely outside of the image, answer 0 (transparent). */\n\nfunction interpolatedFromxywidthheight(bitmap, xFixed, yFixed, w, h) {\n\tvar bottomPix;\n\tvar index;\n\tvar topPix;\n\tvar x;\n\tvar xFrac;\n\tvar y;\n\tvar yFrac;\n\n\tx = xFixed >>> 10;\n\tif ((x < -1) || (x >= w)) {\n\t\treturn 0;\n\t}\n\ty = yFixed >>> 10;\n\tif ((y < -1) || (y >= h)) {\n\t\treturn 0;\n\t}\n\txFrac = xFixed & 1023;\n\tif (x === -1) {\n\t\tx = 0;\n\t\txFrac = 0;\n\t}\n\tif (x === (w - 1)) {\n\t\txFrac = 0;\n\t}\n\tyFrac = yFixed & 1023;\n\tif (y === -1) {\n\t\ty = 0;\n\t\tyFrac = 0;\n\t}\n\tif (y === (h - 1)) {\n\t\tyFrac = 0;\n\t}\n\n\t/* for squeak: + 1 */\n\n\tindex = (y * w) + x;\n\ttopPix = bitmap[index] & 16777215;\n\tif (xFrac > 0) {\n\t\ttopPix = interpolateandfrac(topPix, bitmap[index + 1] & 16777215, xFrac);\n\t}\n\tif (yFrac === 0) {\n\t\treturn topPix;\n\t}\n\n\t/* for squeak: + 1 */\n\n\tindex = ((y + 1) * w) + x;\n\tbottomPix = bitmap[index] & 16777215;\n\tif (xFrac > 0) {\n\t\tbottomPix = interpolateandfrac(bottomPix, bitmap[index + 1] & 16777215, xFrac);\n\t}\n\treturn interpolateandfrac(topPix, bottomPix, yFrac);\n}\n\nfunction primitiveBlur() {\n\tvar bTotal;\n\tvar dX;\n\tvar dY;\n\tvar gTotal;\n\tvar height;\n\tvar in_;\n\tvar inOop;\n\tvar n;\n\tvar out;\n\tvar outOop;\n\tvar outPix;\n\tvar pix;\n\tvar rTotal;\n\tvar sz;\n\tvar width;\n\tvar x;\n\tvar y;\n\n\tinOop = interpreterProxy.stackValue(2);\n\toutOop = interpreterProxy.stackValue(1);\n\twidth = interpreterProxy.stackIntegerValue(0);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tsz = SIZEOF(inOop);\n\tinterpreterProxy.success(SIZEOF(outOop) === sz);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\theight = DIV(sz, width);\n\tfor (y = 1; y <= (height - 2); y++) {\n\t\tfor (x = 1; x <= (width - 2); x++) {\n\t\t\tn = (rTotal = (gTotal = (bTotal = 0)));\n\t\t\tfor (dY = -1; dY <= 1; dY++) {\n\t\t\t\tfor (dX = -1; dX <= 1; dX++) {\n\n\t\t\t\t\t/* add 1 when testing in Squeak */\n\n\t\t\t\t\tpix = in_[((y + dY) * width) + (x + dX)] & 16777215;\n\t\t\t\t\tif (pix !== 0) {\n\n\t\t\t\t\t\t/* skip transparent pixels */\n\n\t\t\t\t\t\trTotal += (pix >>> 16) & 255;\n\t\t\t\t\t\tgTotal += (pix >>> 8) & 255;\n\t\t\t\t\t\tbTotal += pix & 255;\n\t\t\t\t\t\t++n;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (n === 0) {\n\t\t\t\toutPix = 0;\n\t\t\t} else {\n\t\t\t\toutPix = (((DIV(rTotal, n)) << 16) + ((DIV(gTotal, n)) << 8)) + (DIV(bTotal, n));\n\t\t\t}\n\t\t\tout[(y * width) + x] = outPix;\n\t\t}\n\t}\n\tinterpreterProxy.pop(3);\n\treturn 0;\n}\n\nfunction primitiveBrightnessShift() {\n\tvar b;\n\tvar brightness;\n\tvar g;\n\tvar hue;\n\tvar i;\n\tvar in_;\n\tvar inOop;\n\tvar max;\n\tvar min;\n\tvar out;\n\tvar outOop;\n\tvar pix;\n\tvar r;\n\tvar saturation;\n\tvar shift;\n\tvar sz;\n\n\tinOop = interpreterProxy.stackValue(2);\n\toutOop = interpreterProxy.stackValue(1);\n\tshift = interpreterProxy.stackIntegerValue(0);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tsz = SIZEOF(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tinterpreterProxy.success(SIZEOF(outOop) === sz);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (i = 0; i <= (sz - 1); i++) {\n\t\tpix = in_[i] & 16777215;\n\t\tif (pix !== 0) {\n\n\t\t\t/* skip pixel values of 0 (transparent) */\n\n\t\t\tr = (pix >>> 16) & 255;\n\t\t\tg = (pix >>> 8) & 255;\n\n\t\t\t/* find min and max color components */\n\n\t\t\tb = pix & 255;\n\t\t\tmax = (min = r);\n\t\t\tif (g > max) {\n\t\t\t\tmax = g;\n\t\t\t}\n\t\t\tif (b > max) {\n\t\t\t\tmax = b;\n\t\t\t}\n\t\t\tif (g < min) {\n\t\t\t\tmin = g;\n\t\t\t}\n\t\t\tif (b < min) {\n\t\t\t\tmin = b;\n\t\t\t}\n\n\t\t\t/* find current saturation and brightness with range 0 to 1000 */\n\n\t\t\thue = hueFromRGBminmax(r, g, b, min, max);\n\t\t\tif (max === 0) {\n\t\t\t\tsaturation = 0;\n\t\t\t} else {\n\t\t\t\tsaturation = DIV(((max - min) * 1000), max);\n\t\t\t}\n\n\t\t\t/* compute new brigthness */\n\n\t\t\tbrightness = DIV((max * 1000), 255);\n\t\t\tbrightness += shift * 10;\n\t\t\tif (brightness > 1000) {\n\t\t\t\tbrightness = 1000;\n\t\t\t}\n\t\t\tif (brightness < 0) {\n\t\t\t\tbrightness = 0;\n\t\t\t}\n\t\t\tbitmapatputHsv(out, i, hue, saturation, brightness);\n\t\t}\n\t}\n\tinterpreterProxy.pop(3);\n\treturn 0;\n}\n\nfunction primitiveCondenseSound() {\n\tvar count;\n\tvar dst;\n\tvar dstOop;\n\tvar factor;\n\tvar i;\n\tvar j;\n\tvar max;\n\tvar src;\n\tvar srcOop;\n\tvar sz;\n\tvar v;\n\tvar _src = 0;\n\tvar _dst = 0;\n\n\tsrcOop = interpreterProxy.stackValue(2);\n\tdstOop = interpreterProxy.stackValue(1);\n\tfactor = interpreterProxy.stackIntegerValue(0);\n\tinterpreterProxy.success(interpreterProxy.isWords(srcOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(dstOop));\n\tcount = DIV((2 * SIZEOF(srcOop)), factor);\n\tsz = 2 * SIZEOF(dstOop);\n\tinterpreterProxy.success(sz >= count);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tsrc = srcOop.wordsAsInt16Array();\n\tdst = dstOop.wordsAsInt16Array();\n\tfor (i = 1; i <= count; i++) {\n\t\tmax = 0;\n\t\tfor (j = 1; j <= factor; j++) {\n\t\t\tv = src[_src++];\n\t\t\tif (v < 0) {\n\t\t\t\tv = 0 - v;\n\t\t\t}\n\t\t\tif (v > max) {\n\t\t\t\tmax = v;\n\t\t\t}\n\t\t}\n\t\tdst[_dst++] = max;\n\t}\n\tinterpreterProxy.pop(3);\n\treturn 0;\n}\n\nfunction primitiveDoubleSize() {\n\tvar baseIndex;\n\tvar dstX;\n\tvar dstY;\n\tvar i;\n\tvar in_;\n\tvar inH;\n\tvar inOop;\n\tvar inW;\n\tvar out;\n\tvar outH;\n\tvar outOop;\n\tvar outW;\n\tvar pix;\n\tvar x;\n\tvar y;\n\n\tinOop = interpreterProxy.stackValue(7);\n\tinW = interpreterProxy.stackIntegerValue(6);\n\tinH = interpreterProxy.stackIntegerValue(5);\n\toutOop = interpreterProxy.stackValue(4);\n\toutW = interpreterProxy.stackIntegerValue(3);\n\toutH = interpreterProxy.stackIntegerValue(2);\n\tdstX = interpreterProxy.stackIntegerValue(1);\n\tdstY = interpreterProxy.stackIntegerValue(0);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tinterpreterProxy.success((dstX + (2 * inW)) < outW);\n\tinterpreterProxy.success((dstY + (2 * inH)) < outH);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (y = 0; y <= (inH - 1); y++) {\n\t\tbaseIndex = ((dstY + (2 * y)) * outW) + dstX;\n\t\tfor (x = 0; x <= (inW - 1); x++) {\n\t\t\tpix = in_[x + (y * inW)];\n\t\t\ti = baseIndex + (2 * x);\n\t\t\tout[i] = pix;\n\t\t\tout[i + 1] = pix;\n\t\t\tout[i + outW] = pix;\n\t\t\tout[(i + outW) + 1] = pix;\n\t\t}\n\t}\n\tinterpreterProxy.pop(8);\n\treturn 0;\n}\n\nfunction primitiveExtractChannel() {\n\tvar dst;\n\tvar dstOop;\n\tvar i;\n\tvar rightFlag;\n\tvar src;\n\tvar srcOop;\n\tvar sz;\n\tvar _src = 0;\n\tvar _dst = 0;\n\n\tsrcOop = interpreterProxy.stackValue(2);\n\tdstOop = interpreterProxy.stackValue(1);\n\trightFlag = interpreterProxy.booleanValueOf(interpreterProxy.stackValue(0));\n\tinterpreterProxy.success(interpreterProxy.isWords(srcOop));\n\tinterpreterProxy.success(interpreterProxy.isWords(dstOop));\n\tsz = SIZEOF(srcOop);\n\tinterpreterProxy.success(SIZEOF(dstOop) >= (sz >> 1));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tsrc = srcOop.wordsAsInt16Array();\n\tdst = dstOop.wordsAsInt16Array();\n\tif (rightFlag) {\n\t\t_src++;\n\t}\n\tfor (i = 1; i <= sz; i++) {\n\t\tdst[_dst++] = src[_src]; _src += 2;\n\t}\n\tinterpreterProxy.pop(3);\n\treturn 0;\n}\n\nfunction primitiveFisheye() {\n\tvar ang;\n\tvar centerX;\n\tvar centerY;\n\tvar dx;\n\tvar dy;\n\tvar height;\n\tvar in_;\n\tvar inOop;\n\tvar out;\n\tvar outOop;\n\tvar pix;\n\tvar power;\n\tvar r;\n\tvar scaledPower;\n\tvar srcX;\n\tvar srcY;\n\tvar sz;\n\tvar width;\n\tvar x;\n\tvar y;\n\n\tinOop = interpreterProxy.stackValue(3);\n\toutOop = interpreterProxy.stackValue(2);\n\twidth = interpreterProxy.stackIntegerValue(1);\n\tpower = interpreterProxy.stackIntegerValue(0);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tsz = SIZEOF(inOop);\n\tinterpreterProxy.success(SIZEOF(outOop) === sz);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\theight = DIV(sz, width);\n\tcenterX = width >> 1;\n\tcenterY = height >> 1;\n\theight = DIV(sz, width);\n\tcenterX = width >> 1;\n\tcenterY = height >> 1;\n\tscaledPower = power / 100.0;\n\tfor (x = 0; x <= (width - 1); x++) {\n\t\tfor (y = 0; y <= (height - 1); y++) {\n\t\t\tdx = (x - centerX) / centerX;\n\t\t\tdy = (y - centerY) / centerY;\n\t\t\tr = Math.pow(Math.sqrt((dx * dx) + (dy * dy)),scaledPower);\n\t\t\tif (r <= 1.0) {\n\t\t\t\tang = Math.atan2(dy,dx);\n\t\t\t\tsrcX = ((1024 * (centerX + ((r * Math.cos(ang)) * centerX)))|0);\n\t\t\t\tsrcY = ((1024 * (centerY + ((r * Math.sin(ang)) * centerY)))|0);\n\t\t\t} else {\n\t\t\t\tsrcX = 1024 * x;\n\t\t\t\tsrcY = 1024 * y;\n\t\t\t}\n\t\t\tpix = interpolatedFromxywidthheight(in_, srcX, srcY, width, height);\n\t\t\tout[(y * width) + x] = pix;\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\treturn 0;\n}\n\nfunction primitiveHalfSizeAverage() {\n\tvar b;\n\tvar dstH;\n\tvar dstIndex;\n\tvar dstW;\n\tvar dstX;\n\tvar dstY;\n\tvar g;\n\tvar in_;\n\tvar inH;\n\tvar inW;\n\tvar out;\n\tvar outH;\n\tvar outW;\n\tvar pixel;\n\tvar r;\n\tvar srcIndex;\n\tvar srcX;\n\tvar srcY;\n\tvar x;\n\tvar y;\n\n\tin_ = checkedUnsignedIntPtrOf(interpreterProxy.stackValue(11));\n\tinW = interpreterProxy.stackIntegerValue(10);\n\tinH = interpreterProxy.stackIntegerValue(9);\n\tout = checkedUnsignedIntPtrOf(interpreterProxy.stackValue(8));\n\toutW = interpreterProxy.stackIntegerValue(7);\n\toutH = interpreterProxy.stackIntegerValue(6);\n\tsrcX = interpreterProxy.stackIntegerValue(5);\n\tsrcY = interpreterProxy.stackIntegerValue(4);\n\tdstX = interpreterProxy.stackIntegerValue(3);\n\tdstY = interpreterProxy.stackIntegerValue(2);\n\tdstW = interpreterProxy.stackIntegerValue(1);\n\tdstH = interpreterProxy.stackIntegerValue(0);\n\tinterpreterProxy.success((srcX >= 0) && (srcY >= 0));\n\tinterpreterProxy.success((srcX + (2 * dstW)) <= inW);\n\tinterpreterProxy.success((srcY + (2 * dstH)) <= inH);\n\tinterpreterProxy.success((dstX >= 0) && (dstY >= 0));\n\tinterpreterProxy.success((dstX + dstW) <= outW);\n\tinterpreterProxy.success((dstY + dstH) <= outH);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (y = 0; y <= (dstH - 1); y++) {\n\t\tsrcIndex = (inW * (srcY + (2 * y))) + srcX;\n\t\tdstIndex = (outW * (dstY + y)) + dstX;\n\t\tfor (x = 0; x <= (dstW - 1); x++) {\n\t\t\tpixel = in_[srcIndex];\n\t\t\tr = pixel & 16711680;\n\t\t\tg = pixel & 65280;\n\t\t\tb = pixel & 255;\n\t\t\tpixel = in_[srcIndex + 1];\n\t\t\tr += pixel & 16711680;\n\t\t\tg += pixel & 65280;\n\t\t\tb += pixel & 255;\n\t\t\tpixel = in_[srcIndex + inW];\n\t\t\tr += pixel & 16711680;\n\t\t\tg += pixel & 65280;\n\t\t\tb += pixel & 255;\n\t\t\tpixel = in_[(srcIndex + inW) + 1];\n\t\t\tr += pixel & 16711680;\n\t\t\tg += pixel & 65280;\n\n\t\t\t/* store combined RGB into target bitmap */\n\n\t\t\tb += pixel & 255;\n\t\t\tout[dstIndex] = (((r >>> 2) & 16711680) | (((g >>> 2) & 65280) | (b >>> 2)));\n\t\t\tsrcIndex += 2;\n\t\t\t++dstIndex;\n\t\t}\n\t}\n\tinterpreterProxy.pop(12);\n\treturn 0;\n}\n\nfunction primitiveHalfSizeDiagonal() {\n\tvar b;\n\tvar dstH;\n\tvar dstIndex;\n\tvar dstW;\n\tvar dstX;\n\tvar dstY;\n\tvar g;\n\tvar in_;\n\tvar inH;\n\tvar inW;\n\tvar out;\n\tvar outH;\n\tvar outW;\n\tvar p1;\n\tvar p2;\n\tvar r;\n\tvar srcIndex;\n\tvar srcX;\n\tvar srcY;\n\tvar x;\n\tvar y;\n\n\tin_ = checkedUnsignedIntPtrOf(interpreterProxy.stackValue(11));\n\tinW = interpreterProxy.stackIntegerValue(10);\n\tinH = interpreterProxy.stackIntegerValue(9);\n\tout = checkedUnsignedIntPtrOf(interpreterProxy.stackValue(8));\n\toutW = interpreterProxy.stackIntegerValue(7);\n\toutH = interpreterProxy.stackIntegerValue(6);\n\tsrcX = interpreterProxy.stackIntegerValue(5);\n\tsrcY = interpreterProxy.stackIntegerValue(4);\n\tdstX = interpreterProxy.stackIntegerValue(3);\n\tdstY = interpreterProxy.stackIntegerValue(2);\n\tdstW = interpreterProxy.stackIntegerValue(1);\n\tdstH = interpreterProxy.stackIntegerValue(0);\n\tinterpreterProxy.success((srcX >= 0) && (srcY >= 0));\n\tinterpreterProxy.success((srcX + (2 * dstW)) <= inW);\n\tinterpreterProxy.success((srcY + (2 * dstH)) <= inH);\n\tinterpreterProxy.success((dstX >= 0) && (dstY >= 0));\n\tinterpreterProxy.success((dstX + dstW) <= outW);\n\tinterpreterProxy.success((dstY + dstH) <= outH);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (y = 0; y <= (dstH - 1); y++) {\n\t\tsrcIndex = (inW * (srcY + (2 * y))) + srcX;\n\t\tdstIndex = (outW * (dstY + y)) + dstX;\n\t\tfor (x = 0; x <= (dstW - 1); x++) {\n\t\t\tp1 = in_[srcIndex];\n\t\t\tp2 = in_[(srcIndex + inW) + 1];\n\t\t\tr = (((p1 & 16711680) + (p2 & 16711680)) >>> 1) & 16711680;\n\t\t\tg = (((p1 & 65280) + (p2 & 65280)) >>> 1) & 65280;\n\n\t\t\t/* store combined RGB into target bitmap */\n\n\t\t\tb = ((p1 & 255) + (p2 & 255)) >>> 1;\n\t\t\tout[dstIndex] = (r | (g | b));\n\t\t\tsrcIndex += 2;\n\t\t\t++dstIndex;\n\t\t}\n\t}\n\tinterpreterProxy.pop(12);\n\treturn 0;\n}\n\nfunction primitiveHueShift() {\n\tvar b;\n\tvar brightness;\n\tvar g;\n\tvar hue;\n\tvar i;\n\tvar in_;\n\tvar inOop;\n\tvar max;\n\tvar min;\n\tvar out;\n\tvar outOop;\n\tvar pix;\n\tvar r;\n\tvar saturation;\n\tvar shift;\n\tvar sz;\n\n\tinOop = interpreterProxy.stackValue(2);\n\toutOop = interpreterProxy.stackValue(1);\n\tshift = interpreterProxy.stackIntegerValue(0);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tsz = SIZEOF(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tinterpreterProxy.success(SIZEOF(outOop) === sz);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (i = 0; i <= (sz - 1); i++) {\n\t\tpix = in_[i] & 16777215;\n\t\tif (pix !== 0) {\n\n\t\t\t/* skip pixel values of 0 (transparent) */\n\n\t\t\tr = (pix >>> 16) & 255;\n\t\t\tg = (pix >>> 8) & 255;\n\n\t\t\t/* find min and max color components */\n\n\t\t\tb = pix & 255;\n\t\t\tmax = (min = r);\n\t\t\tif (g > max) {\n\t\t\t\tmax = g;\n\t\t\t}\n\t\t\tif (b > max) {\n\t\t\t\tmax = b;\n\t\t\t}\n\t\t\tif (g < min) {\n\t\t\t\tmin = g;\n\t\t\t}\n\t\t\tif (b < min) {\n\t\t\t\tmin = b;\n\t\t\t}\n\t\t\tbrightness = DIV((max * 1000), 255);\n\t\t\tif (max === 0) {\n\t\t\t\tsaturation = 0;\n\t\t\t} else {\n\t\t\t\tsaturation = DIV(((max - min) * 1000), max);\n\t\t\t}\n\t\t\tif (brightness < 110) {\n\n\t\t\t\t/* force black to a very dark, saturated gray */\n\n\t\t\t\tbrightness = 110;\n\t\t\t\tsaturation = 1000;\n\t\t\t}\n\t\t\tif (saturation < 90) {\n\t\t\t\tsaturation = 90;\n\t\t\t}\n\t\t\tif ((brightness === 110) || (saturation === 90)) {\n\n\t\t\t\t/* tint all blacks and grays the same */\n\n\t\t\t\thue = 0;\n\t\t\t} else {\n\t\t\t\thue = hueFromRGBminmax(r, g, b, min, max);\n\t\t\t}\n\n\t\t\t/* compute new hue */\n\n\t\t\thue = MOD(((hue + shift) + 360000000), 360);\n\t\t\tbitmapatputHsv(out, i, hue, saturation, brightness);\n\t\t}\n\t}\n\tinterpreterProxy.pop(3);\n\treturn 0;\n}\n\nfunction primitiveInterpolate() {\n\tvar in_;\n\tvar inOop;\n\tvar result;\n\tvar sz;\n\tvar width;\n\tvar xFixed;\n\tvar yFixed;\n\n\tinOop = interpreterProxy.stackValue(3);\n\twidth = interpreterProxy.stackIntegerValue(2);\n\txFixed = interpreterProxy.stackIntegerValue(1);\n\tyFixed = interpreterProxy.stackIntegerValue(0);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tsz = SIZEOF(inOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tresult = interpolatedFromxywidthheight(in_, xFixed, yFixed, width, DIV(sz, width));\n\tinterpreterProxy.pop(5);\n\tinterpreterProxy.pushInteger(result);\n\treturn 0;\n}\n\nfunction primitiveSaturationShift() {\n\tvar b;\n\tvar brightness;\n\tvar g;\n\tvar hue;\n\tvar i;\n\tvar in_;\n\tvar inOop;\n\tvar max;\n\tvar min;\n\tvar out;\n\tvar outOop;\n\tvar pix;\n\tvar r;\n\tvar saturation;\n\tvar shift;\n\tvar sz;\n\n\tinOop = interpreterProxy.stackValue(2);\n\toutOop = interpreterProxy.stackValue(1);\n\tshift = interpreterProxy.stackIntegerValue(0);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tsz = SIZEOF(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tinterpreterProxy.success(SIZEOF(outOop) === sz);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (i = 0; i <= (sz - 1); i++) {\n\t\tpix = in_[i] & 16777215;\n\t\tif (!(pix < 2)) {\n\n\t\t\t/* skip pixel values of 0 (transparent) and 1 (black) */\n\n\t\t\tr = (pix >>> 16) & 255;\n\t\t\tg = (pix >>> 8) & 255;\n\n\t\t\t/* find min and max color components */\n\n\t\t\tb = pix & 255;\n\t\t\tmax = (min = r);\n\t\t\tif (g > max) {\n\t\t\t\tmax = g;\n\t\t\t}\n\t\t\tif (b > max) {\n\t\t\t\tmax = b;\n\t\t\t}\n\t\t\tif (g < min) {\n\t\t\t\tmin = g;\n\t\t\t}\n\t\t\tif (b < min) {\n\t\t\t\tmin = b;\n\t\t\t}\n\t\t\tbrightness = DIV((max * 1000), 255);\n\t\t\tif (max === 0) {\n\t\t\t\tsaturation = 0;\n\t\t\t} else {\n\t\t\t\tsaturation = DIV(((max - min) * 1000), max);\n\t\t\t}\n\t\t\tif (saturation > 0) {\n\n\t\t\t\t/* do nothing if pixel is unsaturated (gray) */\n\n\n\t\t\t\t/* compute new saturation */\n\n\t\t\t\thue = hueFromRGBminmax(r, g, b, min, max);\n\t\t\t\tsaturation += shift * 10;\n\t\t\t\tif (saturation > 1000) {\n\t\t\t\t\tsaturation = 1000;\n\t\t\t\t}\n\t\t\t\tif (saturation < 0) {\n\t\t\t\t\tsaturation = 0;\n\t\t\t\t}\n\t\t\t\tbitmapatputHsv(out, i, hue, saturation, brightness);\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(3);\n\treturn 0;\n}\n\n\n/*\tScale using bilinear interpolation. */\n\nfunction primitiveScale() {\n\tvar in_;\n\tvar inH;\n\tvar inOop;\n\tvar inW;\n\tvar inX;\n\tvar inY;\n\tvar out;\n\tvar outH;\n\tvar outOop;\n\tvar outPix;\n\tvar outW;\n\tvar outX;\n\tvar outY;\n\tvar p1;\n\tvar p2;\n\tvar p3;\n\tvar p4;\n\tvar t;\n\tvar tWeight;\n\tvar w1;\n\tvar w2;\n\tvar w3;\n\tvar w4;\n\tvar xIncr;\n\tvar yIncr;\n\n\tinOop = interpreterProxy.stackValue(5);\n\tinW = interpreterProxy.stackIntegerValue(4);\n\tinH = interpreterProxy.stackIntegerValue(3);\n\toutOop = interpreterProxy.stackValue(2);\n\toutW = interpreterProxy.stackIntegerValue(1);\n\toutH = interpreterProxy.stackIntegerValue(0);\n\tinterpreterProxy.success(SIZEOF(inOop) === (inW * inH));\n\tinterpreterProxy.success(SIZEOF(outOop) === (outW * outH));\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\n\t/* source x and y, scaled by 1024 */\n\n\tinX = (inY = 0);\n\n\t/* source x increment, scaled by 1024 */\n\n\txIncr = DIV((inW * 1024), outW);\n\n\t/* source y increment, scaled by 1024 */\n\n\tyIncr = DIV((inH * 1024), outH);\n\tfor (outY = 0; outY <= (outH - 1); outY++) {\n\t\tinX = 0;\n\t\tfor (outX = 0; outX <= (outW - 1); outX++) {\n\n\t\t\t/* compute weights, scaled by 2^20 */\n\n\t\t\tw1 = (1024 - (inX & 1023)) * (1024 - (inY & 1023));\n\t\t\tw2 = (inX & 1023) * (1024 - (inY & 1023));\n\t\t\tw3 = (1024 - (inX & 1023)) * (inY & 1023);\n\n\t\t\t/* get source pixels */\n\n\t\t\tw4 = (inX & 1023) * (inY & 1023);\n\t\t\tt = ((inY >>> 10) * inW) + (inX >>> 10);\n\t\t\tp1 = in_[t];\n\t\t\tif ((inX >>> 10) < (inW - 1)) {\n\t\t\t\tp2 = in_[t + 1];\n\t\t\t} else {\n\t\t\t\tp2 = p1;\n\t\t\t}\n\t\t\tif ((inY >>> 10) < (inH - 1)) {\n\t\t\t\tt += inW;\n\t\t\t}\n\t\t\tp3 = in_[t];\n\t\t\tif ((inX >>> 10) < (inW - 1)) {\n\t\t\t\tp4 = in_[t + 1];\n\t\t\t} else {\n\t\t\t\tp4 = p3;\n\t\t\t}\n\t\t\ttWeight = 0;\n\t\t\tif (p1 === 0) {\n\t\t\t\tp1 = p2;\n\t\t\t\ttWeight += w1;\n\t\t\t}\n\t\t\tif (p2 === 0) {\n\t\t\t\tp2 = p1;\n\t\t\t\ttWeight += w2;\n\t\t\t}\n\t\t\tif (p3 === 0) {\n\t\t\t\tp3 = p4;\n\t\t\t\ttWeight += w3;\n\t\t\t}\n\t\t\tif (p4 === 0) {\n\t\t\t\tp4 = p3;\n\t\t\t\ttWeight += w4;\n\t\t\t}\n\t\t\tif (p1 === 0) {\n\t\t\t\tp1 = p3;\n\t\t\t\tp2 = p4;\n\t\t\t}\n\t\t\tif (p3 === 0) {\n\t\t\t\tp3 = p1;\n\t\t\t\tp4 = p2;\n\t\t\t}\n\t\t\toutPix = 0;\n\t\t\tif (tWeight < 500000) {\n\n\t\t\t\t/* compute an (opaque) output pixel if less than 50% transparent */\n\n\t\t\t\tt = (((w1 * ((p1 >>> 16) & 255)) + (w2 * ((p2 >>> 16) & 255))) + (w3 * ((p3 >>> 16) & 255))) + (w4 * ((p4 >>> 16) & 255));\n\t\t\t\toutPix = ((t >>> 20) & 255) << 16;\n\t\t\t\tt = (((w1 * ((p1 >>> 8) & 255)) + (w2 * ((p2 >>> 8) & 255))) + (w3 * ((p3 >>> 8) & 255))) + (w4 * ((p4 >>> 8) & 255));\n\t\t\t\toutPix = outPix | (((t >>> 20) & 255) << 8);\n\t\t\t\tt = (((w1 * (p1 & 255)) + (w2 * (p2 & 255))) + (w3 * (p3 & 255))) + (w4 * (p4 & 255));\n\t\t\t\toutPix = outPix | ((t >>> 20) & 255);\n\t\t\t\tif (outPix === 0) {\n\t\t\t\t\toutPix = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tout[(outY * outW) + outX] = outPix;\n\t\t\tinX += xIncr;\n\t\t}\n\t\tinY += yIncr;\n\t}\n\tinterpreterProxy.pop(6);\n\treturn 0;\n}\n\nfunction primitiveWaterRipples1() {\n\tvar aArOop;\n\tvar aArray;\n\tvar allPix;\n\tvar bArOop;\n\tvar bArray;\n\tvar blops;\n\tvar d;\n\tvar dist;\n\tvar dx;\n\tvar dx2;\n\tvar dy;\n\tvar dy2;\n\tvar f;\n\tvar g;\n\tvar h;\n\tvar height;\n\tvar i;\n\tvar in_;\n\tvar inOop;\n\tvar j;\n\tvar newLoc;\n\tvar out;\n\tvar outOop;\n\tvar pix;\n\tvar power;\n\tvar q;\n\tvar ripply;\n\tvar t;\n\tvar t1;\n\tvar temp;\n\tvar val;\n\tvar val2;\n\tvar width;\n\tvar x;\n\tvar y;\n\n\tinOop = interpreterProxy.stackValue(5);\n\toutOop = interpreterProxy.stackValue(4);\n\twidth = interpreterProxy.stackIntegerValue(3);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tallPix = SIZEOF(inOop);\n\tripply = interpreterProxy.stackIntegerValue(2);\n\taArOop = interpreterProxy.stackValue(1);\n\tbArOop = interpreterProxy.stackValue(0);\n\taArray = checkedFloatPtrOf(aArOop);\n\tbArray = checkedFloatPtrOf(bArOop);\n\tinterpreterProxy.success(SIZEOF(outOop) === allPix);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\theight = DIV(allPix, width);\n\tt1 = Math.random();\n\tblops = (MOD(t1, ripply)) - 1;\n\tfor (t = 0; t <= ((blops / 2) - 1); t++) {\n\t\tt1 = Math.random();\n\t\tx = MOD(t1, width);\n\t\tt1 = Math.random();\n\t\ty = MOD(t1, height);\n\t\tt1 = Math.random();\n\t\tpower = MOD(t1, 8);\n\t\tfor (g = -4; g <= 4; g++) {\n\t\t\tfor (h = -4; h <= 4; h++) {\n\t\t\t\tdist = ((g * g) + (h * h));\n\t\t\t\tif ((dist < 25) && (dist > 0)) {\n\t\t\t\t\tdx = ((x + g)|0);\n\t\t\t\t\tdy = ((y + h)|0);\n\t\t\t\t\tif ((dx > 0) && ((dy > 0) && ((dy < height) && (dx < width)))) {\n\t\t\t\t\t\taArray[(dy * width) + dx] = (power * (1.0 - (dist / 25.0)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfor (f = 1; f <= (width - 2); f++) {\n\t\tfor (d = 1; d <= (height - 2); d++) {\n\t\t\tval = (d * width) + f;\n\t\t\taArray[val] = (((((((((bArray[val + 1] + bArray[val - 1]) + bArray[val + width]) + bArray[val - width]) + (bArray[(val - 1) - width] / 2)) + (bArray[(val - 1) + width] / 2)) + (bArray[(val + 1) - width] / 2)) + (bArray[(val + 1) + width] / 2)) / 4) - aArray[val]);\n\t\t\taArray[val] = (aArray[val] * 0.9);\n\t\t}\n\t}\n\tfor (q = 0; q <= (width * height); q++) {\n\t\ttemp = bArray[q];\n\t\tbArray[q] = aArray[q];\n\t\taArray[q] = temp;\n\t}\n\tfor (j = 0; j <= (height - 1); j++) {\n\t\tfor (i = 0; i <= (width - 1); i++) {\n\t\t\tif ((i > 1) && ((i < (width - 1)) && ((j > 1) && (j < (height - 1))))) {\n\t\t\t\tval2 = (j * width) + i;\n\t\t\t\tdx2 = (((aArray[val2] - aArray[val2 - 1]) + (aArray[val2 + 1] - aArray[val2])) * 64);\n\t\t\t\tdy2 = (((aArray[val2] - aArray[val2 - width]) + (aArray[val2 + width] - aArray[val2])) / 64);\n\t\t\t\tif (dx2 < 2) {\n\t\t\t\t\tdx2 = -2;\n\t\t\t\t}\n\t\t\t\tif (dx2 > 2) {\n\t\t\t\t\tdx2 = 2;\n\t\t\t\t}\n\t\t\t\tif (dy2 < 2) {\n\t\t\t\t\tdy2 = -2;\n\t\t\t\t}\n\t\t\t\tif (dy2 > 2) {\n\t\t\t\t\tdy2 = 2;\n\t\t\t\t}\n\t\t\t\tnewLoc = ((((j + dy2) * width) + (i + dx2))|0);\n\t\t\t\tif ((newLoc < (width * height)) && (newLoc >= 0)) {\n\t\t\t\t\tpix = in_[newLoc];\n\t\t\t\t} else {\n\t\t\t\t\tpix = in_[i + (j * width)];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpix = in_[i + (j * width)];\n\t\t\t}\n\t\t\tout[i + (j * width)] = pix;\n\t\t}\n\t}\n\tinterpreterProxy.pop(6);\n\treturn 0;\n}\n\nfunction primitiveWhirl() {\n\tvar ang;\n\tvar centerX;\n\tvar centerY;\n\tvar cosa;\n\tvar d;\n\tvar degrees;\n\tvar dx;\n\tvar dy;\n\tvar factor;\n\tvar height;\n\tvar in_;\n\tvar inOop;\n\tvar out;\n\tvar outOop;\n\tvar pix;\n\tvar radius;\n\tvar radiusSquared;\n\tvar scaleX;\n\tvar scaleY;\n\tvar sina;\n\tvar sz;\n\tvar whirlRadians;\n\tvar width;\n\tvar x;\n\tvar y;\n\n\tinOop = interpreterProxy.stackValue(3);\n\toutOop = interpreterProxy.stackValue(2);\n\twidth = interpreterProxy.stackIntegerValue(1);\n\tdegrees = interpreterProxy.stackIntegerValue(0);\n\tin_ = checkedUnsignedIntPtrOf(inOop);\n\tout = checkedUnsignedIntPtrOf(outOop);\n\tsz = SIZEOF(inOop);\n\tinterpreterProxy.success(SIZEOF(outOop) === sz);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\theight = DIV(sz, width);\n\tcenterX = width >> 1;\n\tcenterY = height >> 1;\n\tif (centerX < centerY) {\n\t\tradius = centerX;\n\t\tscaleX = centerY / centerX;\n\t\tscaleY = 1.0;\n\t} else {\n\t\tradius = centerY;\n\t\tscaleX = 1.0;\n\t\tif (centerY < centerX) {\n\t\t\tscaleY = centerX / centerY;\n\t\t} else {\n\t\t\tscaleY = 1.0;\n\t\t}\n\t}\n\twhirlRadians = (-3.141592653589793 * degrees) / 180.0;\n\tradiusSquared = (radius * radius);\n\tfor (x = 0; x <= (width - 1); x++) {\n\t\tfor (y = 0; y <= (height - 1); y++) {\n\t\t\tdx = scaleX * (x - centerX);\n\t\t\tdy = scaleY * (y - centerY);\n\t\t\td = (dx * dx) + (dy * dy);\n\t\t\tif (d < radiusSquared) {\n\n\t\t\t\t/* inside the whirl circle */\n\n\t\t\t\tfactor = 1.0 - (Math.sqrt(d) / radius);\n\t\t\t\tang = whirlRadians * (factor * factor);\n\t\t\t\tsina = Math.sin(ang);\n\t\t\t\tcosa = Math.cos(ang);\n\t\t\t\tpix = interpolatedFromxywidthheight(in_, ((1024.0 * ((((cosa * dx) - (sina * dy)) / scaleX) + centerX))|0), ((1024.0 * ((((sina * dx) + (cosa * dy)) / scaleY) + centerY))|0), width, height);\n\t\t\t\tout[(width * y) + x] = pix;\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(4);\n\treturn 0;\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\nSqueak.registerExternalModule(\"ScratchPlugin\", {\n\tprimitiveCondenseSound: primitiveCondenseSound,\n\tgetModuleName: getModuleName,\n\tprimitiveFisheye: primitiveFisheye,\n\tprimitiveWaterRipples1: primitiveWaterRipples1,\n\tprimitiveHalfSizeDiagonal: primitiveHalfSizeDiagonal,\n\tprimitiveScale: primitiveScale,\n\tprimitiveDoubleSize: primitiveDoubleSize,\n\tsetInterpreter: setInterpreter,\n\tprimitiveWhirl: primitiveWhirl,\n\tprimitiveBlur: primitiveBlur,\n\tprimitiveBrightnessShift: primitiveBrightnessShift,\n\tprimitiveHalfSizeAverage: primitiveHalfSizeAverage,\n\tprimitiveSaturationShift: primitiveSaturationShift,\n\tprimitiveHueShift: primitiveHueShift,\n\tprimitiveInterpolate: primitiveInterpolate,\n\tprimitiveExtractChannel: primitiveExtractChannel,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:26 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tSoundGenerationPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.SoundGenerationPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Constants ***/\nvar IncrementFractionBits = 16;\nvar LoopIndexFractionMask = 511;\nvar LoopIndexScaleFactor = 512;\nvar ScaleFactor = 32768;\nvar ScaledIndexOverflow = 536870912;\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar moduleName = \"SoundGenerationPlugin 3 November 2014 (e)\";\n\n\n\n/*\tNote: This is coded so that plugins can be run from Squeak. */\n\nfunction getInterpreter() {\n\treturn interpreterProxy;\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\nfunction msg(s) {\n\tconsole.log(moduleName + \": \" + s);\n}\n\nfunction primitiveApplyReverb() {\n\tvar rcvr;\n\tvar aSoundBuffer;\n\tvar startIndex;\n\tvar n;\n\tvar delayedLeft;\n\tvar delayedRight;\n\tvar i;\n\tvar j;\n\tvar out;\n\tvar sliceIndex;\n\tvar tapGain;\n\tvar tapIndex;\n\tvar bufferIndex;\n\tvar bufferSize;\n\tvar leftBuffer;\n\tvar rightBuffer;\n\tvar tapCount;\n\tvar tapDelays;\n\tvar tapGains;\n\n\trcvr = interpreterProxy.stackValue(3);\n\taSoundBuffer = interpreterProxy.stackInt16Array(2);\n\tstartIndex = interpreterProxy.stackIntegerValue(1);\n\tn = interpreterProxy.stackIntegerValue(0);\n\ttapDelays = interpreterProxy.fetchInt32ArrayofObject(7, rcvr);\n\ttapGains = interpreterProxy.fetchInt32ArrayofObject(8, rcvr);\n\ttapCount = interpreterProxy.fetchIntegerofObject(9, rcvr);\n\tbufferSize = interpreterProxy.fetchIntegerofObject(10, rcvr);\n\tbufferIndex = interpreterProxy.fetchIntegerofObject(11, rcvr);\n\tleftBuffer = interpreterProxy.fetchInt16ArrayofObject(12, rcvr);\n\trightBuffer = interpreterProxy.fetchInt16ArrayofObject(13, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (sliceIndex = startIndex; sliceIndex <= ((startIndex + n) - 1); sliceIndex++) {\n\t\tdelayedLeft = (delayedRight = 0);\n\t\tfor (tapIndex = 1; tapIndex <= tapCount; tapIndex++) {\n\t\t\ti = bufferIndex - tapDelays[tapIndex - 1];\n\t\t\tif (i < 1) {\n\t\t\t\ti += bufferSize;\n\t\t\t}\n\t\t\ttapGain = tapGains[tapIndex - 1];\n\t\t\tdelayedLeft += tapGain * leftBuffer[i - 1];\n\t\t\tdelayedRight += tapGain * rightBuffer[i - 1];\n\t\t}\n\t\tj = (2 * sliceIndex) - 1;\n\t\tout = aSoundBuffer[j - 1] + (delayedLeft >> 15);\n\t\tif (out > 32767) {\n\t\t\tout = 32767;\n\t\t}\n\t\tif (out < -32767) {\n\t\t\tout = -32767;\n\t\t}\n\t\taSoundBuffer[j - 1] = out;\n\t\tleftBuffer[bufferIndex - 1] = out;\n\t\t++j;\n\t\tout = aSoundBuffer[j - 1] + (delayedRight >> 15);\n\t\tif (out > 32767) {\n\t\t\tout = 32767;\n\t\t}\n\t\tif (out < -32767) {\n\t\t\tout = -32767;\n\t\t}\n\t\taSoundBuffer[j - 1] = out;\n\t\trightBuffer[bufferIndex - 1] = out;\n\t\tbufferIndex = (MOD(bufferIndex, bufferSize)) + 1;\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(11, rcvr, bufferIndex);\n\tinterpreterProxy.pop(3);\n}\n\n\n/*\tPlay samples from a wave table by stepping a fixed amount through the table on every sample. The table index and increment are scaled to allow fractional increments for greater pitch accuracy. */\n/*\t(FMSound pitch: 440.0 dur: 1.0 loudness: 0.5) play */\n\nfunction primitiveMixFMSound() {\n\tvar rcvr;\n\tvar n;\n\tvar aSoundBuffer;\n\tvar startIndex;\n\tvar leftVol;\n\tvar rightVol;\n\tvar doingFM;\n\tvar i;\n\tvar lastIndex;\n\tvar offset;\n\tvar s;\n\tvar sample;\n\tvar sliceIndex;\n\tvar count;\n\tvar normalizedModulation;\n\tvar scaledIndex;\n\tvar scaledIndexIncr;\n\tvar scaledOffsetIndex;\n\tvar scaledOffsetIndexIncr;\n\tvar scaledVol;\n\tvar scaledVolIncr;\n\tvar scaledVolLimit;\n\tvar scaledWaveTableSize;\n\tvar waveTable;\n\n\trcvr = interpreterProxy.stackValue(5);\n\tn = interpreterProxy.stackIntegerValue(4);\n\taSoundBuffer = interpreterProxy.stackInt16Array(3);\n\tstartIndex = interpreterProxy.stackIntegerValue(2);\n\tleftVol = interpreterProxy.stackIntegerValue(1);\n\trightVol = interpreterProxy.stackIntegerValue(0);\n\tscaledVol = interpreterProxy.fetchIntegerofObject(3, rcvr);\n\tscaledVolIncr = interpreterProxy.fetchIntegerofObject(4, rcvr);\n\tscaledVolLimit = interpreterProxy.fetchIntegerofObject(5, rcvr);\n\tcount = interpreterProxy.fetchIntegerofObject(7, rcvr);\n\twaveTable = interpreterProxy.fetchInt16ArrayofObject(8, rcvr);\n\tscaledWaveTableSize = interpreterProxy.fetchIntegerofObject(9, rcvr);\n\tscaledIndex = interpreterProxy.fetchIntegerofObject(10, rcvr);\n\tscaledIndexIncr = interpreterProxy.fetchIntegerofObject(11, rcvr);\n\tnormalizedModulation = interpreterProxy.fetchIntegerofObject(14, rcvr);\n\tscaledOffsetIndex = interpreterProxy.fetchIntegerofObject(15, rcvr);\n\tscaledOffsetIndexIncr = interpreterProxy.fetchIntegerofObject(16, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tdoingFM = (normalizedModulation !== 0) && (scaledOffsetIndexIncr !== 0);\n\tlastIndex = (startIndex + n) - 1;\n\tfor (sliceIndex = startIndex; sliceIndex <= lastIndex; sliceIndex++) {\n\t\tsample = (scaledVol * waveTable[scaledIndex >> 15]) >> 15;\n\t\tif (doingFM) {\n\t\t\toffset = normalizedModulation * waveTable[scaledOffsetIndex >> 15];\n\t\t\tscaledOffsetIndex = MOD((scaledOffsetIndex + scaledOffsetIndexIncr), scaledWaveTableSize);\n\t\t\tif (scaledOffsetIndex < 0) {\n\t\t\t\tscaledOffsetIndex += scaledWaveTableSize;\n\t\t\t}\n\t\t\tscaledIndex = MOD(((scaledIndex + scaledIndexIncr) + offset), scaledWaveTableSize);\n\t\t\tif (scaledIndex < 0) {\n\t\t\t\tscaledIndex += scaledWaveTableSize;\n\t\t\t}\n\t\t} else {\n\t\t\tscaledIndex = MOD((scaledIndex + scaledIndexIncr), scaledWaveTableSize);\n\t\t}\n\t\tif (leftVol > 0) {\n\t\t\ti = (2 * sliceIndex) - 1;\n\t\t\ts = aSoundBuffer[i - 1] + ((sample * leftVol) >> 15);\n\t\t\tif (s > 32767) {\n\t\t\t\ts = 32767;\n\t\t\t}\n\t\t\tif (s < -32767) {\n\t\t\t\ts = -32767;\n\t\t\t}\n\t\t\taSoundBuffer[i - 1] = s;\n\t\t}\n\t\tif (rightVol > 0) {\n\t\t\ti = 2 * sliceIndex;\n\t\t\ts = aSoundBuffer[i - 1] + ((sample * rightVol) >> 15);\n\t\t\tif (s > 32767) {\n\t\t\t\ts = 32767;\n\t\t\t}\n\t\t\tif (s < -32767) {\n\t\t\t\ts = -32767;\n\t\t\t}\n\t\t\taSoundBuffer[i - 1] = s;\n\t\t}\n\t\tif (scaledVolIncr !== 0) {\n\t\t\tscaledVol += scaledVolIncr;\n\t\t\tif (((scaledVolIncr > 0) && (scaledVol >= scaledVolLimit)) || ((scaledVolIncr < 0) && (scaledVol <= scaledVolLimit))) {\n\n\t\t\t\t/* reached the limit; stop incrementing */\n\n\t\t\t\tscaledVol = scaledVolLimit;\n\t\t\t\tscaledVolIncr = 0;\n\t\t\t}\n\t\t}\n\t}\n\tcount -= n;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(3, rcvr, scaledVol);\n\tinterpreterProxy.storeIntegerofObjectwithValue(4, rcvr, scaledVolIncr);\n\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, count);\n\tinterpreterProxy.storeIntegerofObjectwithValue(10, rcvr, scaledIndex);\n\tinterpreterProxy.storeIntegerofObjectwithValue(15, rcvr, scaledOffsetIndex);\n\tinterpreterProxy.pop(5);\n}\n\n\n/*\tPlay samples from a wave table by stepping a fixed amount through the table on every sample. The table index and increment are scaled to allow fractional increments for greater pitch accuracy. If a loop length is specified, then the index is looped back when the loopEnd index is reached until count drops below releaseCount. This allows a short sampled sound to be sustained indefinitely. */\n/*\t(LoopedSampledSound pitch: 440.0 dur: 5.0 loudness: 0.5) play */\n\nfunction primitiveMixLoopedSampledSound() {\n\tvar rcvr;\n\tvar n;\n\tvar aSoundBuffer;\n\tvar startIndex;\n\tvar leftVol;\n\tvar rightVol;\n\tvar compositeLeftVol;\n\tvar compositeRightVol;\n\tvar i;\n\tvar isInStereo;\n\tvar lastIndex;\n\tvar leftVal;\n\tvar m;\n\tvar nextSampleIndex;\n\tvar rightVal;\n\tvar s;\n\tvar sampleIndex;\n\tvar sliceIndex;\n\tvar count;\n\tvar lastSample;\n\tvar leftSamples;\n\tvar loopEnd;\n\tvar releaseCount;\n\tvar rightSamples;\n\tvar scaledIndex;\n\tvar scaledIndexIncr;\n\tvar scaledLoopLength;\n\tvar scaledVol;\n\tvar scaledVolIncr;\n\tvar scaledVolLimit;\n\n\trcvr = interpreterProxy.stackValue(5);\n\tn = interpreterProxy.stackIntegerValue(4);\n\taSoundBuffer = interpreterProxy.stackInt16Array(3);\n\tstartIndex = interpreterProxy.stackIntegerValue(2);\n\tleftVol = interpreterProxy.stackIntegerValue(1);\n\trightVol = interpreterProxy.stackIntegerValue(0);\n\tscaledVol = interpreterProxy.fetchIntegerofObject(3, rcvr);\n\tscaledVolIncr = interpreterProxy.fetchIntegerofObject(4, rcvr);\n\tscaledVolLimit = interpreterProxy.fetchIntegerofObject(5, rcvr);\n\tcount = interpreterProxy.fetchIntegerofObject(7, rcvr);\n\treleaseCount = interpreterProxy.fetchIntegerofObject(8, rcvr);\n\tleftSamples = interpreterProxy.fetchInt16ArrayofObject(10, rcvr);\n\trightSamples = interpreterProxy.fetchInt16ArrayofObject(11, rcvr);\n\tlastSample = interpreterProxy.fetchIntegerofObject(16, rcvr);\n\tloopEnd = interpreterProxy.fetchIntegerofObject(17, rcvr);\n\tscaledLoopLength = interpreterProxy.fetchIntegerofObject(18, rcvr);\n\tscaledIndex = interpreterProxy.fetchIntegerofObject(19, rcvr);\n\tscaledIndexIncr = interpreterProxy.fetchIntegerofObject(20, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tisInStereo = leftSamples !== rightSamples;\n\tcompositeLeftVol = (leftVol * scaledVol) >> 15;\n\tcompositeRightVol = (rightVol * scaledVol) >> 15;\n\ti = (2 * startIndex) - 1;\n\tlastIndex = (startIndex + n) - 1;\n\tfor (sliceIndex = startIndex; sliceIndex <= lastIndex; sliceIndex++) {\n\t\tsampleIndex = ((scaledIndex += scaledIndexIncr)) >> 9;\n\t\tif ((sampleIndex > loopEnd) && (count > releaseCount)) {\n\n\t\t\t/* loop back if not within releaseCount of the note end */\n\t\t\t/* note: unlooped sounds will have loopEnd = lastSample */\n\n\t\t\tsampleIndex = ((scaledIndex -= scaledLoopLength)) >> 9;\n\t\t}\n\t\tif (((nextSampleIndex = sampleIndex + 1)) > lastSample) {\n\t\t\tif (sampleIndex > lastSample) {\n\t\t\t\tcount = 0;\n\t\t\t\tif (interpreterProxy.failed()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tinterpreterProxy.storeIntegerofObjectwithValue(3, rcvr, scaledVol);\n\t\t\t\tinterpreterProxy.storeIntegerofObjectwithValue(4, rcvr, scaledVolIncr);\n\t\t\t\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, count);\n\t\t\t\tinterpreterProxy.storeIntegerofObjectwithValue(19, rcvr, scaledIndex);\n\t\t\t\tinterpreterProxy.popthenPush(6, null);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (scaledLoopLength === 0) {\n\t\t\t\tnextSampleIndex = sampleIndex;\n\t\t\t} else {\n\t\t\t\tnextSampleIndex = ((scaledIndex - scaledLoopLength) >> 9) + 1;\n\t\t\t}\n\t\t}\n\t\tm = scaledIndex & LoopIndexFractionMask;\n\t\trightVal = (leftVal = ((leftSamples[sampleIndex - 1] * (LoopIndexScaleFactor - m)) + (leftSamples[nextSampleIndex - 1] * m)) >> 9);\n\t\tif (isInStereo) {\n\t\t\trightVal = ((rightSamples[sampleIndex - 1] * (LoopIndexScaleFactor - m)) + (rightSamples[nextSampleIndex - 1] * m)) >> 9;\n\t\t}\n\t\tif (leftVol > 0) {\n\t\t\ts = aSoundBuffer[i - 1] + ((compositeLeftVol * leftVal) >> 15);\n\t\t\tif (s > 32767) {\n\t\t\t\ts = 32767;\n\t\t\t}\n\t\t\tif (s < -32767) {\n\t\t\t\ts = -32767;\n\t\t\t}\n\t\t\taSoundBuffer[i - 1] = s;\n\t\t}\n\t\t++i;\n\t\tif (rightVol > 0) {\n\t\t\ts = aSoundBuffer[i - 1] + ((compositeRightVol * rightVal) >> 15);\n\t\t\tif (s > 32767) {\n\t\t\t\ts = 32767;\n\t\t\t}\n\t\t\tif (s < -32767) {\n\t\t\t\ts = -32767;\n\t\t\t}\n\t\t\taSoundBuffer[i - 1] = s;\n\t\t}\n\t\t++i;\n\t\tif (scaledVolIncr !== 0) {\n\n\t\t\t/* update volume envelope if it is changing */\n\n\t\t\tscaledVol += scaledVolIncr;\n\t\t\tif (((scaledVolIncr > 0) && (scaledVol >= scaledVolLimit)) || ((scaledVolIncr < 0) && (scaledVol <= scaledVolLimit))) {\n\n\t\t\t\t/* reached the limit; stop incrementing */\n\n\t\t\t\tscaledVol = scaledVolLimit;\n\t\t\t\tscaledVolIncr = 0;\n\t\t\t}\n\t\t\tcompositeLeftVol = (leftVol * scaledVol) >> 15;\n\t\t\tcompositeRightVol = (rightVol * scaledVol) >> 15;\n\t\t}\n\t}\n\tcount -= n;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(3, rcvr, scaledVol);\n\tinterpreterProxy.storeIntegerofObjectwithValue(4, rcvr, scaledVolIncr);\n\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, count);\n\tinterpreterProxy.storeIntegerofObjectwithValue(19, rcvr, scaledIndex);\n\tinterpreterProxy.pop(5);\n}\n\n\n/*\tThe Karplus-Strong plucked string algorithm: start with a buffer full of random noise and repeatedly play the contents of that buffer while averaging adjacent samples. High harmonics damp out more quickly, transfering their energy to lower ones. The length of the buffer corresponds to the length of the string. */\n/*\t(PluckedSound pitch: 220.0 dur: 6.0 loudness: 0.8) play */\n\nfunction primitiveMixPluckedSound() {\n\tvar rcvr;\n\tvar n;\n\tvar aSoundBuffer;\n\tvar startIndex;\n\tvar leftVol;\n\tvar rightVol;\n\tvar average;\n\tvar i;\n\tvar lastIndex;\n\tvar s;\n\tvar sample;\n\tvar scaledNextIndex;\n\tvar scaledThisIndex;\n\tvar sliceIndex;\n\tvar count;\n\tvar ring;\n\tvar scaledIndex;\n\tvar scaledIndexIncr;\n\tvar scaledIndexLimit;\n\tvar scaledVol;\n\tvar scaledVolIncr;\n\tvar scaledVolLimit;\n\n\trcvr = interpreterProxy.stackValue(5);\n\tn = interpreterProxy.stackIntegerValue(4);\n\taSoundBuffer = interpreterProxy.stackInt16Array(3);\n\tstartIndex = interpreterProxy.stackIntegerValue(2);\n\tleftVol = interpreterProxy.stackIntegerValue(1);\n\trightVol = interpreterProxy.stackIntegerValue(0);\n\tscaledVol = interpreterProxy.fetchIntegerofObject(3, rcvr);\n\tscaledVolIncr = interpreterProxy.fetchIntegerofObject(4, rcvr);\n\tscaledVolLimit = interpreterProxy.fetchIntegerofObject(5, rcvr);\n\tcount = interpreterProxy.fetchIntegerofObject(7, rcvr);\n\tring = interpreterProxy.fetchInt16ArrayofObject(8, rcvr);\n\tscaledIndex = interpreterProxy.fetchIntegerofObject(9, rcvr);\n\tscaledIndexIncr = interpreterProxy.fetchIntegerofObject(10, rcvr);\n\tscaledIndexLimit = interpreterProxy.fetchIntegerofObject(11, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlastIndex = (startIndex + n) - 1;\n\tscaledThisIndex = (scaledNextIndex = scaledIndex);\n\tfor (sliceIndex = startIndex; sliceIndex <= lastIndex; sliceIndex++) {\n\t\tscaledNextIndex = scaledThisIndex + scaledIndexIncr;\n\t\tif (scaledNextIndex >= scaledIndexLimit) {\n\t\t\tscaledNextIndex = ScaleFactor + (scaledNextIndex - scaledIndexLimit);\n\t\t}\n\t\taverage = (ring[(scaledThisIndex >> 15) - 1] + ring[(scaledNextIndex >> 15) - 1]) >> 1;\n\t\tring[(scaledThisIndex >> 15) - 1] = average;\n\n\t\t/* scale by volume */\n\n\t\tsample = (average * scaledVol) >> 15;\n\t\tscaledThisIndex = scaledNextIndex;\n\t\tif (leftVol > 0) {\n\t\t\ti = (2 * sliceIndex) - 1;\n\t\t\ts = aSoundBuffer[i - 1] + ((sample * leftVol) >> 15);\n\t\t\tif (s > 32767) {\n\t\t\t\ts = 32767;\n\t\t\t}\n\t\t\tif (s < -32767) {\n\t\t\t\ts = -32767;\n\t\t\t}\n\t\t\taSoundBuffer[i - 1] = s;\n\t\t}\n\t\tif (rightVol > 0) {\n\t\t\ti = 2 * sliceIndex;\n\t\t\ts = aSoundBuffer[i - 1] + ((sample * rightVol) >> 15);\n\t\t\tif (s > 32767) {\n\t\t\t\ts = 32767;\n\t\t\t}\n\t\t\tif (s < -32767) {\n\t\t\t\ts = -32767;\n\t\t\t}\n\t\t\taSoundBuffer[i - 1] = s;\n\t\t}\n\t\tif (scaledVolIncr !== 0) {\n\t\t\tscaledVol += scaledVolIncr;\n\t\t\tif (((scaledVolIncr > 0) && (scaledVol >= scaledVolLimit)) || ((scaledVolIncr < 0) && (scaledVol <= scaledVolLimit))) {\n\n\t\t\t\t/* reached the limit; stop incrementing */\n\n\t\t\t\tscaledVol = scaledVolLimit;\n\t\t\t\tscaledVolIncr = 0;\n\t\t\t}\n\t\t}\n\t}\n\tscaledIndex = scaledNextIndex;\n\tcount -= n;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(3, rcvr, scaledVol);\n\tinterpreterProxy.storeIntegerofObjectwithValue(4, rcvr, scaledVolIncr);\n\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, count);\n\tinterpreterProxy.storeIntegerofObjectwithValue(9, rcvr, scaledIndex);\n\tinterpreterProxy.pop(5);\n}\n\n\n/*\tMix the given number of samples with the samples already in the given buffer starting at the given index. Assume that the buffer size is at least (index + count) - 1. */\n\nfunction primitiveMixSampledSound() {\n\tvar rcvr;\n\tvar n;\n\tvar aSoundBuffer;\n\tvar startIndex;\n\tvar leftVol;\n\tvar rightVol;\n\tvar i;\n\tvar lastIndex;\n\tvar outIndex;\n\tvar overflow;\n\tvar s;\n\tvar sample;\n\tvar sampleIndex;\n\tvar count;\n\tvar indexHighBits;\n\tvar samples;\n\tvar samplesSize;\n\tvar scaledIncrement;\n\tvar scaledIndex;\n\tvar scaledVol;\n\tvar scaledVolIncr;\n\tvar scaledVolLimit;\n\n\trcvr = interpreterProxy.stackValue(5);\n\tn = interpreterProxy.stackIntegerValue(4);\n\taSoundBuffer = interpreterProxy.stackInt16Array(3);\n\tstartIndex = interpreterProxy.stackIntegerValue(2);\n\tleftVol = interpreterProxy.stackIntegerValue(1);\n\trightVol = interpreterProxy.stackIntegerValue(0);\n\tscaledVol = interpreterProxy.fetchIntegerofObject(3, rcvr);\n\tscaledVolIncr = interpreterProxy.fetchIntegerofObject(4, rcvr);\n\tscaledVolLimit = interpreterProxy.fetchIntegerofObject(5, rcvr);\n\tcount = interpreterProxy.fetchIntegerofObject(7, rcvr);\n\tsamples = interpreterProxy.fetchInt16ArrayofObject(8, rcvr);\n\tsamplesSize = interpreterProxy.fetchIntegerofObject(10, rcvr);\n\tscaledIndex = interpreterProxy.fetchIntegerofObject(11, rcvr);\n\tindexHighBits = interpreterProxy.fetchIntegerofObject(12, rcvr);\n\tscaledIncrement = interpreterProxy.fetchIntegerofObject(13, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tlastIndex = (startIndex + n) - 1;\n\n\t/* index of next stereo output sample pair */\n\n\toutIndex = startIndex;\n\tsampleIndex = indexHighBits + (scaledIndex >>> 16);\n\twhile ((sampleIndex <= samplesSize) && (outIndex <= lastIndex)) {\n\t\tsample = (samples[sampleIndex - 1] * scaledVol) >> 15;\n\t\tif (leftVol > 0) {\n\t\t\ti = (2 * outIndex) - 1;\n\t\t\ts = aSoundBuffer[i - 1] + ((sample * leftVol) >> 15);\n\t\t\tif (s > 32767) {\n\t\t\t\ts = 32767;\n\t\t\t}\n\t\t\tif (s < -32767) {\n\t\t\t\ts = -32767;\n\t\t\t}\n\t\t\taSoundBuffer[i - 1] = s;\n\t\t}\n\t\tif (rightVol > 0) {\n\t\t\ti = 2 * outIndex;\n\t\t\ts = aSoundBuffer[i - 1] + ((sample * rightVol) >> 15);\n\t\t\tif (s > 32767) {\n\t\t\t\ts = 32767;\n\t\t\t}\n\t\t\tif (s < -32767) {\n\t\t\t\ts = -32767;\n\t\t\t}\n\t\t\taSoundBuffer[i - 1] = s;\n\t\t}\n\t\tif (scaledVolIncr !== 0) {\n\t\t\tscaledVol += scaledVolIncr;\n\t\t\tif (((scaledVolIncr > 0) && (scaledVol >= scaledVolLimit)) || ((scaledVolIncr < 0) && (scaledVol <= scaledVolLimit))) {\n\n\t\t\t\t/* reached the limit; stop incrementing */\n\n\t\t\t\tscaledVol = scaledVolLimit;\n\t\t\t\tscaledVolIncr = 0;\n\t\t\t}\n\t\t}\n\t\tscaledIndex += scaledIncrement;\n\t\tif (scaledIndex >= ScaledIndexOverflow) {\n\t\t\toverflow = scaledIndex >>> 16;\n\t\t\tindexHighBits += overflow;\n\t\t\tscaledIndex -= overflow << 16;\n\t\t}\n\t\tsampleIndex = indexHighBits + (scaledIndex >>> 16);\n\t\t++outIndex;\n\t}\n\tcount -= n;\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(3, rcvr, scaledVol);\n\tinterpreterProxy.storeIntegerofObjectwithValue(4, rcvr, scaledVolIncr);\n\tinterpreterProxy.storeIntegerofObjectwithValue(7, rcvr, count);\n\tinterpreterProxy.storeIntegerofObjectwithValue(11, rcvr, scaledIndex);\n\tinterpreterProxy.storeIntegerofObjectwithValue(12, rcvr, indexHighBits);\n\tinterpreterProxy.pop(5);\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\nSqueak.registerExternalModule(\"SoundGenerationPlugin\", {\n\tprimitiveMixFMSound: primitiveMixFMSound,\n\tprimitiveMixSampledSound: primitiveMixSampledSound,\n\tsetInterpreter: setInterpreter,\n\tgetModuleName: getModuleName,\n\tprimitiveApplyReverb: primitiveApplyReverb,\n\tprimitiveMixPluckedSound: primitiveMixPluckedSound,\n\tprimitiveMixLoopedSampledSound: primitiveMixLoopedSampledSound,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:26 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tStarSqueakPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.StarSqueakPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar moduleName = \"StarSqueakPlugin 3 November 2014 (e)\";\n\n\n\n/*\tReturn an unsigned int pointer to the first indexable word of oop, which must be a words object. */\n\nfunction checkedUnsignedIntPtrOf(oop) {\n\tinterpreterProxy.success(interpreterProxy.isWords(oop));\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\treturn oop.words;\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\n\n/*\tDiffuse the integer values of the source patch variable Bitmap into the output Bitmap. Each cell of the output is the average of the NxN area around it in the source, where N = (2 * delta) + 1. */\n\nfunction primitiveDiffuseFromToWidthHeightDelta() {\n\tvar area;\n\tvar delta;\n\tvar dst;\n\tvar dstOop;\n\tvar endX;\n\tvar endY;\n\tvar height;\n\tvar rowStart;\n\tvar src;\n\tvar srcOop;\n\tvar startX;\n\tvar startY;\n\tvar sum;\n\tvar width;\n\tvar x;\n\tvar x2;\n\tvar y;\n\tvar y2;\n\n\tsrcOop = interpreterProxy.stackValue(4);\n\tdstOop = interpreterProxy.stackValue(3);\n\twidth = interpreterProxy.stackIntegerValue(2);\n\theight = interpreterProxy.stackIntegerValue(1);\n\tdelta = interpreterProxy.stackIntegerValue(0);\n\tsrc = checkedUnsignedIntPtrOf(srcOop);\n\tdst = checkedUnsignedIntPtrOf(dstOop);\n\tinterpreterProxy.success(SIZEOF(srcOop) === SIZEOF(dstOop));\n\tinterpreterProxy.success(SIZEOF(srcOop) === (width * height));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tarea = ((2 * delta) + 1) * ((2 * delta) + 1);\n\tfor (y = 0; y <= (height - 1); y++) {\n\t\tstartY = y - delta;\n\t\tif (startY < 0) {\n\t\t\tstartY = 0;\n\t\t}\n\t\tendY = y + delta;\n\t\tif (endY >= height) {\n\t\t\tendY = height - 1;\n\t\t}\n\t\tfor (x = 0; x <= (width - 1); x++) {\n\t\t\tstartX = x - delta;\n\t\t\tif (startX < 0) {\n\t\t\t\tstartX = 0;\n\t\t\t}\n\t\t\tendX = x + delta;\n\t\t\tif (endX >= width) {\n\t\t\t\tendX = width - 1;\n\t\t\t}\n\t\t\tsum = 0;\n\t\t\tfor (y2 = startY; y2 <= endY; y2++) {\n\t\t\t\trowStart = y2 * width;\n\t\t\t\tfor (x2 = startX; x2 <= endX; x2++) {\n\t\t\t\t\tsum += src[rowStart + x2];\n\t\t\t\t}\n\t\t\t}\n\t\t\tdst[(y * width) + x] = (DIV(sum, area));\n\t\t}\n\t}\n\tinterpreterProxy.pop(5);\n}\n\n\n/*\tEvaporate the integer values of the source Bitmap at the given rate. The rate is an integer between 0 and 1024, where 1024 is a scale factor of 1.0 (i.e., no evaporation). */\n\nfunction primitiveEvaporateRate() {\n\tvar i;\n\tvar patchVar;\n\tvar patchVarOop;\n\tvar rate;\n\tvar sz;\n\n\tpatchVarOop = interpreterProxy.stackValue(1);\n\trate = interpreterProxy.stackIntegerValue(0);\n\tpatchVar = checkedUnsignedIntPtrOf(patchVarOop);\n\tsz = SIZEOF(patchVarOop);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tfor (i = 0; i <= (sz - 1); i++) {\n\t\tpatchVar[i] = ((patchVar[i] * rate) >>> 10);\n\t}\n\tinterpreterProxy.pop(2);\n}\n\nfunction primitiveMapFromToWidthHeightPatchSizeRgbFlagsShift() {\n\tvar dst;\n\tvar dstIndex;\n\tvar dstOop;\n\tvar h;\n\tvar level;\n\tvar offset;\n\tvar patchSize;\n\tvar pixel;\n\tvar rgbFlags;\n\tvar rgbMult;\n\tvar rowStart;\n\tvar shiftAmount;\n\tvar src;\n\tvar srcIndex;\n\tvar srcOop;\n\tvar w;\n\tvar x;\n\tvar y;\n\n\tsrcOop = interpreterProxy.stackValue(6);\n\tdstOop = interpreterProxy.stackValue(5);\n\tw = interpreterProxy.stackIntegerValue(4);\n\th = interpreterProxy.stackIntegerValue(3);\n\tpatchSize = interpreterProxy.stackIntegerValue(2);\n\trgbFlags = interpreterProxy.stackIntegerValue(1);\n\tshiftAmount = interpreterProxy.stackIntegerValue(0);\n\tsrc = checkedUnsignedIntPtrOf(srcOop);\n\tdst = checkedUnsignedIntPtrOf(dstOop);\n\tinterpreterProxy.success(SIZEOF(dstOop) === (w * h));\n\tinterpreterProxy.success(SIZEOF(dstOop) === ((SIZEOF(srcOop) * patchSize) * patchSize));\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\trgbMult = 0;\n\tif ((rgbFlags & 4) > 0) {\n\t\trgbMult += 65536;\n\t}\n\tif ((rgbFlags & 2) > 0) {\n\t\trgbMult += 256;\n\t}\n\tif ((rgbFlags & 1) > 0) {\n\t\t++rgbMult;\n\t}\n\tsrcIndex = -1;\n\tfor (y = 0; y <= ((DIV(h, patchSize)) - 1); y++) {\n\t\tfor (x = 0; x <= ((DIV(w, patchSize)) - 1); x++) {\n\t\t\tlevel = SHIFT(src[(++srcIndex)], shiftAmount);\n\t\t\tif (level > 255) {\n\t\t\t\tlevel = 255;\n\t\t\t}\n\t\t\tif (level <= 0) {\n\n\t\t\t\t/* non-transparent black */\n\n\t\t\t\tpixel = 1;\n\t\t\t} else {\n\t\t\t\tpixel = level * rgbMult;\n\t\t\t}\n\t\t\toffset = ((y * w) + x) * patchSize;\n\t\t\tfor (rowStart = offset; rowStart <= (offset + ((patchSize - 1) * w)); rowStart += w) {\n\t\t\t\tfor (dstIndex = rowStart; dstIndex <= ((rowStart + patchSize) - 1); dstIndex++) {\n\t\t\t\t\tdst[dstIndex] = pixel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tinterpreterProxy.pop(7);\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\nSqueak.registerExternalModule(\"StarSqueakPlugin\", {\n\tprimitiveDiffuseFromToWidthHeightDelta: primitiveDiffuseFromToWidthHeightDelta,\n\tprimitiveEvaporateRate: primitiveEvaporateRate,\n\tsetInterpreter: setInterpreter,\n\tprimitiveMapFromToWidthHeightPatchSizeRgbFlagsShift: primitiveMapFromToWidthHeightPatchSizeRgbFlagsShift,\n\tgetModuleName: getModuleName,\n});\n\n}); // end of module\n","/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:20 pm */\n/* Automatically generated by\n\tJSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5\n from\n\tDeflatePlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002\n */\n\nmodule(\"users.bert.SqueakJS.plugins.ZipPlugin\").requires(\"users.bert.SqueakJS.vm\").toRun(function() {\n\"use strict\";\n\nvar VM_PROXY_MAJOR = 1;\nvar VM_PROXY_MINOR = 11;\n\n/*** Functions ***/\nfunction CLASSOF(obj) { return typeof obj === \"number\" ? interpreterProxy.classSmallInteger() : obj.sqClass }\nfunction SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }\nfunction BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }\nfunction DIV(a, b) { return Math.floor(a / b) | 0; } // integer division\nfunction MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus\nfunction SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift\nfunction SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift\nfunction SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }\n\n/*** Constants ***/\nvar DeflateHashMask = 32767;\nvar DeflateHashShift = 5;\nvar DeflateHashTableSize = 32768;\nvar DeflateMaxDistance = 32768;\nvar DeflateMaxDistanceCodes = 30;\nvar DeflateMaxLiteralCodes = 286;\nvar DeflateMaxMatch = 258;\nvar DeflateMinMatch = 3;\nvar DeflateWindowMask = 32767;\nvar DeflateWindowSize = 32768;\nvar MaxBits = 16;\nvar StateNoMoreData = 1;\n\n/*** Variables ***/\nvar interpreterProxy = null;\nvar moduleName = \"ZipPlugin 3 November 2014 (e)\";\nvar readStreamInstSize = 0;\nvar writeStreamInstSize = 0;\nvar zipBaseDistance = [\n0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, \n256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576];\nvar zipBaseLength = [\n0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, \n32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0];\nvar zipBitBuf = 0;\nvar zipBitPos = 0;\nvar zipBlockPos = 0;\nvar zipBlockStart = 0;\nvar zipCollection = null;\nvar zipCollectionSize = 0;\nvar zipCrcTable = [\n0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, \n498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, \n997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, \n651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, \n1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, \n1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, \n1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, \n1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, \n3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, \n4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, \n3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, \n3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, \n2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, \n2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, \n2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, \n3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117];\nvar zipDistTable = null;\nvar zipDistTableSize = 0;\nvar zipDistanceCodes = [\n0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, \n8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, \n10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, \n11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, \n12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, \n12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, \n13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, \n13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, \n14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, \n14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, \n14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, \n14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, \n15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, \n15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, \n15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, \n15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, \n0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, \n22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, \n24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, \n26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, \n26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, \n27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \n27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \n28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, \n28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, \n28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, \n28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, \n29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, \n29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, \n29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, \n29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29];\nvar zipDistanceFreq = null;\nvar zipDistances = null;\nvar zipExtraDistanceBits = [\n0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, \n7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13];\nvar zipExtraLengthBits = [\n0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, \n3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];\nvar zipHashHead = null;\nvar zipHashTail = null;\nvar zipHashValue = 0;\nvar zipLitTable = null;\nvar zipLitTableSize = 0;\nvar zipLiteralCount = 0;\nvar zipLiteralFreq = null;\nvar zipLiteralSize = 0;\nvar zipLiterals = null;\nvar zipMatchCount = 0;\nvar zipMatchLengthCodes = [\n257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268, 268, \n269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272, \n273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274, \n275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276, 276, 276, 276, 276, \n277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, \n278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, \n279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, \n280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, \n281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, \n281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, \n282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, \n282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, \n283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, \n283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, \n284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, \n284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284];\nvar zipPosition = 0;\nvar zipReadLimit = 0;\nvar zipSource = null;\nvar zipSourceLimit = 0;\nvar zipSourcePos = 0;\nvar zipState = 0;\n\n\n\n/*\tCompare the two strings and return the length of matching characters.\n\tminLength is a lower bound for match lengths that will be accepted.\n\tNote: here and matchPos are zero based. */\n\nfunction comparewithmin(here, matchPos, minLength) {\n\tvar length;\n\n\n\t/* First test if we can actually get longer than minLength */\n\n\tif (zipCollection[here + minLength] !== zipCollection[matchPos + minLength]) {\n\t\treturn 0;\n\t}\n\tif (zipCollection[(here + minLength) - 1] !== zipCollection[(matchPos + minLength) - 1]) {\n\t\treturn 0;\n\t}\n\tif (zipCollection[here] !== zipCollection[matchPos]) {\n\t\treturn 0;\n\t}\n\tif (zipCollection[here + 1] !== zipCollection[matchPos + 1]) {\n\t\treturn 1;\n\t}\n\tlength = 2;\n\twhile ((length < DeflateMaxMatch) && (zipCollection[here + length] === zipCollection[matchPos + length])) {\n\t\t++length;\n\t}\n\treturn length;\n}\n\n\n/*\tContinue deflating the receiver's collection from blockPosition to lastIndex.\n\tNote that lastIndex must be at least MaxMatch away from the end of collection */\n\nfunction deflateBlockchainLengthgoodMatch(lastIndex, chainLength, goodMatch) {\n\tvar flushNeeded;\n\tvar hasMatch;\n\tvar here;\n\tvar hereLength;\n\tvar hereMatch;\n\tvar i;\n\tvar matchResult;\n\tvar newLength;\n\tvar newMatch;\n\n\tif (zipBlockPos > lastIndex) {\n\t\treturn false;\n\t}\n\tif (zipLiteralCount >= zipLiteralSize) {\n\t\treturn true;\n\t}\n\thasMatch = false;\n\there = zipBlockPos;\n\twhile (here <= lastIndex) {\n\t\tif (!hasMatch) {\n\n\t\t\t/* Find the first match */\n\n\t\t\tmatchResult = findMatchlastLengthlastMatchchainLengthgoodMatch(here, DeflateMinMatch - 1, here, chainLength, goodMatch);\n\t\t\tinsertStringAt(here);\n\t\t\thereMatch = matchResult & 65535;\n\t\t\thereLength = matchResult >>> 16;\n\t\t}\n\t\tmatchResult = findMatchlastLengthlastMatchchainLengthgoodMatch(here + 1, hereLength, hereMatch, chainLength, goodMatch);\n\t\tnewMatch = matchResult & 65535;\n\n\t\t/* Now check if the next match is better than the current one.\n\t\tIf not, output the current match (provided that the current match\n\t\tis at least MinMatch long) */\n\n\t\tnewLength = matchResult >>> 16;\n\t\tif ((hereLength >= newLength) && (hereLength >= DeflateMinMatch)) {\n\n\t\t\t/* Encode the current match */\n\n\n\t\t\t/* Insert all strings up to the end of the current match.\n\t\t\tNote: The first string has already been inserted. */\n\n\t\t\tflushNeeded = encodeMatchdistance(hereLength, here - hereMatch);\n\t\t\tfor (i = 1; i <= (hereLength - 1); i++) {\n\t\t\t\tinsertStringAt((++here));\n\t\t\t}\n\t\t\thasMatch = false;\n\t\t\t++here;\n\t\t} else {\n\n\t\t\t/* Either the next match is better than the current one or we didn't\n\t\t\thave a good match after all (e.g., current match length < MinMatch).\n\t\t\tOutput a single literal. */\n\n\t\t\tflushNeeded = encodeLiteral(zipCollection[here]);\n\t\t\t++here;\n\t\t\tif ((here <= lastIndex) && (!flushNeeded)) {\n\n\t\t\t\t/* Cache the results for the next round */\n\n\t\t\t\tinsertStringAt(here);\n\t\t\t\thasMatch = true;\n\t\t\t\thereMatch = newMatch;\n\t\t\t\thereLength = newLength;\n\t\t\t}\n\t\t}\n\t\tif (flushNeeded) {\n\t\t\tzipBlockPos = here;\n\t\t\treturn true;\n\t\t}\n\t}\n\tzipBlockPos = here;\n\treturn false;\n}\n\n\n/*\tDetermine the inst size of the class above DeflateStream by\n\t looking for the first class whose inst size is less than 13. */\n\nfunction determineSizeOfReadStream(rcvr) {\n\tvar sq_class;\n\n\tsq_class = CLASSOF(rcvr);\n\twhile ((!sq_class.isNil) && (sq_class.classInstSize() >= 13)) {\n\t\tsq_class = sq_class.superclass();\n\t}\n\tif (sq_class.isNil) {\n\t\treturn false;\n\t}\n\treadStreamInstSize = sq_class.classInstSize();\n\treturn true;\n}\n\n\n/*\tDetermine the inst size of the class above DeflateStream or\n\t ZipEncoder by looking for the first class whose inst size is less than 7. */\n\nfunction determineSizeOfWriteStream(rcvr) {\n\tvar sq_class;\n\n\tsq_class = CLASSOF(rcvr);\n\twhile ((!sq_class.isNil) && (sq_class.classInstSize() >= 7)) {\n\t\tsq_class = sq_class.superclass();\n\t}\n\tif (sq_class.isNil) {\n\t\treturn false;\n\t}\n\twriteStreamInstSize = sq_class.classInstSize();\n\treturn true;\n}\n\n\n/*\tEncode the given literal */\n\nfunction encodeLiteral(lit) {\n\tzipLiterals[zipLiteralCount] = lit;\n\tzipDistances[zipLiteralCount] = 0;\n\tzipLiteralFreq[lit]++;\n\t++zipLiteralCount;\n\treturn (zipLiteralCount === zipLiteralSize) || (((zipLiteralCount & 4095) === 0) && (shouldFlush()));\n}\n\n\n/*\tEncode the given match of length length starting at dist bytes ahead */\n\nfunction encodeMatchdistance(length, dist) {\n\tvar distance;\n\tvar literal;\n\n\tzipLiterals[zipLiteralCount] = (length - DeflateMinMatch);\n\tzipDistances[zipLiteralCount] = dist;\n\tliteral = zipMatchLengthCodes[length - DeflateMinMatch];\n\tzipLiteralFreq[literal]++;\n\tif (dist < 257) {\n\t\tdistance = zipDistanceCodes[dist - 1];\n\t} else {\n\t\tdistance = zipDistanceCodes[256 + ((dist - 1) >>> 7)];\n\t}\n\tzipDistanceFreq[distance]++;\n\t++zipLiteralCount;\n\t++zipMatchCount;\n\treturn (zipLiteralCount === zipLiteralSize) || (((zipLiteralCount & 4095) === 0) && (shouldFlush()));\n}\n\n\n/*\tFind the longest match for the string starting at here.\n\tIf there is no match longer than lastLength return lastMatch/lastLength.\n\tTraverse at most maxChainLength entries in the hash table.\n\tStop if a match of at least goodMatch size has been found. */\n\nfunction findMatchlastLengthlastMatchchainLengthgoodMatch(here, lastLength, lastMatch, maxChainLength, goodMatch) {\n\tvar bestLength;\n\tvar chainLength;\n\tvar distance;\n\tvar length;\n\tvar limit;\n\tvar matchPos;\n\tvar matchResult;\n\n\n\t/* Compute the default match result */\n\n\n\t/* There is no way to find a better match than MaxMatch */\n\n\tmatchResult = (lastLength << 16) | lastMatch;\n\tif (lastLength >= DeflateMaxMatch) {\n\t\treturn matchResult;\n\t}\n\n\t/* Compute the distance to the (possible) match */\n\n\tmatchPos = zipHashHead[updateHashAt((here + DeflateMinMatch) - 1)];\n\n\t/* Note: It is required that 0 < distance < MaxDistance */\n\n\tdistance = here - matchPos;\n\tif (!((distance > 0) && (distance < DeflateMaxDistance))) {\n\t\treturn matchResult;\n\t}\n\n\t/* Max. nr of match chain to search */\n\n\tchainLength = maxChainLength;\n\tif (here > DeflateMaxDistance) {\n\n\t\t/* Limit for matches that are too old */\n\n\t\tlimit = here - DeflateMaxDistance;\n\t} else {\n\t\tlimit = 0;\n\t}\n\tbestLength = lastLength;\n\twhile (true) {\n\n\t\t/* Compare the current string with the string at match position */\n\n\n\t\t/* Truncate accidental matches beyound stream position */\n\n\t\tlength = comparewithmin(here, matchPos, bestLength);\n\t\tif ((here + length) > zipPosition) {\n\t\t\tlength = zipPosition - here;\n\t\t}\n\t\tif ((length === DeflateMinMatch) && ((here - matchPos) > (DeflateMaxDistance >> 2))) {\n\t\t\tlength = DeflateMinMatch - 1;\n\t\t}\n\t\tif (length > bestLength) {\n\n\t\t\t/* We have a new (better) match than before */\n\t\t\t/* Compute the new match result */\n\n\t\t\tmatchResult = (length << 16) | matchPos;\n\n\t\t\t/* There is no way to find a better match than MaxMatch */\n\n\t\t\tbestLength = length;\n\t\t\tif (bestLength >= DeflateMaxMatch) {\n\t\t\t\treturn matchResult;\n\t\t\t}\n\t\t\tif (bestLength > goodMatch) {\n\t\t\t\treturn matchResult;\n\t\t\t}\n\t\t}\n\t\tif (!(((--chainLength)) > 0)) {\n\t\t\treturn matchResult;\n\t\t}\n\t\tmatchPos = zipHashTail[matchPos & DeflateWindowMask];\n\t\tif (matchPos <= limit) {\n\t\t\treturn matchResult;\n\t\t}\n\t}\n}\n\n\n/*\tNote: This is hardcoded so it can be run from Squeak.\n\tThe module name is used for validating a module *after*\n\tit is loaded to check if it does really contain the module\n\twe're thinking it contains. This is important! */\n\nfunction getModuleName() {\n\treturn moduleName;\n}\n\nfunction halt() {\n\t;\n}\n\n\n/*\tInsert the string at the given start position into the hash table.\n\tNote: The hash value is updated starting at MinMatch-1 since\n\tall strings before have already been inserted into the hash table\n\t(and the hash value is updated as well). */\n\nfunction insertStringAt(here) {\n\tvar prevEntry;\n\n\tzipHashValue = updateHashAt((here + DeflateMinMatch) - 1);\n\tprevEntry = zipHashHead[zipHashValue];\n\tzipHashHead[zipHashValue] = here;\n\tzipHashTail[here & DeflateWindowMask] = prevEntry;\n}\n\nfunction loadDeflateStreamFrom(rcvr) {\n\tvar oop;\n\n\tif (!(interpreterProxy.isPointers(rcvr) && (SIZEOF(rcvr) >= 15))) {\n\t\treturn false;\n\t}\n\toop = interpreterProxy.fetchPointerofObject(0, rcvr);\n\tif (!interpreterProxy.isBytes(oop)) {\n\t\treturn false;\n\t}\n\tif (writeStreamInstSize === 0) {\n\t\tif (!determineSizeOfWriteStream(rcvr)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (SIZEOF(rcvr) < (writeStreamInstSize + 5)) {\n\t\t\twriteStreamInstSize = 0;\n\t\t\treturn false;\n\t\t}\n\t}\n\tzipCollection = oop.bytes;\n\tzipCollectionSize = BYTESIZEOF(oop);\n\tzipPosition = interpreterProxy.fetchIntegerofObject(1, rcvr);\n\n\t/* zipWriteLimit := interpreterProxy fetchInteger: 3 ofObject: rcvr. */\n\n\tzipReadLimit = interpreterProxy.fetchIntegerofObject(2, rcvr);\n\toop = interpreterProxy.fetchPointerofObject(writeStreamInstSize + 0, rcvr);\n\tif (!(interpreterProxy.isWords(oop) && (SIZEOF(oop) === DeflateHashTableSize))) {\n\t\treturn false;\n\t}\n\tzipHashHead = oop.words;\n\toop = interpreterProxy.fetchPointerofObject(writeStreamInstSize + 1, rcvr);\n\tif (!(interpreterProxy.isWords(oop) && (SIZEOF(oop) === DeflateWindowSize))) {\n\t\treturn false;\n\t}\n\tzipHashTail = oop.words;\n\tzipHashValue = interpreterProxy.fetchIntegerofObject(writeStreamInstSize + 2, rcvr);\n\n\t/* zipBlockStart := interpreterProxy fetchInteger: writeStreamInstSize + 4 ofObject: rcvr. */\n\n\tzipBlockPos = interpreterProxy.fetchIntegerofObject(writeStreamInstSize + 3, rcvr);\n\toop = interpreterProxy.fetchPointerofObject(writeStreamInstSize + 5, rcvr);\n\tif (!interpreterProxy.isBytes(oop)) {\n\t\treturn false;\n\t}\n\tzipLiteralSize = SIZEOF(oop);\n\tzipLiterals = oop.bytes;\n\toop = interpreterProxy.fetchPointerofObject(writeStreamInstSize + 6, rcvr);\n\tif (!(interpreterProxy.isWords(oop) && (SIZEOF(oop) >= zipLiteralSize))) {\n\t\treturn false;\n\t}\n\tzipDistances = oop.words;\n\toop = interpreterProxy.fetchPointerofObject(writeStreamInstSize + 7, rcvr);\n\tif (!(interpreterProxy.isWords(oop) && (SIZEOF(oop) === DeflateMaxLiteralCodes))) {\n\t\treturn false;\n\t}\n\tzipLiteralFreq = oop.words;\n\toop = interpreterProxy.fetchPointerofObject(writeStreamInstSize + 8, rcvr);\n\tif (!(interpreterProxy.isWords(oop) && (SIZEOF(oop) === DeflateMaxDistanceCodes))) {\n\t\treturn false;\n\t}\n\tzipDistanceFreq = oop.words;\n\tzipLiteralCount = interpreterProxy.fetchIntegerofObject(writeStreamInstSize + 9, rcvr);\n\tzipMatchCount = interpreterProxy.fetchIntegerofObject(writeStreamInstSize + 10, rcvr);\n\treturn !interpreterProxy.failed();\n}\n\nfunction loadZipEncoderFrom(rcvr) {\n\tvar oop;\n\n\tif (writeStreamInstSize === 0) {\n\t\tif (!determineSizeOfWriteStream(rcvr)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (SIZEOF(rcvr) < (writeStreamInstSize + 3)) {\n\t\t\twriteStreamInstSize = 0;\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (!(interpreterProxy.isPointers(rcvr) && (SIZEOF(rcvr) >= (writeStreamInstSize + 3)))) {\n\t\treturn false;\n\t}\n\toop = interpreterProxy.fetchPointerofObject(0, rcvr);\n\tif (!interpreterProxy.isBytes(oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tzipCollection = oop.bytes;\n\tzipCollectionSize = BYTESIZEOF(oop);\n\tzipPosition = interpreterProxy.fetchIntegerofObject(1, rcvr);\n\n\t/* zipWriteLimit := interpreterProxy fetchInteger: 3 ofObject: rcvr. */\n\n\tzipReadLimit = interpreterProxy.fetchIntegerofObject(2, rcvr);\n\tzipBitBuf = interpreterProxy.fetchIntegerofObject(writeStreamInstSize + 1, rcvr);\n\tzipBitPos = interpreterProxy.fetchIntegerofObject(writeStreamInstSize + 2, rcvr);\n\treturn !interpreterProxy.failed();\n}\n\n\n/*\tRequire:\n\t\tzipCollection, zipCollectionSize, zipPosition,\n\t\tzipBitBuf, zipBitPos.\n\t */\n\nfunction nextZipBitsput(nBits, value) {\n\tif (!((value >= 0) && ((SHL(1, nBits)) > value))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tzipBitBuf = zipBitBuf | (SHL(value, zipBitPos));\n\tzipBitPos += nBits;\n\twhile ((zipBitPos >= 8) && (zipPosition < zipCollectionSize)) {\n\t\tzipCollection[zipPosition] = (zipBitBuf & 255);\n\t\t++zipPosition;\n\t\tzipBitBuf = zipBitBuf >>> 8;\n\t\tzipBitPos -= 8;\n\t}\n}\n\n\n/*\tPrimitive. Deflate the current contents of the receiver. */\n\nfunction primitiveDeflateBlock() {\n\tvar chainLength;\n\tvar goodMatch;\n\tvar lastIndex;\n\tvar rcvr;\n\tvar result;\n\n\tif (interpreterProxy.methodArgumentCount() !== 3) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tgoodMatch = interpreterProxy.stackIntegerValue(0);\n\tchainLength = interpreterProxy.stackIntegerValue(1);\n\tlastIndex = interpreterProxy.stackIntegerValue(2);\n\trcvr = interpreterProxy.stackObjectValue(3);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\t;\n\tif (!loadDeflateStreamFrom(rcvr)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tresult = deflateBlockchainLengthgoodMatch(lastIndex, chainLength, goodMatch);\n\tif (!interpreterProxy.failed()) {\n\n\t\t/* Store back modified values */\n\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(writeStreamInstSize + 2, rcvr, zipHashValue);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(writeStreamInstSize + 3, rcvr, zipBlockPos);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(writeStreamInstSize + 9, rcvr, zipLiteralCount);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(writeStreamInstSize + 10, rcvr, zipMatchCount);\n\t}\n\tif (!interpreterProxy.failed()) {\n\t\tinterpreterProxy.pop(4);\n\t\tinterpreterProxy.pushBool(result);\n\t}\n}\n\n\n/*\tPrimitive. Update the hash tables after data has been moved by delta. */\n\nfunction primitiveDeflateUpdateHashTable() {\n\tvar delta;\n\tvar entry;\n\tvar i;\n\tvar table;\n\tvar tablePtr;\n\tvar tableSize;\n\n\tif (interpreterProxy.methodArgumentCount() !== 2) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdelta = interpreterProxy.stackIntegerValue(0);\n\ttable = interpreterProxy.stackObjectValue(1);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!interpreterProxy.isWords(table)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\ttableSize = SIZEOF(table);\n\ttablePtr = table.wordsAsInt32Array();\n\tfor (i = 0; i <= (tableSize - 1); i++) {\n\t\tentry = tablePtr[i];\n\t\tif (entry >= delta) {\n\t\t\ttablePtr[i] = (entry - delta);\n\t\t} else {\n\t\t\ttablePtr[i] = 0;\n\t\t}\n\t}\n\tinterpreterProxy.pop(2);\n}\n\n\n/*\tPrimitive. Inflate a single block. */\n\nfunction primitiveInflateDecompressBlock() {\n\tvar oop;\n\tvar rcvr;\n\n\tif (interpreterProxy.methodArgumentCount() !== 2) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\toop = interpreterProxy.stackValue(0);\n\tif (!interpreterProxy.isWords(oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tzipDistTable = oop.words;\n\n\t/* literal table */\n\n\tzipDistTableSize = SIZEOF(oop);\n\toop = interpreterProxy.stackValue(1);\n\tif (!interpreterProxy.isWords(oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tzipLitTable = oop.words;\n\n\t/* Receiver (InflateStream) */\n\n\tzipLitTableSize = SIZEOF(oop);\n\trcvr = interpreterProxy.stackValue(2);\n\tif (!interpreterProxy.isPointers(rcvr)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (readStreamInstSize === 0) {\n\t\tif (!determineSizeOfReadStream(rcvr)) {\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t\tif (SIZEOF(rcvr) < (readStreamInstSize + 8)) {\n\t\t\treadStreamInstSize = 0;\n\t\t\treturn interpreterProxy.primitiveFail();\n\t\t}\n\t}\n\tif (SIZEOF(rcvr) < (readStreamInstSize + 8)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tzipReadLimit = interpreterProxy.fetchIntegerofObject(2, rcvr);\n\tzipState = interpreterProxy.fetchIntegerofObject(readStreamInstSize + 0, rcvr);\n\tzipBitBuf = interpreterProxy.fetchIntegerofObject(readStreamInstSize + 1, rcvr);\n\tzipBitPos = interpreterProxy.fetchIntegerofObject(readStreamInstSize + 2, rcvr);\n\tzipSourcePos = interpreterProxy.fetchIntegerofObject(readStreamInstSize + 4, rcvr);\n\tzipSourceLimit = interpreterProxy.fetchIntegerofObject(readStreamInstSize + 5, rcvr);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\t--zipReadLimit;\n\t--zipSourcePos;\n\n\t/* collection */\n\n\t--zipSourceLimit;\n\toop = interpreterProxy.fetchPointerofObject(0, rcvr);\n\tif (!interpreterProxy.isBytes(oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tzipCollection = oop.bytes;\n\n\t/* source */\n\n\tzipCollectionSize = BYTESIZEOF(oop);\n\toop = interpreterProxy.fetchPointerofObject(readStreamInstSize + 3, rcvr);\n\tif (!interpreterProxy.isBytes(oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\n\t/* do the primitive */\n\n\tzipSource = oop.bytes;\n\tzipDecompressBlock();\n\tif (!interpreterProxy.failed()) {\n\n\t\t/* store modified values back */\n\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(2, rcvr, zipReadLimit + 1);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(readStreamInstSize + 0, rcvr, zipState);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(readStreamInstSize + 1, rcvr, zipBitBuf);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(readStreamInstSize + 2, rcvr, zipBitPos);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(readStreamInstSize + 4, rcvr, zipSourcePos + 1);\n\t\tinterpreterProxy.pop(2);\n\t}\n}\n\n\n/*\tPrimitive. Update a 32bit CRC value. */\n\nfunction primitiveUpdateAdler32() {\n\tvar adler32;\n\tvar b;\n\tvar bytePtr;\n\tvar collection;\n\tvar i;\n\tvar length;\n\tvar s1;\n\tvar s2;\n\tvar startIndex;\n\tvar stopIndex;\n\n\tif (interpreterProxy.methodArgumentCount() !== 4) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tcollection = interpreterProxy.stackObjectValue(0);\n\tstopIndex = interpreterProxy.stackIntegerValue(1);\n\tstartIndex = interpreterProxy.stackIntegerValue(2);\n\tadler32 = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(3));\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\tif (!(interpreterProxy.isBytes(collection) && ((stopIndex >= startIndex) && (startIndex > 0)))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tlength = BYTESIZEOF(collection);\n\tif (!(stopIndex <= length)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tbytePtr = collection.bytes;\n\t--startIndex;\n\t--stopIndex;\n\ts1 = adler32 & 65535;\n\ts2 = (adler32 >>> 16) & 65535;\n\tfor (i = startIndex; i <= stopIndex; i++) {\n\t\tb = bytePtr[i];\n\t\ts1 = MOD((s1 + b), 65521);\n\t\ts2 = MOD((s2 + s1), 65521);\n\t}\n\tadler32 = (s2 << 16) + s1;\n\tinterpreterProxy.popthenPush(5, interpreterProxy.positive32BitIntegerFor(adler32));\n}\n\n\n/*\tPrimitive. Update a 32bit CRC value. */\n\nfunction primitiveUpdateGZipCrc32() {\n\tvar bytePtr;\n\tvar collection;\n\tvar crc;\n\tvar i;\n\tvar length;\n\tvar startIndex;\n\tvar stopIndex;\n\n\tif (interpreterProxy.methodArgumentCount() !== 4) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tcollection = interpreterProxy.stackObjectValue(0);\n\tstopIndex = interpreterProxy.stackIntegerValue(1);\n\tstartIndex = interpreterProxy.stackIntegerValue(2);\n\tcrc = interpreterProxy.positive32BitValueOf(interpreterProxy.stackValue(3));\n\tif (interpreterProxy.failed()) {\n\t\treturn 0;\n\t}\n\tif (!(interpreterProxy.isBytes(collection) && ((stopIndex >= startIndex) && (startIndex > 0)))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tlength = BYTESIZEOF(collection);\n\tif (!(stopIndex <= length)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tbytePtr = collection.bytes;\n\t;\n\t--startIndex;\n\t--stopIndex;\n\tfor (i = startIndex; i <= stopIndex; i++) {\n\t\tcrc = zipCrcTable[(crc ^ bytePtr[i]) & 255] ^ (crc >>> 8);\n\t}\n\tinterpreterProxy.popthenPush(5, interpreterProxy.positive32BitIntegerFor(crc));\n}\n\nfunction primitiveZipSendBlock() {\n\tvar distStream;\n\tvar distTree;\n\tvar litStream;\n\tvar litTree;\n\tvar rcvr;\n\tvar result;\n\n\tif (interpreterProxy.methodArgumentCount() !== 4) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdistTree = interpreterProxy.stackObjectValue(0);\n\tlitTree = interpreterProxy.stackObjectValue(1);\n\tdistStream = interpreterProxy.stackObjectValue(2);\n\tlitStream = interpreterProxy.stackObjectValue(3);\n\trcvr = interpreterProxy.stackObjectValue(4);\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tif (!loadZipEncoderFrom(rcvr)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!(interpreterProxy.isPointers(distTree) && (SIZEOF(distTree) >= 2))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!(interpreterProxy.isPointers(litTree) && (SIZEOF(litTree) >= 2))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!(interpreterProxy.isPointers(litStream) && (SIZEOF(litStream) >= 3))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tif (!(interpreterProxy.isPointers(distStream) && (SIZEOF(distStream) >= 3))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\t;\n\tresult = sendBlockwithwithwith(litStream, distStream, litTree, distTree);\n\tif (!interpreterProxy.failed()) {\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(1, rcvr, zipPosition);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(readStreamInstSize + 1, rcvr, zipBitBuf);\n\t\tinterpreterProxy.storeIntegerofObjectwithValue(readStreamInstSize + 2, rcvr, zipBitPos);\n\t}\n\tif (!interpreterProxy.failed()) {\n\t\tinterpreterProxy.pop(5);\n\t\tinterpreterProxy.pushInteger(result);\n\t}\n}\n\n\n/*\tRequire: \n\t\tzipCollection, zipCollectionSize, zipPosition,\n\t\tzipBitBuf, zipBitPos.\n\t */\n\nfunction sendBlockwithwithwith(literalStream, distanceStream, litTree, distTree) {\n\tvar code;\n\tvar dist;\n\tvar distArray;\n\tvar distBitLengths;\n\tvar distBlCount;\n\tvar distCodes;\n\tvar extra;\n\tvar lit;\n\tvar litArray;\n\tvar litBlCount;\n\tvar litLimit;\n\tvar litPos;\n\tvar llBitLengths;\n\tvar llCodes;\n\tvar oop;\n\tvar sum;\n\n\toop = interpreterProxy.fetchPointerofObject(0, literalStream);\n\tlitPos = interpreterProxy.fetchIntegerofObject(1, literalStream);\n\tlitLimit = interpreterProxy.fetchIntegerofObject(2, literalStream);\n\tif (!((litPos <= litLimit) && (interpreterProxy.isBytes(oop) && (litLimit <= BYTESIZEOF(oop))))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tlitArray = oop.bytes;\n\toop = interpreterProxy.fetchPointerofObject(0, distanceStream);\n\tif (!(interpreterProxy.isWords(oop) && ((litLimit <= SIZEOF(oop)) && ((interpreterProxy.fetchIntegerofObject(1, distanceStream) === litPos) && (interpreterProxy.fetchIntegerofObject(2, distanceStream) === litLimit))))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdistArray = oop.words;\n\toop = interpreterProxy.fetchPointerofObject(0, litTree);\n\tif (!interpreterProxy.isWords(oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tlitBlCount = SIZEOF(oop);\n\tllBitLengths = oop.words;\n\toop = interpreterProxy.fetchPointerofObject(1, litTree);\n\tif (!(interpreterProxy.isWords(oop) && (litBlCount === SIZEOF(oop)))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tllCodes = oop.words;\n\toop = interpreterProxy.fetchPointerofObject(0, distTree);\n\tif (!interpreterProxy.isWords(oop)) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdistBlCount = SIZEOF(oop);\n\tdistBitLengths = oop.words;\n\toop = interpreterProxy.fetchPointerofObject(1, distTree);\n\tif (!(interpreterProxy.isWords(oop) && (distBlCount === SIZEOF(oop)))) {\n\t\treturn interpreterProxy.primitiveFail();\n\t}\n\tdistCodes = oop.words;\n\tnextZipBitsput(0, 0);\n\tsum = 0;\n\twhile ((litPos < litLimit) && ((zipPosition + 4) < zipCollectionSize)) {\n\t\tlit = litArray[litPos];\n\t\tdist = distArray[litPos];\n\t\t++litPos;\n\t\tif (dist === 0) {\n\n\t\t\t/* literal */\n\n\t\t\t++sum;\n\t\t\tif (!(lit < litBlCount)) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tnextZipBitsput(llBitLengths[lit], llCodes[lit]);\n\t\t} else {\n\n\t\t\t/* match */\n\n\t\t\tsum = (sum + lit) + DeflateMinMatch;\n\t\t\tif (!(lit < 256)) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tcode = zipMatchLengthCodes[lit];\n\t\t\tif (!(code < litBlCount)) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tnextZipBitsput(llBitLengths[code], llCodes[code]);\n\t\t\textra = zipExtraLengthBits[code - 257];\n\t\t\tif (extra !== 0) {\n\t\t\t\tlit -= zipBaseLength[code - 257];\n\t\t\t\tnextZipBitsput(extra, lit);\n\t\t\t}\n\t\t\t--dist;\n\t\t\tif (!(dist < 32768)) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tif (dist < 256) {\n\t\t\t\tcode = zipDistanceCodes[dist];\n\t\t\t} else {\n\t\t\t\tcode = zipDistanceCodes[256 + (dist >>> 7)];\n\t\t\t}\n\t\t\tif (!(code < distBlCount)) {\n\t\t\t\treturn interpreterProxy.primitiveFail();\n\t\t\t}\n\t\t\tnextZipBitsput(distBitLengths[code], distCodes[code]);\n\t\t\textra = zipExtraDistanceBits[code];\n\t\t\tif (extra !== 0) {\n\t\t\t\tdist -= zipBaseDistance[code];\n\t\t\t\tnextZipBitsput(extra, dist);\n\t\t\t}\n\t\t}\n\t}\n\tif (interpreterProxy.failed()) {\n\t\treturn null;\n\t}\n\tinterpreterProxy.storeIntegerofObjectwithValue(1, literalStream, litPos);\n\tinterpreterProxy.storeIntegerofObjectwithValue(1, distanceStream, litPos);\n\treturn sum;\n}\n\n\n/*\tNote: This is coded so that is can be run from Squeak. */\n\nfunction setInterpreter(anInterpreter) {\n\tvar ok;\n\n\tinterpreterProxy = anInterpreter;\n\tok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;\n\tif (ok === false) {\n\t\treturn false;\n\t}\n\tok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;\n\treturn ok;\n}\n\n\n/*\tCheck if we should flush the current block.\n\tFlushing can be useful if the input characteristics change. */\n\nfunction shouldFlush() {\n\tvar nLits;\n\n\tif (zipLiteralCount === zipLiteralSize) {\n\t\treturn true;\n\t}\n\tif ((zipLiteralCount & 4095) !== 0) {\n\t\treturn false;\n\t}\n\tif ((zipMatchCount * 10) <= zipLiteralCount) {\n\n\t\t/* This is basically random data. \n\t\tThere is no need to flush early since the overhead\n\t\tfor encoding the trees will add to the overall size */\n\n\t\treturn false;\n\t}\n\tnLits = zipLiteralCount - zipMatchCount;\n\tif (nLits <= zipMatchCount) {\n\t\treturn false;\n\t}\n\treturn (nLits * 4) <= zipMatchCount;\n}\n\n\n/*\tUpdate the running hash value based on the next input byte.\n\tReturn the new updated hash value. */\n\nfunction updateHash(nextValue) {\n\treturn ((zipHashValue << 5) ^ nextValue) & DeflateHashMask;\n}\n\n\n/*\tUpdate the hash value at position here (one based) */\n\nfunction updateHashAt(here) {\n\treturn updateHash(zipCollection[here]);\n}\n\n\n/*\tDecode the next value in the receiver using the given huffman table. */\n\nfunction zipDecodeValueFromsize(table, tableSize) {\n\tvar bits;\n\tvar bitsNeeded;\n\tvar index;\n\tvar tableIndex;\n\tvar value;\n\n\n\t/* Initial bits needed */\n\n\tbitsNeeded = table[0] >>> 24;\n\tif (bitsNeeded > MaxBits) {\n\t\tinterpreterProxy.primitiveFail();\n\t\treturn 0;\n\t}\n\n\t/* First real table */\n\n\ttableIndex = 2;\n\twhile (true) {\n\n\t\t/* Get bits */\n\n\t\tbits = zipNextBits(bitsNeeded);\n\t\tindex = (tableIndex + bits) - 1;\n\t\tif (index >= tableSize) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn 0;\n\t\t}\n\n\t\t/* Lookup entry in table */\n\n\t\tvalue = table[index];\n\t\tif ((value & 1056964608) === 0) {\n\t\t\treturn value;\n\t\t}\n\n\t\t/* Table offset in low 16 bit */\n\n\t\ttableIndex = value & 65535;\n\n\t\t/* Additional bits in high 8 bit */\n\n\t\tbitsNeeded = (value >>> 24) & 255;\n\t\tif (bitsNeeded > MaxBits) {\n\t\t\tinterpreterProxy.primitiveFail();\n\t\t\treturn 0;\n\t\t}\n\t}\n\treturn 0;\n}\n\nfunction zipDecompressBlock() {\n\tvar distance;\n\tvar dstPos;\n\tvar extra;\n\tvar i;\n\tvar length;\n\tvar max;\n\tvar oldBitPos;\n\tvar oldBits;\n\tvar oldPos;\n\tvar srcPos;\n\tvar value;\n\n\tmax = zipCollectionSize - 1;\n\twhile ((zipReadLimit < max) && (zipSourcePos <= zipSourceLimit)) {\n\n\t\t/* Back up stuff if we're running out of space */\n\n\t\toldBits = zipBitBuf;\n\t\toldBitPos = zipBitPos;\n\t\toldPos = zipSourcePos;\n\t\tvalue = zipDecodeValueFromsize(zipLitTable, zipLitTableSize);\n\t\tif (value < 256) {\n\n\t\t\t/* A literal */\n\n\t\t\tzipCollection[(++zipReadLimit)] = value;\n\t\t} else {\n\n\t\t\t/* length/distance or end of block */\n\n\t\t\tif (value === 256) {\n\n\t\t\t\t/* End of block */\n\n\t\t\t\tzipState = zipState & StateNoMoreData;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\textra = (value >>> 16) - 1;\n\t\t\tlength = value & 65535;\n\t\t\tif (extra > 0) {\n\t\t\t\tlength += zipNextBits(extra);\n\t\t\t}\n\t\t\tvalue = zipDecodeValueFromsize(zipDistTable, zipDistTableSize);\n\t\t\textra = value >>> 16;\n\t\t\tdistance = value & 65535;\n\t\t\tif (extra > 0) {\n\t\t\t\tdistance += zipNextBits(extra);\n\t\t\t}\n\t\t\tif ((zipReadLimit + length) >= max) {\n\t\t\t\tzipBitBuf = oldBits;\n\t\t\t\tzipBitPos = oldBitPos;\n\t\t\t\tzipSourcePos = oldPos;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tdstPos = zipReadLimit;\n\t\t\tsrcPos = zipReadLimit - distance;\n\t\t\tfor (i = 1; i <= length; i++) {\n\t\t\t\tzipCollection[dstPos + i] = zipCollection[srcPos + i];\n\t\t\t}\n\t\t\tzipReadLimit += length;\n\t\t}\n\t}\n}\n\nfunction zipNextBits(n) {\n\tvar bits;\n\tvar byte;\n\n\twhile (zipBitPos < n) {\n\t\tbyte = zipSource[(++zipSourcePos)];\n\t\tzipBitBuf += SHL(byte, zipBitPos);\n\t\tzipBitPos += 8;\n\t}\n\tbits = zipBitBuf & ((SHL(1, n)) - 1);\n\tzipBitBuf = SHR(zipBitBuf, n);\n\tzipBitPos -= n;\n\treturn bits;\n}\n\n\nSqueak.registerExternalModule(\"ZipPlugin\", {\n\tprimitiveZipSendBlock: primitiveZipSendBlock,\n\tprimitiveUpdateAdler32: primitiveUpdateAdler32,\n\tprimitiveUpdateGZipCrc32: primitiveUpdateGZipCrc32,\n\tprimitiveDeflateUpdateHashTable: primitiveDeflateUpdateHashTable,\n\tsetInterpreter: setInterpreter,\n\tgetModuleName: getModuleName,\n\tprimitiveDeflateBlock: primitiveDeflateBlock,\n\tprimitiveInflateDecompressBlock: primitiveInflateDecompressBlock,\n});\n\n}); // end of module\n","// Copyright (c) 2013 Pieroxy \n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.3.3\nvar LZString = {\n \n \n // private property\n _keyStr : \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\n _f : String.fromCharCode,\n \n compressToBase64 : function (input) {\n if (input == null) return \"\";\n var output = \"\";\n var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n var i = 0;\n \n input = LZString.compress(input);\n \n while (i < input.length*2) {\n \n if (i%2==0) {\n chr1 = input.charCodeAt(i/2) >> 8;\n chr2 = input.charCodeAt(i/2) & 255;\n if (i/2+1 < input.length) \n chr3 = input.charCodeAt(i/2+1) >> 8;\n else \n chr3 = NaN;\n } else {\n chr1 = input.charCodeAt((i-1)/2) & 255;\n if ((i+1)/2 < input.length) {\n chr2 = input.charCodeAt((i+1)/2) >> 8;\n chr3 = input.charCodeAt((i+1)/2) & 255;\n } else \n chr2=chr3=NaN;\n }\n i+=3;\n \n enc1 = chr1 >> 2;\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n enc4 = chr3 & 63;\n \n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n \n output = output +\n LZString._keyStr.charAt(enc1) + LZString._keyStr.charAt(enc2) +\n LZString._keyStr.charAt(enc3) + LZString._keyStr.charAt(enc4);\n \n }\n \n return output;\n },\n \n decompressFromBase64 : function (input) {\n if (input == null) return \"\";\n var output = \"\",\n ol = 0, \n output_,\n chr1, chr2, chr3,\n enc1, enc2, enc3, enc4,\n i = 0, f=LZString._f;\n \n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n \n while (i < input.length) {\n \n enc1 = LZString._keyStr.indexOf(input.charAt(i++));\n enc2 = LZString._keyStr.indexOf(input.charAt(i++));\n enc3 = LZString._keyStr.indexOf(input.charAt(i++));\n enc4 = LZString._keyStr.indexOf(input.charAt(i++));\n \n chr1 = (enc1 << 2) | (enc2 >> 4);\n chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n chr3 = ((enc3 & 3) << 6) | enc4;\n \n if (ol%2==0) {\n output_ = chr1 << 8;\n \n if (enc3 != 64) {\n output += f(output_ | chr2);\n }\n if (enc4 != 64) {\n output_ = chr3 << 8;\n }\n } else {\n output = output + f(output_ | chr1);\n \n if (enc3 != 64) {\n output_ = chr2 << 8;\n }\n if (enc4 != 64) {\n output += f(output_ | chr3);\n }\n }\n ol+=3;\n }\n \n return LZString.decompress(output);\n \n },\n\n compressToUTF16 : function (input) {\n if (input == null) return \"\";\n var output = \"\",\n i,c,\n current,\n status = 0,\n f = LZString._f;\n \n input = LZString.compress(input);\n \n for (i=0 ; i> 1)+32);\n current = (c & 1) << 14;\n break;\n case 1:\n output += f((current + (c >> 2))+32);\n current = (c & 3) << 13;\n break;\n case 2:\n output += f((current + (c >> 3))+32);\n current = (c & 7) << 12;\n break;\n case 3:\n output += f((current + (c >> 4))+32);\n current = (c & 15) << 11;\n break;\n case 4:\n output += f((current + (c >> 5))+32);\n current = (c & 31) << 10;\n break;\n case 5:\n output += f((current + (c >> 6))+32);\n current = (c & 63) << 9;\n break;\n case 6:\n output += f((current + (c >> 7))+32);\n current = (c & 127) << 8;\n break;\n case 7:\n output += f((current + (c >> 8))+32);\n current = (c & 255) << 7;\n break;\n case 8:\n output += f((current + (c >> 9))+32);\n current = (c & 511) << 6;\n break;\n case 9:\n output += f((current + (c >> 10))+32);\n current = (c & 1023) << 5;\n break;\n case 10:\n output += f((current + (c >> 11))+32);\n current = (c & 2047) << 4;\n break;\n case 11:\n output += f((current + (c >> 12))+32);\n current = (c & 4095) << 3;\n break;\n case 12:\n output += f((current + (c >> 13))+32);\n current = (c & 8191) << 2;\n break;\n case 13:\n output += f((current + (c >> 14))+32);\n current = (c & 16383) << 1;\n break;\n case 14:\n output += f((current + (c >> 15))+32, (c & 32767)+32);\n status = 0;\n break;\n }\n }\n \n return output + f(current + 32);\n },\n \n\n decompressFromUTF16 : function (input) {\n if (input == null) return \"\";\n var output = \"\",\n current,c,\n status=0,\n i = 0,\n f = LZString._f;\n \n while (i < input.length) {\n c = input.charCodeAt(i) - 32;\n \n switch (status++) {\n case 0:\n current = c << 1;\n break;\n case 1:\n output += f(current | (c >> 14));\n current = (c&16383) << 2;\n break;\n case 2:\n output += f(current | (c >> 13));\n current = (c&8191) << 3;\n break;\n case 3:\n output += f(current | (c >> 12));\n current = (c&4095) << 4;\n break;\n case 4:\n output += f(current | (c >> 11));\n current = (c&2047) << 5;\n break;\n case 5:\n output += f(current | (c >> 10));\n current = (c&1023) << 6;\n break;\n case 6:\n output += f(current | (c >> 9));\n current = (c&511) << 7;\n break;\n case 7:\n output += f(current | (c >> 8));\n current = (c&255) << 8;\n break;\n case 8:\n output += f(current | (c >> 7));\n current = (c&127) << 9;\n break;\n case 9:\n output += f(current | (c >> 6));\n current = (c&63) << 10;\n break;\n case 10:\n output += f(current | (c >> 5));\n current = (c&31) << 11;\n break;\n case 11:\n output += f(current | (c >> 4));\n current = (c&15) << 12;\n break;\n case 12:\n output += f(current | (c >> 3));\n current = (c&7) << 13;\n break;\n case 13:\n output += f(current | (c >> 2));\n current = (c&3) << 14;\n break;\n case 14:\n output += f(current | (c >> 1));\n current = (c&1) << 15;\n break;\n case 15:\n output += f(current | c);\n status=0;\n break;\n }\n \n \n i++;\n }\n \n return LZString.decompress(output);\n //return output;\n \n },\n\n\n \n compress: function (uncompressed) {\n if (uncompressed == null) return \"\";\n var i, value,\n context_dictionary= {},\n context_dictionaryToCreate= {},\n context_c=\"\",\n context_wc=\"\",\n context_w=\"\",\n context_enlargeIn= 2, // Compensate for the first entry which should not count\n context_dictSize= 3,\n context_numBits= 2,\n context_data_string=\"\", \n context_data_val=0, \n context_data_position=0,\n ii,\n f=LZString._f;\n \n for (ii = 0; ii < uncompressed.length; ii += 1) {\n context_c = uncompressed.charAt(ii);\n if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n context_dictionary[context_c] = context_dictSize++;\n context_dictionaryToCreate[context_c] = true;\n }\n \n context_wc = context_w + context_c;\n if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n context_w = context_wc;\n } else {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i> 1;\n }\n \n \n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n // Add wc to the dictionary.\n context_dictionary[context_wc] = context_dictSize++;\n context_w = String(context_c);\n }\n }\n \n // Output the code for w.\n if (context_w !== \"\") {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i> 1;\n }\n \n \n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n }\n \n // Mark the end of the stream\n value = 2;\n for (i=0 ; i> 1;\n }\n \n // Flush the last char\n while (true) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == 15) {\n context_data_string += f(context_data_val);\n break;\n }\n else context_data_position++;\n }\n return context_data_string;\n },\n \n decompress: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n var dictionary = [],\n next,\n enlargeIn = 4,\n dictSize = 4,\n numBits = 3,\n entry = \"\",\n result = \"\",\n i,\n w,\n bits, resb, maxpower, power,\n c,\n f = LZString._f,\n data = {string:compressed, val:compressed.charCodeAt(0), position:32768, index:1};\n \n for (i = 0; i < 3; i += 1) {\n dictionary[i] = i;\n }\n \n bits = 0;\n maxpower = Math.pow(2,2);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = 32768;\n data.val = data.string.charCodeAt(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n \n switch (next = bits) {\n case 0: \n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = 32768;\n data.val = data.string.charCodeAt(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 1: \n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = 32768;\n data.val = data.string.charCodeAt(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 2: \n return \"\";\n }\n dictionary[3] = c;\n w = result = c;\n while (true) {\n if (data.index > data.string.length) {\n return \"\";\n }\n \n bits = 0;\n maxpower = Math.pow(2,numBits);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = 32768;\n data.val = data.string.charCodeAt(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (c = bits) {\n case 0: \n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = 32768;\n data.val = data.string.charCodeAt(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 1: \n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = 32768;\n data.val = data.string.charCodeAt(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 2: \n return result;\n }\n \n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n \n if (dictionary[c]) {\n entry = dictionary[c];\n } else {\n if (c === dictSize) {\n entry = w + w.charAt(0);\n } else {\n return null;\n }\n }\n result += entry;\n \n // Add w+entry[0] to the dictionary.\n dictionary[dictSize++] = w + entry.charAt(0);\n enlargeIn--;\n \n w = entry;\n \n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n \n }\n }\n};\n\nif( typeof module !== 'undefined' && module != null ) {\n module.exports = LZString\n}\n"]}