retold-data-service 2.0.21 → 2.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.quackage-comprehension-loader.json +19 -0
  2. package/bin/retold-data-service-clone.js +4 -1
  3. package/generate-bookstore-comprehension.js +645 -0
  4. package/package.json +7 -7
  5. package/source/Retold-Data-Service.js +30 -2
  6. package/source/services/comprehension-loader/ComprehensionLoader-Command-Load.js +345 -0
  7. package/source/services/comprehension-loader/ComprehensionLoader-Command-Schema.js +97 -0
  8. package/source/services/comprehension-loader/ComprehensionLoader-Command-Session.js +221 -0
  9. package/source/services/comprehension-loader/ComprehensionLoader-Command-WebUI.js +57 -0
  10. package/source/services/comprehension-loader/Retold-Data-Service-ComprehensionLoader.js +536 -0
  11. package/source/services/comprehension-loader/pict-app/Pict-Application-ComprehensionLoader-Configuration.json +9 -0
  12. package/source/services/comprehension-loader/pict-app/Pict-Application-ComprehensionLoader.js +86 -0
  13. package/source/services/comprehension-loader/pict-app/Pict-ComprehensionLoader-Bundle.js +6 -0
  14. package/source/services/comprehension-loader/pict-app/providers/Pict-Provider-ComprehensionLoader.js +760 -0
  15. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Layout.js +360 -0
  16. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Load.js +472 -0
  17. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Schema.js +119 -0
  18. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Session.js +269 -0
  19. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Source.js +330 -0
  20. package/source/services/comprehension-loader/web/comprehension-loader.js +6794 -0
  21. package/source/services/comprehension-loader/web/comprehension-loader.js.map +1 -0
  22. package/source/services/comprehension-loader/web/comprehension-loader.min.js +2 -0
  23. package/source/services/comprehension-loader/web/comprehension-loader.min.js.map +1 -0
  24. package/source/services/comprehension-loader/web/index.html +17 -0
  25. package/source/services/data-cloner/DataCloner-Command-Schema.js +407 -15
  26. package/source/services/data-cloner/Retold-Data-Service-DataCloner.js +59 -1
  27. package/source/services/data-cloner/pict-app/Pict-Application-DataCloner.js +1 -0
  28. package/source/services/data-cloner/pict-app/providers/Pict-Provider-DataCloner.js +125 -5
  29. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Connection.js +18 -8
  30. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Deploy.js +104 -1
  31. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Export.js +1 -1
  32. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Layout.js +12 -0
  33. package/source/services/data-cloner/web/data-cloner.js +201 -139
  34. package/source/services/data-cloner/web/data-cloner.js.map +1 -1
  35. package/source/services/data-cloner/web/data-cloner.min.js +1 -1
  36. package/source/services/data-cloner/web/data-cloner.min.js.map +1 -1
  37. package/test/RetoldDataService_tests.js +225 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/fable-serviceproviderbase/package.json","comprehension-loader.js","node_modules/fable-serviceproviderbase/source/Fable-ServiceProviderBase.js","node_modules/pict-application/package.json","node_modules/pict-application/source/Pict-Application.js","node_modules/pict-provider/package.json","node_modules/pict-provider/source/Pict-Provider.js","node_modules/pict-section-histogram/source/Pict-Section-Histogram-DefaultConfiguration.js","node_modules/pict-section-histogram/source/Pict-Section-Histogram.js","node_modules/pict-section-histogram/source/renderers/Pict-Histogram-Renderer-Browser.js","node_modules/pict-section-histogram/source/renderers/Pict-Histogram-Renderer-CLI.js","node_modules/pict-section-histogram/source/renderers/Pict-Histogram-Renderer-ConsoleUI.js","node_modules/pict-view/package.json","node_modules/pict-view/source/Pict-View.js","node_modules/process/browser.js","source/services/comprehension-loader/pict-app/Pict-Application-ComprehensionLoader-Configuration.json","source/services/comprehension-loader/pict-app/Pict-Application-ComprehensionLoader.js","source/services/comprehension-loader/pict-app/Pict-ComprehensionLoader-Bundle.js","source/services/comprehension-loader/pict-app/providers/Pict-Provider-ComprehensionLoader.js","source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Layout.js","source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Load.js","source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Schema.js","source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Session.js","source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Source.js"],"names":["f","exports","module","define","amd","g","window","global","self","comprehensionLoader","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","libPackage","FableServiceProviderBase","constructor","pFable","pOptions","pServiceHash","fable","UUID","options","services","servicesMap","isFable","connectFable","_PackageFableServiceProvider","getUUID","Math","floor","random","serviceType","Hash","tmpErrorMessage","console","log","Logging","isFableService","CoreServiceProviderBase","libFableServiceBase","defaultPictSettings","Name","MainViewportViewIdentifier","MainViewportRenderableHash","MainViewportDestinationAddress","MainViewportDefaultDataAddress","AutoSolveAfterInitialize","AutoRenderMainViewportViewAfterInitialize","AutoRenderViewsAfterInitialize","AutoLoginAfterInitialize","AutoLoadDataAfterLogin","ConfigurationOnlyViews","Manifests","IdentifierAddressPrefix","PictApplication","tmpCarryOverConfiguration","settings","PictApplicationConfiguration","tmpOptions","Object","assign","JSON","parse","stringify","_Package","pict","AppData","Bundle","initializeTimestamp","lastSolvedTimestamp","lastLoginTimestamp","lastMarshalFromViewsTimestamp","lastMarshalToViewsTimestamp","lastAutoRenderTimestamp","lastLoadDataTimestamp","tmpManifestKeys","keys","tmpManifestKey","instantiateServiceProvider","onPreSolve","LogNoisiness","trace","onPreSolveAsync","fCallback","onBeforeSolve","onBeforeSolveAsync","onSolve","onSolveAsync","solve","tmpLoadedProviders","providers","tmpProvidersToSolve","tmpProvider","AutoSolveWithApp","push","sort","b","AutoSolveOrdinal","tmpLoadedViews","views","tmpViewsToSolve","tmpView","AutoInitialize","AutoInitializeOrdinal","onAfterSolve","getTimeStamp","solveAsync","tmpAnticipate","instantiateServiceProviderWithoutRegistration","anticipate","bind","tmpCallback","warn","pError","error","onAfterSolveAsync","wait","onBeforeLoginAsync","onLoginAsync","loginAsync","onAfterLoginAsync","fNext","isLoggedIn","loadDataAsync","onBeforeLoadDataAsync","onLoadDataAsync","tmpProvidersToLoadData","AutoLoadDataWithApp","AutoLoadDataOrdinal","onAfterLoadDataAsync","onBeforeSaveDataAsync","onSaveDataAsync","saveDataAsync","tmpProvidersToSaveData","AutoSaveDataWithApp","AutoSaveDataOrdinal","onAfterSaveDataAsync","lastSaveDataTimestamp","onBeforeInitialize","onBeforeInitializeAsync","onInitialize","onInitializeAsync","initialize","LogControlFlow","tmpViewIdentifier","ViewIdentifier","info","addView","tmpProvidersToInitialize","tmpViewsToInitialize","onAfterInitialize","render","onCompletionOfInitialize","initializeAsync","onAfterInitializeAsync","renderMainViewportAsync","message","stack","onCompletionOfInitializeAsync","onBeforeMarshalFromViews","onBeforeMarshalFromViewsAsync","onMarshalFromViews","onMarshalFromViewsAsync","marshalFromViews","tmpViewsToMarshalFromViews","marshalFromView","onAfterMarshalFromViews","marshalFromViewsAsync","marshalFromViewAsync","onAfterMarshalFromViewsAsync","onBeforeMarshalToViews","onBeforeMarshalToViewsAsync","onMarshalToViews","onMarshalToViewsAsync","marshalToViews","tmpViewsToMarshalToViews","marshalToView","onAfterMarshalToViews","marshalToViewsAsync","marshalToViewAsync","onAfterMarshalToViewsAsync","onBeforeRender","onBeforeRenderAsync","pViewIdentifier","pRenderableHash","pRenderDestinationAddress","pTemplateDataAddress","tmpRenderableHash","tmpRenderDestinationAddress","tmpTemplateDataAddress","PictView","onRender","onAfterRender","onRenderAsync","renderAsync","tmpRenderAnticipate","newAnticipate","onAfterRenderAsync","renderMainViewport","renderAutoViews","AutoRenderOrdinal","AutoRender","renderAutoViewsAsync","isPictApplication","defaultPictProviderSettings","ProviderIdentifier","Templates","PictProvider","tmpDefaultTemplate","hasOwnProperty","Source","TemplateProvider","addDefaultTemplate","Prefix","Postfix","Template","Stack","onPreRender","onPreRenderAsync","libPictViewClass","_DefaultConfiguration","libRendererBrowser","libRendererConsoleUI","libRendererCLI","PictSectionHistogram","initialRenderComplete","_selectedIndices","Set","_selectionRangeStart","_selectionRangeEnd","_renderer","_resolveRenderer","_applyInitialSelection","InitialSelection","setSelection","Selectable","SelectionMode","tmpBins","getBins","max","_syncSelectionFromRange","RenderMode","DataAddress","tmpAddressSpace","Fable","Pict","Options","tmpData","manifest","getValueByHash","Array","isArray","Bins","setBins","pBins","setValueByHash","isIndexSelected","pIndex","has","isIndexInRange","getSelection","tmpIndices","Mode","RangeStart","RangeEnd","SelectedIndices","StartLabel","LabelProperty","EndLabel","from","pSelection","Start","End","_writeSelectionToAddress","handleBarClick","clear","add","delete","onSelectionChange","renderHistogram","handleRangeBarClick","tmpDistStart","abs","tmpDistEnd","min","SelectionDataAddress","pRenderable","CSSMap","injectCSS","onAfterInitialRender","wireEvents","setOrientation","pOrientation","Orientation","setRenderMode","pRenderMode","toText","renderVertical","renderHorizontal","default_configuration","renderers","browser","consoleui","cli","buildBarGroupHTML","pBin","pBarSize","pIsSelected","pInRange","pLabelWidth","tmpLabel","tmpValue","ValueProperty","tmpVertical","tmpBarColor","SelectedBarColor","SelectionRangeColor","BarColor","tmpSelectableClass","tmpSelectedClass","tmpInRangeClass","tmpFillMode","FillContainer","tmpBarStyle","BarThickness","tmpGroupWidth","BarGap","tmpGroupStyle","tmpHTML","ShowValues","ShowLabels","tmpLabelStyle","buildRangeSliderHTML","pView","tmpRangeStart","tmpRangeEnd","tmpMax","tmpStartPct","tmpEndPct","buildFillLabelRow","tmpLabelInterval","LabelInterval","tmpTargetElementSet","ContentAssignment","getElement","TargetElementAddress","tmpContainerWidth","clientWidth","tmpBarWidth","ceil","tmpIsLabeled","tmpSpan","assignContent","tmpMaxValue","tmpVal","tmpOrientationClass","tmpFillClass","tmpLabelWidth","String","tmpEstWidth","tmpBarSize","round","MaxBarSize","tmpIsSelected","tmpInRange","tmpContainer","tmpBars","querySelectorAll","addEventListener","pEvent","tmpIndex","parseInt","currentTarget","getAttribute","isNaN","tmpHandles","wireRangeHandle","pHandle","pContainer","tmpHandleType","tmpDragging","getSliderBounds","tmpSlider","querySelector","start","size","tmpRect","getBoundingClientRect","left","width","top","height","onPointerMove","tmpBounds","tmpPos","clientX","clientY","tmpPct","onPointerUp","document","removeEventListener","preventDefault","process","ANSI_COLORS","colorToAnsi","pColor","blue","tmpLower","toLowerCase","charAt","tmpR","substring","tmpG","tmpB","green","red","yellow","magenta","cyan","tmpHeight","TextHeight","tmpBarChar","BarCharacter","tmpPartials","BarPartialCharacters","tmpSelectedColor","tmpRangeColor","tmpReset","reset","tmpValueAxisWidth","tmpLines","tmpRow","tmpLine","dim","padLeft","tmpBarHeight","tmpFullRows","tmpFraction","tmpColor","tmpChar","tmpPartialIndex","tmpAxisLine","tmpLabelLine","padCenter","tmpStart","tmpEnd","tmpStartLabel","tmpEndLabel","bold","join","tmpWidth","TextWidth","tmpMaxLabelLen","tmpValueWidth","tmpBarLen","tmpBar","j","padRight","tmpText","stdout","write","pStr","pLen","tmpStr","tmpEmptyChar","EmptyCharacter","tmpRangeLine","tmpFullChars","tmpMarker","tmpValueStr","defaultPictViewSettings","DefaultRenderable","DefaultDestinationAddress","DefaultTemplateRecordAddress","CSSHash","CSS","CSSProvider","CSSPriority","DefaultTemplates","Renderables","tmpHashIsUUID","lastRenderedTimestamp","lastMarshalFromViewTimestamp","lastMarshalToViewTimestamp","instantiateServiceProviderIfNotExists","tmpTemplate","addTemplate","tmpCSSHash","tmpCSSProvider","addCSS","renderables","tmpRenderable","addRenderable","pTemplateHash","pDefaultTemplateRecordAddress","pDefaultDestinationAddress","pRenderMethod","tmpRenderMethod","RenderableHash","TemplateHash","ContentDestinationAddress","RenderMethod","onBeforeProject","onBeforeProjectAsync","buildRenderOptions","pTemplateRecordAddress","tmpRenderOptions","Valid","Renderable","DestinationAddress","RecordAddress","Record","DataProvider","getDataByAddress","undefined","assignRenderContent","pContent","projectContent","TestAddress","pRootRenderable","renderWithScope","pScope","TransactionHash","RootRenderableViewHash","TransactionTracking","registerTransaction","tmpRecordAddress","tmpRecord","Content","parseTemplateByHash","RootRenderable","onProject","onAfterProject","renderWithScopeAsync","fOnBeforeRenderCallback","fAsyncTemplateCallback","onProjectAsync","onAfterProjectAsync","renderDefaultAsync","basicRender","basicRenderWithScope","basicRenderAsync","basicRenderWithScopeAsync","pushToTransactionQueue","ViewHash","tmpTransactionQueue","clearTransactionQueue","tmpEvent","Data","queue","event","onBeforeMarshalFromView","onBeforeMarshalFromViewAsync","onMarshalFromView","onMarshalFromViewAsync","onAfterMarshalFromView","onAfterMarshalFromViewAsync","onBeforeMarshalToView","onBeforeMarshalToViewAsync","onMarshalToView","onMarshalToViewAsync","onAfterMarshalToView","onAfterMarshalToViewAsync","isPictView","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","setTimeout","clearTimeout","runTimeout","fun","runClearTimeout","marker","draining","currentQueue","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","nextTick","args","arguments","Item","array","prototype","apply","title","env","argv","version","versions","noop","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","name","binding","cwd","chdir","dir","umask","libPictApplication","libProvider","libViewLayout","libViewSession","libViewSchema","libViewSource","libViewLoad","libViewHistogram","ComprehensionLoaderApplication","addProvider","RenderOnLoad","ComprehensionLoader","FetchedEntities","LastReport","ServerBusyAtLoad","LoadPollTimer","LiveStatusTimer","StatusDetailExpanded","StatusDetailTimer","StatusDetailData","LastLiveStatus","PersistFields","initPersistence","startLiveStatusPolling","initAccordionPreviews","updateAllPreviews","collapseAllSections","initAutoProcess","libPictProvider","ComprehensionLoaderProvider","api","pMethod","pPath","pBody","tmpOpts","method","headers","body","fetch","then","pResponse","json","setStatus","pElementId","pMessage","pType","tmpEl","getElementById","className","textContent","style","display","escapeHtml","tmpDiv","createElement","appendChild","createTextNode","innerHTML","setSectionPhase","pSection","pState","classList","tmpServerURL","value","tmpUserName","tmpPreview1","tmpEntities","tmpSchemaURL","tmpSourceMode","tmpModeName","tmpURL","tmpPreview4El","tmpSelf","tmpPreviewFields","tmpHandler","forEach","pEl","saveField","pFieldId","localStorage","setItem","restoreFields","tmpPersistFields","tmpId","tmpSaved","getItem","tmpFileRadio","checked","pId","tmpAutoIds","tmpAppData","clearInterval","pollLiveStatus","setInterval","pData","renderLiveStatus","catch","Phase","Message","TotalPushed","TotalRecords","tmpMsg","tmpMeta","tmpProgressFill","tmpWasExpanded","contains","tmpMetaParts","Elapsed","ETA","TotalEntities","Completed","tmpPushed","toString","replace","tmpTotal","Errors","tmpLayoutView","toggleStatusDetail","renderStatusDetail","pReportData","ReportVersion","onStatusDetailExpanded","pollStatusDetail","onStatusDetailCollapsed","tmpLiveStatus","tmpStatusData","tmpReport","tmpThroughputSamples","tmpIsLive","Entities","ThroughputSamples","tmpE","tmpRunning","tmpPending","tmpCompleted","tmpErrors","tmpEntityNames","tmpName","Status","tmpHtml","tmpOp","Total","Pushed","tmpPushedFmt","formatNumber","tmpTotalFmt","ErrorMessage","updateThroughputHistogram","pSamples","tmpHistContainer","tmpRawDeltas","tmpDelta","pushed","delta","tmpMaxBars","tmpAggregated","tmpBucketSize","tmpSum","tmpLastT","tmpHasData","tmpStartT","tmpElapsedSec","Label","formatElapsed","Value","tmpHistView","pSec","tmpM","tmpS","tmpH","formatCompact","pNum","toFixed","startPolling","runAutoProcessChain","tmpDelay","tmpStepDelay","goAction","fetchSchema","startLoad","libPictView","ComprehensionLoaderLayoutView","toggleSection","pSectionId","tmpCard","toggle","expandAllSections","tmpCards","remove","tmpDetail","tmpMessage","tmpToggle","tmpIsExpanded","ComprehensionLoaderLoadView","Success","stopLoad","pollLoadStatus","stopPolling","renderLoadProgress","Running","tmpNames","tmpHasErrors","fetchLoadReport","renderLoadReport","pReport","tmpSection","tmpCardsContainer","tmpOutcomeClass","Outcome","tmpOutcomeColor","Partial","Stopped","tmpDurationSec","RunTimestamps","DurationSeconds","tmpDurationStr","tmpTotalPushed","Summary","tmpTotalRecords","Complete","tmpAnomalyContainer","Anomalies","tmpAnomaly","tmpTypeColor","Type","Entity","tmpEntityContainer","tmpEntity","tmpDur","tmpRecs","tmpStatusColor","downloadReport","tmpJson","tmpBlob","Blob","type","tmpAnchor","href","URL","createObjectURL","tmpTimestamp","Date","toISOString","slice","download","click","revokeObjectURL","copyReport","navigator","clipboard","writeText","tmpPushing","fRenderRow","pName","pEntity","tmpShowCount","ComprehensionLoaderSchemaView","trim","tmpBody","SchemaURL","EntityCount","renderEntityList","ComprehensionLoaderSessionView","configureSession","ServerURL","tmpAuthMethod","AuthenticationMethod","tmpAuthURI","AuthenticationURITemplate","tmpCheckURI","CheckSessionURITemplate","tmpCookieName","CookieName","tmpCookieValueAddr","CookieValueAddress","tmpCookieValueTemplate","CookieValueTemplate","tmpLoginMarker","CheckSessionLoginMarker","DomainMatch","authenticate","tmpPassword","UserName","Password","Authenticated","checkSession","Configured","deauthenticate","ComprehensionLoaderSourceView","onSourceModeChange","tmpMode","tmpURLSection","tmpFileSection","fetchFromURL","ok","status","sendComprehensionToServer","pProxyData","renderComprehensionSummary","pProxyError","loadFromFiles","tmpFileInput","files","tmpFiles","tmpMergedData","tmpFilesRead","pFile","tmpReader","FileReader","onload","tmpParsed","target","result","tmpKeys","k","tmpKey","pParseError","onerror","readAsText","Comprehension","pResult","tmpEntityList","EntityList","tmpRecordCounts","RecordCounts","tmpCount","clearComprehension"],"mappings":"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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACA,CAAA;IN6oEA,CAAC,EAAC,CAAC,CAAC,CAAC;IAAC,CAAC,EAAC,CAAC,UAASgB,OAAO,EAACf,MAAM,EAACD,OAAO,EAAC;MOx9EzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;MAEA,MAAAsO,gBAAA,GAAAtN,OAAA,CAAA,WAAA,CAAA;MACA,MAAAuN,qBAAA,GAAAvN,OAAA,CAAA,kDAAA,CAAA;MAEA,MAAAwN,kBAAA,GAAAxN,OAAA,CAAA,gDAAA,CAAA;MACA,MAAAyN,oBAAA,GAAAzN,OAAA,CAAA,kDAAA,CAAA;MACA,MAAA0N,cAAA,GAAA1N,OAAA,CAAA,4CAAA,CAAA;MAEA,MAAA2N,oBAAA,SAAAL,g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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAA;QACA7Q,SAAA,EACA,CACA;UACA9K,IAAA,EAAA,4BAAA;UACAuL,QAAA,EAAA,QAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;QACA,CAAA,CACA;QACAwQ,WAAA,EACA,CACA;UACAmB,cAAA,EAAA,4BAAA;UACAC,YAAA,EAAA,4BAAA;UACAU,kBAAA,EAAA;QACA,CAAA;MAEA,CAAA;IlB0kNA,CAAC,EAAC;MAAC,WAAW,EAAC;IAAE,CAAC,CAAC;IAAC,EAAE,EAAC,CAAC,UAASxf,OAAO,EAACf,MAAM,EAACD,OAAO,EAAC;MmBj7NxD,MAAAm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","file":"comprehension-loader.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","module.exports={\n \"name\": \"fable-serviceproviderbase\",\n \"version\": \"3.0.19\",\n \"description\": \"Simple base classes for fable services.\",\n \"main\": \"source/Fable-ServiceProviderBase.js\",\n \"scripts\": {\n \"start\": \"node source/Fable-ServiceProviderBase.js\",\n \"test\": \"npx quack test\",\n \"tests\": \"npx quack test -g\",\n \"coverage\": \"npx quack coverage\",\n \"build\": \"npx quack build\",\n \"types\": \"tsc -p ./tsconfig.build.json\",\n \"check\": \"tsc -p . --noEmit\"\n },\n \"types\": \"types/source/Fable-ServiceProviderBase.d.ts\",\n \"mocha\": {\n \"diff\": true,\n \"extension\": [\n \"js\"\n ],\n \"package\": \"./package.json\",\n \"reporter\": \"spec\",\n \"slow\": \"75\",\n \"timeout\": \"5000\",\n \"ui\": \"tdd\",\n \"watch-files\": [\n \"source/**/*.js\",\n \"test/**/*.js\"\n ],\n \"watch-ignore\": [\n \"lib/vendor\"\n ]\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/stevenvelozo/fable-serviceproviderbase.git\"\n },\n \"keywords\": [\n \"entity\",\n \"behavior\"\n ],\n \"author\": \"Steven Velozo <steven@velozo.com> (http://velozo.com/)\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/stevenvelozo/fable-serviceproviderbase/issues\"\n },\n \"homepage\": \"https://github.com/stevenvelozo/fable-serviceproviderbase\",\n \"devDependencies\": {\n \"@types/mocha\": \"^10.0.10\",\n \"fable\": \"^3.1.62\",\n \"quackage\": \"^1.0.58\",\n \"typescript\": \"^5.9.3\"\n }\n}\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.comprehensionLoader = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\nmodule.exports={\n \"name\": \"fable-serviceproviderbase\",\n \"version\": \"3.0.19\",\n \"description\": \"Simple base classes for fable services.\",\n \"main\": \"source/Fable-ServiceProviderBase.js\",\n \"scripts\": {\n \"start\": \"node source/Fable-ServiceProviderBase.js\",\n \"test\": \"npx quack test\",\n \"tests\": \"npx quack test -g\",\n \"coverage\": \"npx quack coverage\",\n \"build\": \"npx quack build\",\n \"types\": \"tsc -p ./tsconfig.build.json\",\n \"check\": \"tsc -p . --noEmit\"\n },\n \"types\": \"types/source/Fable-ServiceProviderBase.d.ts\",\n \"mocha\": {\n \"diff\": true,\n \"extension\": [\n \"js\"\n ],\n \"package\": \"./package.json\",\n \"reporter\": \"spec\",\n \"slow\": \"75\",\n \"timeout\": \"5000\",\n \"ui\": \"tdd\",\n \"watch-files\": [\n \"source/**/*.js\",\n \"test/**/*.js\"\n ],\n \"watch-ignore\": [\n \"lib/vendor\"\n ]\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/stevenvelozo/fable-serviceproviderbase.git\"\n },\n \"keywords\": [\n \"entity\",\n \"behavior\"\n ],\n \"author\": \"Steven Velozo <steven@velozo.com> (http://velozo.com/)\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/stevenvelozo/fable-serviceproviderbase/issues\"\n },\n \"homepage\": \"https://github.com/stevenvelozo/fable-serviceproviderbase\",\n \"devDependencies\": {\n \"@types/mocha\": \"^10.0.10\",\n \"fable\": \"^3.1.62\",\n \"quackage\": \"^1.0.58\",\n \"typescript\": \"^5.9.3\"\n }\n}\n\n},{}],2:[function(require,module,exports){\n/**\n* Fable Service Base\n* @author <steven@velozo.com>\n*/\n\nconst libPackage = require('../package.json');\n\nclass FableServiceProviderBase\n{\n\t/**\n\t * The constructor can be used in two ways:\n\t * 1) With a fable, options object and service hash (the options object and service hash are optional)a\n\t * 2) With an object or nothing as the first parameter, where it will be treated as the options object\n\t *\n\t * @param {import('fable')|Record<string, any>} [pFable] - (optional) The fable instance, or the options object if there is no fable\n\t * @param {Record<string, any>|string} [pOptions] - (optional) The options object, or the service hash if there is no fable\n\t * @param {string} [pServiceHash] - (optional) The service hash to identify this service instance\n\t */\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\t/** @type {import('fable')} */\n\t\tthis.fable;\n\t\t/** @type {string} */\n\t\tthis.UUID;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.options;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.services;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.servicesMap;\n\n\t\t// Check if a fable was passed in; connect it if so\n\t\tif ((typeof(pFable) === 'object') && pFable.isFable)\n\t\t{\n\t\t\tthis.connectFable(pFable);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.fable = false;\n\t\t}\n\n\t\t// Initialize the services map if it wasn't passed in\n\t\t/** @type {Record<string, any>} */\n\t\tthis._PackageFableServiceProvider = libPackage;\n\n\t\t// initialize options and UUID based on whether the fable was passed in or not.\n\t\tif (this.fable)\n\t\t{\n\t\t\tthis.UUID = pFable.getUUID();\n\t\t\tthis.options = (typeof(pOptions) === 'object') ? pOptions\n\t\t\t\t\t\t\t: {};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// With no fable, check to see if there was an object passed into either of the first two\n\t\t\t// Parameters, and if so, treat it as the options object\n\t\t\tthis.options = ((typeof(pFable) === 'object') && !pFable.isFable) ? pFable\n\t\t\t\t\t\t\t: (typeof(pOptions) === 'object') ? pOptions\n\t\t\t\t\t\t\t: {};\n\t\t\tthis.UUID = `CORE-SVC-${Math.floor((Math.random() * (99999 - 10000)) + 10000)}`\n\t\t}\n\n\t\t// It's expected that the deriving class will set this\n\t\tthis.serviceType = `Unknown-${this.UUID}`;\n\n\t\t// The service hash is used to identify the specific instantiation of the service in the services map\n\t\tthis.Hash = (typeof(pServiceHash) === 'string') ? pServiceHash \n\t\t\t\t\t: (!this.fable && (typeof(pOptions) === 'string')) ? pOptions\n\t\t\t\t\t: `${this.UUID}`;\n\t}\n\n\t/**\n\t * @param {import('fable')} pFable\n\t */\n\tconnectFable(pFable)\n\t{\n\t\tif ((typeof(pFable) !== 'object') || (!pFable.isFable))\n\t\t{\n\t\t\tlet tmpErrorMessage = `Fable Service Provider Base: Cannot connect to Fable, invalid Fable object passed in. The pFable parameter was a [${typeof(pFable)}].}`;\n\t\t\tconsole.log(tmpErrorMessage);\n\t\t\treturn new Error(tmpErrorMessage);\n\t\t}\n\n\t\tif (!this.fable)\n\t\t{\n\t\t\tthis.fable = pFable;\n\t\t}\n\n\t\tif (!this.log)\n\t\t{\n\t\t\tthis.log = this.fable.Logging;\n\t\t}\n\t\tif (!this.services)\n\t\t{\n\t\t\tthis.services = this.fable.services;\n\t\t}\n\n\t\tif (!this.servicesMap)\n\t\t{\n\t\t\tthis.servicesMap = this.fable.servicesMap;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tstatic isFableService = true;\n}\n\nmodule.exports = FableServiceProviderBase;\n\n// This is left here in case we want to go back to having different code/base class for \"core\" services\nmodule.exports.CoreServiceProviderBase = FableServiceProviderBase;\n\n},{\"../package.json\":1}],3:[function(require,module,exports){\nmodule.exports={\n \"name\": \"pict-application\",\n \"version\": \"1.0.33\",\n \"description\": \"Application base class for a pict view-based application\",\n \"main\": \"source/Pict-Application.js\",\n \"scripts\": {\n \"test\": \"npx quack test\",\n \"start\": \"node source/Pict-Application.js\",\n \"coverage\": \"npx quack coverage\",\n \"build\": \"npx quack build\",\n \"docker-dev-build\": \"docker build ./ -f Dockerfile_LUXURYCode -t pict-application-image:local\",\n \"docker-dev-run\": \"docker run -it -d --name pict-application-dev -p 30001:8080 -p 38086:8086 -v \\\"$PWD/.config:/home/coder/.config\\\" -v \\\"$PWD:/home/coder/pict-application\\\" -u \\\"$(id -u):$(id -g)\\\" -e \\\"DOCKER_USER=$USER\\\" pict-application-image:local\",\n \"docker-dev-shell\": \"docker exec -it pict-application-dev /bin/bash\",\n \"tests\": \"npx quack test -g\",\n \"lint\": \"eslint source/**\",\n \"types\": \"tsc -p .\"\n },\n \"types\": \"types/source/Pict-Application.d.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/stevenvelozo/pict-application.git\"\n },\n \"author\": \"steven velozo <steven@velozo.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/stevenvelozo/pict-application/issues\"\n },\n \"homepage\": \"https://github.com/stevenvelozo/pict-application#readme\",\n \"devDependencies\": {\n \"@eslint/js\": \"^9.28.0\",\n \"browser-env\": \"^3.3.0\",\n \"eslint\": \"^9.28.0\",\n \"pict\": \"^1.0.348\",\n \"pict-provider\": \"^1.0.10\",\n \"pict-view\": \"^1.0.66\",\n \"quackage\": \"^1.0.58\",\n \"typescript\": \"^5.9.3\"\n },\n \"mocha\": {\n \"diff\": true,\n \"extension\": [\n \"js\"\n ],\n \"package\": \"./package.json\",\n \"reporter\": \"spec\",\n \"slow\": \"75\",\n \"timeout\": \"5000\",\n \"ui\": \"tdd\",\n \"watch-files\": [\n \"source/**/*.js\",\n \"test/**/*.js\"\n ],\n \"watch-ignore\": [\n \"lib/vendor\"\n ]\n },\n \"dependencies\": {\n \"fable-serviceproviderbase\": \"^3.0.19\"\n }\n}\n\n},{}],4:[function(require,module,exports){\nconst libFableServiceBase = require('fable-serviceproviderbase')\n\nconst libPackage = require('../package.json');\n\nconst defaultPictSettings = (\n\t{\n\t\tName: 'DefaultPictApplication',\n\n\t\t// The main \"viewport\" is the view that is used to host our application\n\t\tMainViewportViewIdentifier: 'Default-View',\n\t\tMainViewportRenderableHash: false,\n\t\tMainViewportDestinationAddress: false,\n\t\tMainViewportDefaultDataAddress: false,\n\n\t\t// Whether or not we should automatically render the main viewport and other autorender views after we initialize the pict application\n\t\tAutoSolveAfterInitialize: true,\n\t\tAutoRenderMainViewportViewAfterInitialize: true,\n\t\tAutoRenderViewsAfterInitialize: false,\n\t\tAutoLoginAfterInitialize: false,\n\t\tAutoLoadDataAfterLogin: false,\n\n\t\tConfigurationOnlyViews: [],\n\n\t\tManifests: {},\n\t\t// The prefix to prepend on all template destination hashes\n\t\tIdentifierAddressPrefix: 'PICT-'\n\t});\n\n/**\n * Base class for pict applications.\n */\nclass PictApplication extends libFableServiceBase\n{\n\t/**\n\t * @param {import('fable')} pFable\n\t * @param {Record<string, any>} [pOptions]\n\t * @param {string} [pServiceHash]\n\t */\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tlet tmpCarryOverConfiguration = (typeof(pFable.settings.PictApplicationConfiguration) === 'object') ? pFable.settings.PictApplicationConfiguration : {};\n\t\tlet tmpOptions = Object.assign({}, JSON.parse(JSON.stringify(defaultPictSettings)), tmpCarryOverConfiguration, pOptions);\n\t\tsuper(pFable, tmpOptions, pServiceHash);\n\n\t\t/** @type {any} */\n\t\tthis.options;\n\t\t/** @type {any} */\n\t\tthis.log;\n\t\t/** @type {import('pict') & import('fable')} */\n\t\tthis.fable;\n\t\t/** @type {string} */\n\t\tthis.UUID;\n\t\t/** @type {string} */\n\t\tthis.Hash;\n\t\t/**\n\t\t * @type {{ [key: string]: any }}\n\t\t */\n\t\tthis.servicesMap;\n\n\t\tthis.serviceType = 'PictApplication';\n\t\t/** @type {Record<string, any>} */\n\t\tthis._Package = libPackage;\n\n\t\t// Convenience and consistency naming\n\t\tthis.pict = this.fable;\n\t\t// Wire in the essential Pict state\n\t\t/** @type {Record<string, any>} */\n\t\tthis.AppData = this.fable.AppData;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.Bundle = this.fable.Bundle;\n\n\t\t/** @type {number} */\n\t\tthis.initializeTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastSolvedTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastLoginTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastMarshalFromViewsTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastMarshalToViewsTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastAutoRenderTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastLoadDataTimestamp;\n\n\t\t// Load all the manifests for the application\n\t\tlet tmpManifestKeys = Object.keys(this.options.Manifests);\n\t\tif (tmpManifestKeys.length > 0)\n\t\t{\n\t\t\tfor (let i = 0; i < tmpManifestKeys.length; i++)\n\t\t\t{\n\t\t\t\t// Load each manifest\n\t\t\t\tlet tmpManifestKey = tmpManifestKeys[i];\n\t\t\t\tthis.fable.instantiateServiceProvider('Manifest', this.options.Manifests[tmpManifestKey], tmpManifestKey);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Solve All Views */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonPreSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onPreSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonPreSolveAsync(fCallback)\n\t{\n\t\tthis.onPreSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeSolveAsync(fCallback)\n\t{\n\t\tthis.onBeforeSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonSolveAsync(fCallback)\n\t{\n\t\tthis.onSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tsolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} executing solve() function...`)\n\t\t}\n\n\t\t// Walk through any loaded providers and solve them as well.\n\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\tlet tmpProvidersToSolve = [];\n\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t{\n\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\tif (tmpProvider.options.AutoSolveWithApp)\n\t\t\t{\n\t\t\t\ttmpProvidersToSolve.push(tmpProvider);\n\t\t\t}\n\t\t}\n\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpProvidersToSolve.sort((a, b) => { return a.options.AutoSolveOrdinal - b.options.AutoSolveOrdinal; });\n\t\tfor (let i = 0; i < tmpProvidersToSolve.length; i++)\n\t\t{\n\t\t\ttmpProvidersToSolve[i].solve(tmpProvidersToSolve[i]);\n\t\t}\n\n\t\tthis.onBeforeSolve();\n\t\t// Now walk through any loaded views and initialize them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToSolve = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\tif (tmpView.options.AutoInitialize)\n\t\t\t{\n\t\t\t\ttmpViewsToSolve.push(tmpView);\n\t\t\t}\n\t\t}\n\t\t// Sort the views by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpViewsToSolve.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\tfor (let i = 0; i < tmpViewsToSolve.length; i++)\n\t\t{\n\t\t\ttmpViewsToSolve[i].solve();\n\t\t}\n\t\tthis.onSolve();\n\t\tthis.onAfterSolve();\n\t\tthis.lastSolvedTimestamp = this.fable.log.getTimeStamp();\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tsolveAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\ttmpAnticipate.anticipate(this.onBeforeSolveAsync.bind(this));\n\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : false;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\t\t// Walk through any loaded providers and solve them as well.\n\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\tlet tmpProvidersToSolve = [];\n\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t{\n\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\tif (tmpProvider.options.AutoSolveWithApp)\n\t\t\t{\n\t\t\t\ttmpProvidersToSolve.push(tmpProvider);\n\t\t\t}\n\t\t}\n\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpProvidersToSolve.sort((a, b) => { return a.options.AutoSolveOrdinal - b.options.AutoSolveOrdinal; });\n\t\tfor (let i = 0; i < tmpProvidersToSolve.length; i++)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvidersToSolve[i].solveAsync.bind(tmpProvidersToSolve[i]));\n\t\t}\n\n\t\t// Walk through any loaded views and solve them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToSolve = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\tif (tmpView.options.AutoSolveWithApp)\n\t\t\t{\n\t\t\t\ttmpViewsToSolve.push(tmpView);\n\t\t\t}\n\t\t}\n\t\t// Sort the views by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpViewsToSolve.sort((a, b) => { return a.options.AutoSolveOrdinal - b.options.AutoSolveOrdinal; });\n\t\tfor (let i = 0; i < tmpViewsToSolve.length; i++)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpViewsToSolve[i].solveAsync.bind(tmpViewsToSolve[i]));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onSolveAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterSolveAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastSolvedTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterSolveAsync(fCallback)\n\t{\n\t\tthis.onAfterSolve();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Application Login */\n\t/* -------------------------------------------------------------------------- */\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeLoginAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeLoginAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonLoginAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onLoginAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tloginAsync(fCallback)\n\t{\n\t\tconst tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\tlet tmpCallback = fCallback;\n\n\t\tif (typeof(tmpCallback) !== 'function')\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loginAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loginAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeLoginAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onLoginAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterLoginAsync.bind(this));\n\n\t\t// check and see if we should automatically trigger a data load\n\t\tif (this.options.AutoLoadDataAfterLogin)\n\t\t{\n\t\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t\t{\n\t\t\t\tif (!this.isLoggedIn())\n\t\t\t\t{\n\t\t\t\t\treturn fNext();\n\t\t\t\t}\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto loading data after login...`);\n\t\t\t\t}\n\t\t\t\t//TODO: should data load errors funnel here? this creates a weird coupling between login and data load callbacks\n\t\t\t\tthis.loadDataAsync((pError) =>\n\t\t\t\t{\n\t\t\t\t\tfNext(pError);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loginAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastLoginTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * Check if the application state is logged in. Defaults to true. Override this method in your application based on login requirements.\n\t *\n\t * @return {boolean}\n\t */\n\tisLoggedIn()\n\t{\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterLoginAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterLoginAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Application LoadData */\n\t/* -------------------------------------------------------------------------- */\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeLoadDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeLoadDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonLoadDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onLoadDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tloadDataAsync(fCallback)\n\t{\n\t\tconst tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\tlet tmpCallback = fCallback;\n\n\t\tif (typeof(tmpCallback) !== 'function')\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loadDataAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loadDataAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeLoadDataAsync.bind(this));\n\n\t\t// Walk through any loaded providers and load their data as well.\n\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\tlet tmpProvidersToLoadData = [];\n\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t{\n\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\tif (tmpProvider.options.AutoLoadDataWithApp)\n\t\t\t{\n\t\t\t\ttmpProvidersToLoadData.push(tmpProvider);\n\t\t\t}\n\t\t}\n\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpProvidersToLoadData.sort((a, b) => { return a.options.AutoLoadDataOrdinal - b.options.AutoLoadDataOrdinal; });\n\n\t\tfor (const tmpProvider of tmpProvidersToLoadData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onBeforeLoadDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onLoadDataAsync.bind(this));\n\n\t\t//TODO: think about ways to parallelize these\n\t\tfor (const tmpProvider of tmpProvidersToLoadData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onLoadDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onAfterLoadDataAsync.bind(this));\n\n\t\tfor (const tmpProvider of tmpProvidersToLoadData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onAfterLoadDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.wait(\n\t\t\t/** @param {Error} [pError] */\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loadDataAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastLoadDataTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterLoadDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterLoadDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Application SaveData */\n\t/* -------------------------------------------------------------------------- */\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeSaveDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeSaveDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonSaveDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onSaveDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tsaveDataAsync(fCallback)\n\t{\n\t\tconst tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\tlet tmpCallback = fCallback;\n\n\t\tif (typeof(tmpCallback) !== 'function')\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} saveDataAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} saveDataAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeSaveDataAsync.bind(this));\n\n\t\t// Walk through any loaded providers and load their data as well.\n\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\tlet tmpProvidersToSaveData = [];\n\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t{\n\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\tif (tmpProvider.options.AutoSaveDataWithApp)\n\t\t\t{\n\t\t\t\ttmpProvidersToSaveData.push(tmpProvider);\n\t\t\t}\n\t\t}\n\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpProvidersToSaveData.sort((a, b) => { return a.options.AutoSaveDataOrdinal - b.options.AutoSaveDataOrdinal; });\n\n\t\tfor (const tmpProvider of tmpProvidersToSaveData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onBeforeSaveDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onSaveDataAsync.bind(this));\n\n\t\t//TODO: think about ways to parallelize these\n\t\tfor (const tmpProvider of tmpProvidersToSaveData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onSaveDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onAfterSaveDataAsync.bind(this));\n\n\t\tfor (const tmpProvider of tmpProvidersToSaveData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onAfterSaveDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.wait(\n\t\t\t/** @param {Error} [pError] */\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} saveDataAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastSaveDataTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterSaveDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterSaveDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Initialize Application */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeInitializeAsync(fCallback)\n\t{\n\t\tthis.onBeforeInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonInitializeAsync(fCallback)\n\t{\n\t\tthis.onInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tinitialize()\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} initialize:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tthis.onBeforeInitialize();\n\n\t\t\tif ('ConfigurationOnlyViews' in this.options)\n\t\t\t{\n\t\t\t\t// Load all the configuration only views\n\t\t\t\tfor (let i = 0; i < this.options.ConfigurationOnlyViews.length; i++)\n\t\t\t\t{\n\t\t\t\t\tlet tmpViewIdentifier = (typeof(this.options.ConfigurationOnlyViews[i].ViewIdentifier) === 'undefined') ? `AutoView-${this.fable.getUUID()}`\n\t\t\t\t\t\t\t\t\t\t\t: this.options.ConfigurationOnlyViews[i].ViewIdentifier;\n\t\t\t\t\tthis.log.info(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} adding configuration only view: ${tmpViewIdentifier}`);\n\t\t\t\t\tthis.pict.addView(tmpViewIdentifier, this.options.ConfigurationOnlyViews[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.onInitialize();\n\n\t\t\t// Walk through any loaded providers and initialize them as well.\n\t\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\t\tlet tmpProvidersToInitialize = [];\n\t\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\t\tif (tmpProvider.options.AutoInitialize)\n\t\t\t\t{\n\t\t\t\t\ttmpProvidersToInitialize.push(tmpProvider);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\t\ttmpProvidersToInitialize.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\t\tfor (let i = 0; i < tmpProvidersToInitialize.length; i++)\n\t\t\t{\n\t\t\t\ttmpProvidersToInitialize[i].initialize();\n\t\t\t}\n\n\t\t\t// Now walk through any loaded views and initialize them as well.\n\t\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\t\tlet tmpViewsToInitialize = [];\n\t\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\t\tif (tmpView.options.AutoInitialize)\n\t\t\t\t{\n\t\t\t\t\ttmpViewsToInitialize.push(tmpView);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Sort the views by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\t\ttmpViewsToInitialize.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\t\tfor (let i = 0; i < tmpViewsToInitialize.length; i++)\n\t\t\t{\n\t\t\t\ttmpViewsToInitialize[i].initialize();\n\t\t\t}\n\n\t\t\tthis.onAfterInitialize();\n\t\t\tif (this.options.AutoSolveAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto solving after initialization...`);\n\t\t\t\t}\n\t\t\t\t// Solve the template synchronously\n\t\t\t\tthis.solve();\n\t\t\t}\n\t\t\t// Now check and see if we should automatically render as well\n\t\t\tif (this.options.AutoRenderMainViewportViewAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto rendering after initialization...`);\n\t\t\t\t}\n\t\t\t\t// Render the template synchronously\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\tthis.initializeTimestamp = this.fable.log.getTimeStamp();\n\t\t\tthis.onCompletionOfInitialize();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initialize called but initialization is already completed. Aborting.`);\n\t\t\treturn false;\n\t\t}\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tinitializeAsync(fCallback)\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} initializeAsync:`);\n\t\t}\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : false;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initializeAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initializeAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t\tif (this.pict.LogNoisiness > 3)\n\t\t\t{\n\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} beginning initialization...`);\n\t\t\t}\n\n\t\t\tif ('ConfigurationOnlyViews' in this.options)\n\t\t\t{\n\t\t\t\t// Load all the configuration only views\n\t\t\t\tfor (let i = 0; i < this.options.ConfigurationOnlyViews.length; i++)\n\t\t\t\t{\n\t\t\t\t\tlet tmpViewIdentifier = (typeof(this.options.ConfigurationOnlyViews[i].ViewIdentifier) === 'undefined') ? `AutoView-${this.fable.getUUID()}`\n\t\t\t\t\t\t\t\t\t\t\t: this.options.ConfigurationOnlyViews[i].ViewIdentifier;\n\t\t\t\t\tthis.log.info(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} adding configuration only view: ${tmpViewIdentifier}`);\n\t\t\t\t\tthis.pict.addView(tmpViewIdentifier, this.options.ConfigurationOnlyViews[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttmpAnticipate.anticipate(this.onBeforeInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onInitializeAsync.bind(this));\n\n\t\t\t// Walk through any loaded providers and solve them as well.\n\t\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\t\tlet tmpProvidersToInitialize = [];\n\t\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\t\tif (tmpProvider.options.AutoInitialize)\n\t\t\t\t{\n\t\t\t\t\ttmpProvidersToInitialize.push(tmpProvider);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\t\ttmpProvidersToInitialize.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\t\tfor (let i = 0; i < tmpProvidersToInitialize.length; i++)\n\t\t\t{\n\t\t\t\ttmpAnticipate.anticipate(tmpProvidersToInitialize[i].initializeAsync.bind(tmpProvidersToInitialize[i]));\n\t\t\t}\n\n\t\t\t// Now walk through any loaded views and initialize them as well.\n\t\t\t// TODO: Some optimization cleverness could be gained by grouping them into a parallelized async operation, by ordinal.\n\t\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\t\tlet tmpViewsToInitialize = [];\n\t\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\t\tif (tmpView.options.AutoInitialize)\n\t\t\t\t{\n\t\t\t\t\ttmpViewsToInitialize.push(tmpView);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Sort the views by their priority\n\t\t\t// If they are all the default priority 0, it will end up being add order due to JSON Object Property Key order stuff\n\t\t\ttmpViewsToInitialize.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\t\tfor (let i = 0; i < tmpViewsToInitialize.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpView = tmpViewsToInitialize[i];\n\t\t\t\ttmpAnticipate.anticipate(tmpView.initializeAsync.bind(tmpView));\n\t\t\t}\n\n\t\t\ttmpAnticipate.anticipate(this.onAfterInitializeAsync.bind(this));\n\n\t\t\tif (this.options.AutoLoginAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto login (asynchronously) after initialization...`);\n\t\t\t\t}\n\t\t\t\ttmpAnticipate.anticipate(this.loginAsync.bind(this));\n\t\t\t}\n\n\t\t\tif (this.options.AutoSolveAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto solving (asynchronously) after initialization...`);\n\t\t\t\t}\n\t\t\t\ttmpAnticipate.anticipate(this.solveAsync.bind(this));\n\t\t\t}\n\n\t\t\tif (this.options.AutoRenderMainViewportViewAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto rendering (asynchronously) after initialization...`);\n\t\t\t\t}\n\t\t\t\ttmpAnticipate.anticipate(this.renderMainViewportAsync.bind(this));\n\t\t\t}\n\n\t\t\ttmpAnticipate.wait(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initializeAsync Error: ${pError.message || pError}`, { stack: pError.stack });\n\t\t\t\t\t}\n\t\t\t\t\tthis.initializeTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initialization complete.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn tmpCallback();\n\t\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} async initialize called but initialization is already completed. Aborting.`);\n\t\t\t// TODO: Should this be an error?\n\t\t\treturn this.onCompletionOfInitializeAsync(tmpCallback);\n\t\t}\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterInitializeAsync(fCallback)\n\t{\n\t\tthis.onAfterInitialize();\n\t\treturn fCallback();\n\t}\n\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonCompletionOfInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onCompletionOfInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonCompletionOfInitializeAsync(fCallback)\n\t{\n\t\tthis.onCompletionOfInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Marshal Data From All Views */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeMarshalFromViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeMarshalFromViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeMarshalFromViewsAsync(fCallback)\n\t{\n\t\tthis.onBeforeMarshalFromViews();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonMarshalFromViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onMarshalFromViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonMarshalFromViewsAsync(fCallback)\n\t{\n\t\tthis.onMarshalFromViews();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tmarshalFromViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} executing marshalFromViews() function...`)\n\t\t}\n\t\tthis.onBeforeMarshalFromViews();\n\t\t// Now walk through any loaded views and initialize them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToMarshalFromViews = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\ttmpViewsToMarshalFromViews.push(tmpView);\n\t\t}\n\t\tfor (let i = 0; i < tmpViewsToMarshalFromViews.length; i++)\n\t\t{\n\t\t\ttmpViewsToMarshalFromViews[i].marshalFromView();\n\t\t}\n\t\tthis.onMarshalFromViews();\n\t\tthis.onAfterMarshalFromViews();\n\t\tthis.lastMarshalFromViewsTimestamp = this.fable.log.getTimeStamp();\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tmarshalFromViewsAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : false;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewsAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewsAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeMarshalFromViewsAsync.bind(this));\n\t\t// Walk through any loaded views and marshalFromViews them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToMarshalFromViews = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\ttmpViewsToMarshalFromViews.push(tmpView);\n\t\t}\n\t\tfor (let i = 0; i < tmpViewsToMarshalFromViews.length; i++)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpViewsToMarshalFromViews[i].marshalFromViewAsync.bind(tmpViewsToMarshalFromViews[i]));\n\t\t}\n\t\ttmpAnticipate.anticipate(this.onMarshalFromViewsAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterMarshalFromViewsAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewsAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastMarshalFromViewsTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterMarshalFromViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterMarshalFromViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterMarshalFromViewsAsync(fCallback)\n\t{\n\t\tthis.onAfterMarshalFromViews();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Marshal Data To All Views */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeMarshalToViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeMarshalToViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeMarshalToViewsAsync(fCallback)\n\t{\n\t\tthis.onBeforeMarshalToViews();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonMarshalToViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onMarshalToViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonMarshalToViewsAsync(fCallback)\n\t{\n\t\tthis.onMarshalToViews();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tmarshalToViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} executing marshalToViews() function...`)\n\t\t}\n\t\tthis.onBeforeMarshalToViews();\n\t\t// Now walk through any loaded views and initialize them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToMarshalToViews = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\ttmpViewsToMarshalToViews.push(tmpView);\n\t\t}\n\t\tfor (let i = 0; i < tmpViewsToMarshalToViews.length; i++)\n\t\t{\n\t\t\ttmpViewsToMarshalToViews[i].marshalToView();\n\t\t}\n\t\tthis.onMarshalToViews();\n\t\tthis.onAfterMarshalToViews();\n\t\tthis.lastMarshalToViewsTimestamp = this.fable.log.getTimeStamp();\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tmarshalToViewsAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : false;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewsAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewsAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeMarshalToViewsAsync.bind(this));\n\t\t// Walk through any loaded views and marshalToViews them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToMarshalToViews = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\ttmpViewsToMarshalToViews.push(tmpView);\n\t\t}\n\t\tfor (let i = 0; i < tmpViewsToMarshalToViews.length; i++)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpViewsToMarshalToViews[i].marshalToViewAsync.bind(tmpViewsToMarshalToViews[i]));\n\t\t}\n\t\ttmpAnticipate.anticipate(this.onMarshalToViewsAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterMarshalToViewsAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewsAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastMarshalToViewsTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterMarshalToViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterMarshalToViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterMarshalToViewsAsync(fCallback)\n\t{\n\t\tthis.onAfterMarshalToViews();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Render View */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeRender()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeRenderAsync(fCallback)\n\t{\n\t\tthis.onBeforeRender();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {string} [pViewIdentifier] - The hash of the view to render. By default, the main viewport view is rendered.\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string} [pTemplateDataAddress] - The address where the data for the template is stored.\n\t *\n\t * TODO: Should we support objects for pTemplateDataAddress for parity with pict-view?\n\t */\n\trender(pViewIdentifier, pRenderableHash, pRenderDestinationAddress, pTemplateDataAddress)\n\t{\n\t\tlet tmpViewIdentifier = (typeof(pViewIdentifier) !== 'string') ? this.options.MainViewportViewIdentifier : pViewIdentifier;\n\t\tlet tmpRenderableHash = (typeof(pRenderableHash) !== 'string') ? this.options.MainViewportRenderableHash : pRenderableHash;\n\t\tlet tmpRenderDestinationAddress = (typeof(pRenderDestinationAddress) !== 'string') ? this.options.MainViewportDestinationAddress : pRenderDestinationAddress;\n\t\tlet tmpTemplateDataAddress = (typeof(pTemplateDataAddress) !== 'string') ? this.options.MainViewportDefaultDataAddress : pTemplateDataAddress;\n\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} VIEW Renderable[${tmpRenderableHash}] Destination[${tmpRenderDestinationAddress}] TemplateDataAddress[${tmpTemplateDataAddress}] render:`);\n\t\t}\n\n\t\tthis.onBeforeRender();\n\n\t\t// Now get the view (by hash) from the loaded views\n\t\tlet tmpView = (typeof (tmpViewIdentifier) === 'string') ? this.servicesMap.PictView[tmpViewIdentifier] : false;\n\t\tif (!tmpView)\n\t\t{\n\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} could not render from View ${tmpViewIdentifier} because it is not a valid view.`);\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.onRender();\n\n\t\ttmpView.render(tmpRenderableHash, tmpRenderDestinationAddress, tmpTemplateDataAddress);\n\n\t\tthis.onAfterRender();\n\n\t\treturn true;\n\t}\n\t/**\n\t * @return {boolean}\n\t */\n\tonRender()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonRenderAsync(fCallback)\n\t{\n\t\tthis.onRender();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {string|((error?: Error) => void)} pViewIdentifier - The hash of the view to render. By default, the main viewport view is rendered. (or the callback)\n\t * @param {string|((error?: Error) => void)} [pRenderableHash] - The hash of the renderable to render. (or the callback)\n\t * @param {string|((error?: Error) => void)} [pRenderDestinationAddress] - The address where the renderable will be rendered. (or the callback)\n\t * @param {string|((error?: Error) => void)} [pTemplateDataAddress] - The address where the data for the template is stored. (or the callback)\n\t * @param {(error?: Error) => void} [fCallback] - The callback, if all other parameters are provided.\n\t *\n\t * TODO: Should we support objects for pTemplateDataAddress for parity with pict-view?\n\t */\n\trenderAsync(pViewIdentifier, pRenderableHash, pRenderDestinationAddress, pTemplateDataAddress, fCallback)\n\t{\n\t\tlet tmpViewIdentifier = (typeof(pViewIdentifier) !== 'string') ? this.options.MainViewportViewIdentifier : pViewIdentifier;\n\t\tlet tmpRenderableHash = (typeof(pRenderableHash) !== 'string') ? this.options.MainViewportRenderableHash : pRenderableHash;\n\t\tlet tmpRenderDestinationAddress = (typeof(pRenderDestinationAddress) !== 'string') ? this.options.MainViewportDestinationAddress : pRenderDestinationAddress;\n\t\tlet tmpTemplateDataAddress = (typeof(pTemplateDataAddress) !== 'string') ? this.options.MainViewportDefaultDataAddress : pTemplateDataAddress;\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback :\n\t\t\t\t\t\t\t(typeof(pTemplateDataAddress) === 'function') ? pTemplateDataAddress :\n\t\t\t\t\t\t\t(typeof(pRenderDestinationAddress) === 'function') ? pRenderDestinationAddress :\n\t\t\t\t\t\t\t(typeof(pRenderableHash) === 'function') ? pRenderableHash :\n\t\t\t\t\t\t\t(typeof(pViewIdentifier) === 'function') ? pViewIdentifier :\n\t\t\t\t\t\t\tfalse;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} VIEW Renderable[${tmpRenderableHash}] Destination[${tmpRenderDestinationAddress}] TemplateDataAddress[${tmpTemplateDataAddress}] renderAsync:`);\n\t\t}\n\n\t\tlet tmpRenderAnticipate = this.fable.newAnticipate();\n\n\t\ttmpRenderAnticipate.anticipate(this.onBeforeRenderAsync.bind(this));\n\n\t\tlet tmpView = (typeof (tmpViewIdentifier) === 'string') ? this.servicesMap.PictView[tmpViewIdentifier] : false;\n\t\tif (!tmpView)\n\t\t{\n\t\t\tlet tmpErrorMessage = `PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} could not asynchronously render from View ${tmpViewIdentifier} because it is not a valid view.`;\n\t\t\tif (this.pict.LogNoisiness > 3)\n\t\t\t{\n\t\t\t\tthis.log.error(tmpErrorMessage);\n\t\t\t}\n\t\t\treturn tmpCallback(new Error(tmpErrorMessage));\n\t\t}\n\n\t\ttmpRenderAnticipate.anticipate(this.onRenderAsync.bind(this));\n\n\t\ttmpRenderAnticipate.anticipate(\n\t\t\t(fNext) =>\n\t\t\t{\n\t\t\t\ttmpView.renderAsync.call(tmpView, tmpRenderableHash, tmpRenderDestinationAddress, tmpTemplateDataAddress, fNext);\n\t\t\t});\n\n\t\ttmpRenderAnticipate.anticipate(this.onAfterRenderAsync.bind(this));\n\n\t\treturn tmpRenderAnticipate.wait(tmpCallback);\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterRender()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterRenderAsync(fCallback)\n\t{\n\t\tthis.onAfterRender();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\trenderMainViewport()\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderMainViewport:`);\n\t\t}\n\n\t\treturn this.render();\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\trenderMainViewportAsync(fCallback)\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderMainViewportAsync:`);\n\t\t}\n\n\t\treturn this.renderAsync(fCallback);\n\t}\n\t/**\n\t * @return {void}\n\t */\n\trenderAutoViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} beginning renderAutoViews...`);\n\t\t}\n\t\t// Now walk through any loaded views and sort them by the AutoRender ordinal\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\t// Sort the views by their priority\n\t\t// If they are all the default priority 0, it will end up being add order due to JSON Object Property Key order stuff\n\t\ttmpLoadedViews.sort((a, b) =>\n\t\t{\n\t\t\treturn this.pict.views[a].options.AutoRenderOrdinal - this.pict.views[b].options.AutoRenderOrdinal;\n\t\t});\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\tif (tmpView.options.AutoRender)\n\t\t\t{\n\t\t\t\ttmpView.render();\n\t\t\t}\n\t\t}\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAutoViewsAsync complete.`);\n\t\t}\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\trenderAutoViewsAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback :\n\t\t\t\t\t\t\tfalse;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAutoViewsAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAutoViewsAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} beginning renderAutoViewsAsync...`);\n\t\t}\n\n\t\t// Now walk through any loaded views and sort them by the AutoRender ordinal\n\t\t// TODO: Some optimization cleverness could be gained by grouping them into a parallelized async operation, by ordinal.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\t// Sort the views by their priority\n\t\t// If they are all the default priority 0, it will end up being add order due to JSON Object Property Key order stuff\n\t\ttmpLoadedViews.sort((a, b) =>\n\t\t{\n\t\t\treturn this.pict.views[a].options.AutoRenderOrdinal - this.pict.views[b].options.AutoRenderOrdinal;\n\t\t});\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\tif (tmpView.options.AutoRender)\n\t\t\t{\n\t\t\t\ttmpAnticipate.anticipate(tmpView.renderAsync.bind(tmpView));\n\t\t\t}\n\t\t}\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tthis.lastAutoRenderTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAutoViewsAsync complete.`);\n\t\t\t\t}\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tget isPictApplication()\n\t{\n\t\treturn true;\n\t}\n}\n\nmodule.exports = PictApplication;\n\n},{\"../package.json\":3,\"fable-serviceproviderbase\":2}],5:[function(require,module,exports){\nmodule.exports={\n \"name\": \"pict-provider\",\n \"version\": \"1.0.12\",\n \"description\": \"Pict Provider Base Class\",\n \"main\": \"source/Pict-Provider.js\",\n \"scripts\": {\n \"start\": \"node source/Pict-Provider.js\",\n \"test\": \"npx quack test\",\n \"tests\": \"npx quack test -g\",\n \"coverage\": \"npx quack coverage\",\n \"build\": \"npx quack build\",\n \"docker-dev-build\": \"docker build ./ -f Dockerfile_LUXURYCode -t pict-provider-image:local\",\n \"docker-dev-run\": \"docker run -it -d --name pict-provider-dev -p 24125:8080 -p 30027:8086 -v \\\"$PWD/.config:/home/coder/.config\\\" -v \\\"$PWD:/home/coder/pict-provider\\\" -u \\\"$(id -u):$(id -g)\\\" -e \\\"DOCKER_USER=$USER\\\" pict-provider-image:local\",\n \"docker-dev-shell\": \"docker exec -it pict-provider-dev /bin/bash\",\n \"lint\": \"eslint source/**\",\n \"types\": \"tsc -p .\"\n },\n \"types\": \"types/source/Pict-Provider.d.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/stevenvelozo/pict-provider.git\"\n },\n \"author\": \"steven velozo <steven@velozo.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/stevenvelozo/pict-provider/issues\"\n },\n \"homepage\": \"https://github.com/stevenvelozo/pict-provider#readme\",\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.1\",\n \"eslint\": \"^9.39.1\",\n \"pict\": \"^1.0.351\",\n \"quackage\": \"^1.0.58\",\n \"typescript\": \"^5.9.3\"\n },\n \"dependencies\": {\n \"fable-serviceproviderbase\": \"^3.0.19\"\n },\n \"mocha\": {\n \"diff\": true,\n \"extension\": [\n \"js\"\n ],\n \"package\": \"./package.json\",\n \"reporter\": \"spec\",\n \"slow\": \"75\",\n \"timeout\": \"5000\",\n \"ui\": \"tdd\",\n \"watch-files\": [\n \"source/**/*.js\",\n \"test/**/*.js\"\n ],\n \"watch-ignore\": [\n \"lib/vendor\"\n ]\n }\n}\n\n},{}],6:[function(require,module,exports){\nconst libFableServiceBase = require('fable-serviceproviderbase');\n\nconst libPackage = require('../package.json');\n\nconst defaultPictProviderSettings = (\n\t{\n\t\tProviderIdentifier: false,\n\n\t\t// If this is set to true, when the App initializes this will.\n\t\t// After the App initializes, initialize will be called as soon as it's added.\n\t\tAutoInitialize: true,\n\t\tAutoInitializeOrdinal: 0,\n\n\t\tAutoLoadDataWithApp: true,\n\t\tAutoLoadDataOrdinal: 0,\n\n\t\tAutoSolveWithApp: true,\n\t\tAutoSolveOrdinal: 0,\n\n\t\tManifests: {},\n\n\t\tTemplates: []\n\t});\n\nclass PictProvider extends libFableServiceBase\n{\n\t/**\n\t * @param {import('fable')} pFable - The Fable instance.\n\t * @param {Record<string, any>} [pOptions] - The options for the provider.\n\t * @param {string} [pServiceHash] - The service hash for the provider.\n\t */\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\t// Intersect default options, parent constructor, service information\n\t\tlet tmpOptions = Object.assign({}, JSON.parse(JSON.stringify(defaultPictProviderSettings)), pOptions);\n\t\tsuper(pFable, tmpOptions, pServiceHash);\n\n\t\t/** @type {import('fable') & import('pict') & { instantiateServiceProviderWithoutRegistration(pServiceType: string, pOptions?: Record<string, any>, pCustomServiceHash?: string): any }} */\n\t\tthis.fable;\n\t\t/** @type {import('fable') & import('pict') & { instantiateServiceProviderWithoutRegistration(pServiceType: string, pOptions?: Record<string, any>, pCustomServiceHash?: string): any }} */\n\t\tthis.pict;\n\t\t/** @type {any} */\n\t\tthis.log;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.options;\n\t\t/** @type {string} */\n\t\tthis.UUID;\n\t\t/** @type {string} */\n\t\tthis.Hash;\n\n\t\tif (!this.options.ProviderIdentifier)\n\t\t{\n\t\t\tthis.options.ProviderIdentifier = `AutoProviderID-${this.fable.getUUID()}`;\n\t\t}\n\n\t\tthis.serviceType = 'PictProvider';\n\t\t/** @type {Record<string, any>} */\n\t\tthis._Package = libPackage;\n\n\t\t// Convenience and consistency naming\n\t\tthis.pict = this.fable;\n\n\t\t// Wire in the essential Pict application state\n\t\t/** @type {Record<string, any>} */\n\t\tthis.AppData = this.pict.AppData;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.Bundle = this.pict.Bundle;\n\n\t\tthis.initializeTimestamp = false;\n\t\tthis.lastSolvedTimestamp = false;\n\n\t\tfor (let i = 0; i < this.options.Templates.length; i++)\n\t\t{\n\t\t\tlet tmpDefaultTemplate = this.options.Templates[i];\n\n\t\t\tif (!tmpDefaultTemplate.hasOwnProperty('Postfix') || !tmpDefaultTemplate.hasOwnProperty('Template'))\n\t\t\t{\n\t\t\t\tthis.log.error(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} could not load Default Template ${i} in the options array.`, tmpDefaultTemplate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!tmpDefaultTemplate.Source)\n\t\t\t\t{\n\t\t\t\t\ttmpDefaultTemplate.Source = `PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} options object.`;\n\t\t\t\t}\n\t\t\t\tthis.pict.TemplateProvider.addDefaultTemplate(tmpDefaultTemplate.Prefix, tmpDefaultTemplate.Postfix, tmpDefaultTemplate.Template, tmpDefaultTemplate.Source);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Initialization */\n\t/* -------------------------------------------------------------------------- */\n\tonBeforeInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onBeforeInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after pre-pinitialization.\n\t *\n\t * @return {void}\n\t */\n\tonBeforeInitializeAsync(fCallback)\n\t{\n\t\tthis.onBeforeInitialize();\n\t\treturn fCallback();\n\t}\n\n\tonInitialize()\n\t{\n\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after initialization.\n\t *\n\t * @return {void}\n\t */\n\tonInitializeAsync(fCallback)\n\t{\n\t\tthis.onInitialize();\n\t\treturn fCallback();\n\t}\n\n\tinitialize()\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow PROVIDER [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initialize:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tthis.onBeforeInitialize();\n\t\t\tthis.onInitialize();\n\t\t\tthis.onAfterInitialize();\n\t\t\tthis.initializeTimestamp = this.pict.log.getTimeStamp();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initialize called but initialization is already completed. Aborting.`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after initialization.\n\t *\n\t * @return {void}\n\t */\n\tinitializeAsync(fCallback)\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow PROVIDER [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initializeAsync:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t{\n\t\t\t\tthis.log.info(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} beginning initialization...`);\n\t\t\t}\n\n\t\t\ttmpAnticipate.anticipate(this.onBeforeInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onAfterInitializeAsync.bind(this));\n\n\t\t\ttmpAnticipate.wait(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.initializeTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initialization failed: ${pError.message || pError}`, { Stack: pError.stack });\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.pict.LogNoisiness > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.info(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initialization complete.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn fCallback();\n\t\t\t\t})\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} async initialize called but initialization is already completed. Aborting.`);\n\t\t\t// TODO: Should this be an error?\n\t\t\treturn fCallback();\n\t\t}\n\t}\n\n\tonAfterInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onAfterInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after initialization.\n\t *\n\t * @return {void}\n\t */\n\tonAfterInitializeAsync(fCallback)\n\t{\n\t\tthis.onAfterInitialize();\n\t\treturn fCallback();\n\t}\n\n\tonPreRender()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onPreRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after pre-render.\n\t *\n\t * @return {void}\n\t */\n\tonPreRenderAsync(fCallback)\n\t{\n\t\tthis.onPreRender();\n\t\treturn fCallback();\n\t}\n\n\trender()\n\t{\n\t\treturn this.onPreRender();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after render.\n\t *\n\t * @return {void}\n\t */\n\trenderAsync(fCallback)\n\t{\n\t\tthis.onPreRender();\n\t\treturn fCallback();\n\t}\n\n\tonPreSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onPreSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after pre-solve.\n\t *\n\t * @return {void}\n\t */\n\tonPreSolveAsync(fCallback)\n\t{\n\t\tthis.onPreSolve();\n\t\treturn fCallback();\n\t}\n\n\tsolve()\n\t{\n\t\treturn this.onPreSolve();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after solve.\n\t *\n\t * @return {void}\n\t */\n\tsolveAsync(fCallback)\n\t{\n\t\tthis.onPreSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data pre-load.\n\t */\n\tonBeforeLoadDataAsync(fCallback)\n\t{\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Hook to allow the provider to load data during application data load.\n\t *\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data load.\n\t */\n\tonLoadDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onLoadDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data post-load.\n\t */\n\tonAfterLoadDataAsync(fCallback)\n\t{\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data pre-load.\n\t *\n\t * @return {void}\n\t */\n\tonBeforeSaveDataAsync(fCallback)\n\t{\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Hook to allow the provider to load data during application data load.\n\t *\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data load.\n\t *\n\t * @return {void}\n\t */\n\tonSaveDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onSaveDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data post-load.\n\t *\n\t * @return {void}\n\t */\n\tonAfterSaveDataAsync(fCallback)\n\t{\n\t\treturn fCallback();\n\t}\n}\n\nmodule.exports = PictProvider;\n\n},{\"../package.json\":5,\"fable-serviceproviderbase\":2}],7:[function(require,module,exports){\nmodule.exports = (\n{\n\t\"RenderOnLoad\": true,\n\n\t\"DefaultRenderable\": \"Histogram-Wrap\",\n\t\"DefaultDestinationAddress\": \"#Histogram-Container-Div\",\n\n\t\"Templates\":\n\t[\n\t\t{\n\t\t\t\"Hash\": \"Histogram-Container\",\n\t\t\t\"Template\": \"<!-- Histogram Container Rendering Soon -->\"\n\t\t}\n\t],\n\n\t\"Renderables\":\n\t[\n\t\t{\n\t\t\t\"RenderableHash\": \"Histogram-Wrap\",\n\t\t\t\"TemplateHash\": \"Histogram-Container\",\n\t\t\t\"DestinationAddress\": \"#Histogram-Container-Div\"\n\t\t}\n\t],\n\n\t\"TargetElementAddress\": \"#Histogram-Container-Div\",\n\n\t// --- Data Configuration ---\n\n\t// Address in AppData (or other Pict address space) for the histogram bins\n\t// Expected format: Array of objects with at least { Label, Value } properties\n\t// e.g. [{ Label: \"2020\", Value: 15 }, { Label: \"2021\", Value: 42 }]\n\t\"DataAddress\": false,\n\n\t// Alternatively, provide bins directly (used if DataAddress is not set)\n\t\"Bins\": [],\n\n\t// Property names within each bin object\n\t\"LabelProperty\": \"Label\",\n\t\"ValueProperty\": \"Value\",\n\n\t// --- Layout Configuration ---\n\n\t// \"vertical\" = bars grow upward; \"horizontal\" = bars grow rightward\n\t\"Orientation\": \"vertical\",\n\n\t// The rendering mode: \"browser\", \"consoleui\", or \"cli\"\n\t// \"browser\" renders HTML/CSS/SVG; \"consoleui\" renders via blessed widgets;\n\t// \"cli\" renders ANSI text to stdout\n\t\"RenderMode\": \"browser\",\n\n\t// Maximum height in pixels (browser vertical) or characters (cli/consoleui)\n\t\"MaxBarSize\": 200,\n\n\t// Bar thickness in pixels (browser) or characters (cli/consoleui)\n\t\"BarThickness\": 30,\n\n\t// Gap between bars in pixels (browser) or characters (cli/consoleui)\n\t\"BarGap\": 4,\n\n\t// When true, bar groups expand to fill the container width (vertical) or\n\t// height (horizontal) using CSS flex-grow instead of a fixed BarThickness.\n\t// Labels and values overflow their column so they remain readable even when\n\t// bars are very narrow. Best suited for time-series or dense histograms.\n\t\"FillContainer\": false,\n\n\t// Whether to show value labels on/above bars\n\t\"ShowValues\": true,\n\n\t// Whether to show bin labels (x-axis for vertical, y-axis for horizontal)\n\t\"ShowLabels\": true,\n\n\t// In FillContainer mode, controls label density in the separate label row.\n\t// 0 = auto-compute (space labels approximately 80px apart based on container\n\t// width), N > 0 = show a label every N bars starting from index 0.\n\t// Ignored when FillContainer is false (every bar shows its own label).\n\t\"LabelInterval\": 0,\n\n\t// Color of the bars (CSS color for browser, ANSI color name for cli/consoleui)\n\t\"BarColor\": \"#4A90D9\",\n\n\t// Color of selected bars\n\t\"SelectedBarColor\": \"#2ECC71\",\n\n\t// Color of bars in the selection range\n\t\"SelectionRangeColor\": \"#85C1E9\",\n\n\t// --- Selection Configuration ---\n\n\t// Enable selection mode\n\t\"Selectable\": false,\n\n\t// Selection mode: \"single\", \"multiple\", \"range\"\n\t// \"single\" - click to select one bar\n\t// \"multiple\" - click to toggle individual bars\n\t// \"range\" - drag sliders to select a contiguous range of bins\n\t\"SelectionMode\": \"range\",\n\n\t// Address in AppData to write selection state\n\t// Will contain { SelectedIndices: [], RangeStart: N, RangeEnd: N } or similar\n\t\"SelectionDataAddress\": false,\n\n\t// Initial selection (array of indices or { Start, End } for range mode)\n\t\"InitialSelection\": null,\n\n\t// --- CLI/ConsoleUI Configuration ---\n\n\t// Characters used for rendering in text mode\n\t\"BarCharacter\": \"\\u2588\",\n\t\"BarPartialCharacters\": [\" \", \"\\u2581\", \"\\u2582\", \"\\u2583\", \"\\u2584\", \"\\u2585\", \"\\u2586\", \"\\u2587\", \"\\u2588\"],\n\t\"EmptyCharacter\": \" \",\n\t\"SliderCharacter\": \"\\u2502\",\n\t\"SliderHandleCharacter\": \"\\u25C6\",\n\n\t// Width of the histogram in characters (cli/consoleui)\n\t\"TextWidth\": 60,\n\n\t// Height of the histogram in characters (cli/consoleui vertical)\n\t\"TextHeight\": 15,\n\n\t// --- CSS ---\n\t\"CSS\": `.pict-histogram-container\n{\n\tdisplay: inline-block;\n\tposition: relative;\n\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n\tfont-size: 12px;\n\tuser-select: none;\n}\n.pict-histogram-chart\n{\n\tdisplay: flex;\n\talign-items: flex-end;\n\tposition: relative;\n}\n.pict-histogram-container.pict-histogram-horizontal\n{\n\tdisplay: inline-flex;\n\tflex-direction: row;\n\talign-items: stretch;\n}\n.pict-histogram-chart.pict-histogram-horizontal\n{\n\tflex-direction: column;\n\talign-items: flex-start;\n}\n.pict-histogram-bar-group\n{\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tcursor: default;\n\tflex-shrink: 0;\n}\n.pict-histogram-horizontal .pict-histogram-bar-group\n{\n\tflex-direction: row;\n\talign-items: center;\n}\n.pict-histogram-bar\n{\n\ttransition: background-color 0.15s ease, height 0.2s ease, width 0.2s ease;\n\tborder-radius: 2px 2px 0 0;\n\tmin-width: 1px;\n\tmin-height: 1px;\n}\n.pict-histogram-horizontal .pict-histogram-bar\n{\n\tborder-radius: 0 2px 2px 0;\n}\n.pict-histogram-bar.pict-histogram-selectable\n{\n\tcursor: pointer;\n}\n.pict-histogram-bar.pict-histogram-selectable:hover\n{\n\topacity: 0.8;\n}\n.pict-histogram-bar.pict-histogram-selected\n{\n\tbox-shadow: 0 0 0 2px rgba(46, 204, 113, 0.4);\n}\n.pict-histogram-bar.pict-histogram-in-range\n{\n\topacity: 0.9;\n}\n.pict-histogram-value-label\n{\n\ttext-align: center;\n\tcolor: #666;\n\tfont-size: 11px;\n\tpadding: 2px 0;\n\twhite-space: nowrap;\n}\n.pict-histogram-horizontal .pict-histogram-value-label\n{\n\tpadding: 0 4px;\n}\n.pict-histogram-bin-label\n{\n\ttext-align: center;\n\tcolor: #333;\n\tfont-size: 11px;\n\tpadding: 4px 2px 0 2px;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.pict-histogram-horizontal .pict-histogram-bin-label\n{\n\tpadding: 0 4px 0 0;\n\ttext-align: right;\n\tmin-width: 40px;\n}\n.pict-histogram-range-slider-container\n{\n\tposition: relative;\n\twidth: 100%;\n\theight: 24px;\n\tmargin-top: 4px;\n}\n.pict-histogram-horizontal .pict-histogram-range-slider-container\n{\n\twidth: 24px;\n\theight: auto;\n\talign-self: stretch;\n\tmargin-top: 0;\n\tmargin-left: 4px;\n}\n.pict-histogram-range-track\n{\n\tposition: absolute;\n\ttop: 10px;\n\tleft: 0;\n\tright: 0;\n\theight: 4px;\n\tbackground: #E0E0E0;\n\tborder-radius: 2px;\n}\n.pict-histogram-horizontal .pict-histogram-range-track\n{\n\ttop: 0;\n\tleft: 10px;\n\tright: auto;\n\tbottom: 0;\n\twidth: 4px;\n\theight: auto;\n}\n.pict-histogram-range-fill\n{\n\tposition: absolute;\n\ttop: 10px;\n\theight: 4px;\n\tbackground: #4A90D9;\n\tborder-radius: 2px;\n}\n.pict-histogram-horizontal .pict-histogram-range-fill\n{\n\ttop: auto;\n\tleft: 10px;\n\twidth: 4px;\n\theight: auto;\n}\n.pict-histogram-range-handle\n{\n\tposition: absolute;\n\ttop: 4px;\n\twidth: 16px;\n\theight: 16px;\n\tbackground: #fff;\n\tborder: 2px solid #4A90D9;\n\tborder-radius: 50%;\n\tcursor: grab;\n\tz-index: 2;\n\ttransform: translateX(-50%);\n}\n.pict-histogram-horizontal .pict-histogram-range-handle\n{\n\ttop: auto;\n\tleft: 4px;\n\ttransform: translateY(-50%);\n}\n.pict-histogram-range-handle:active\n{\n\tcursor: grabbing;\n\tbackground: #4A90D9;\n}\n.pict-histogram-range-handle:active,\n.pict-histogram-range-handle:focus\n{\n\tbox-shadow: 0 0 0 3px rgba(74, 144, 217, 0.3);\n\toutline: none;\n}\n.pict-histogram-container.pict-histogram-fill\n{\n\tdisplay: block;\n\twidth: 100%;\n}\n.pict-histogram-fill .pict-histogram-chart\n{\n\twidth: 100%;\n}\n.pict-histogram-fill .pict-histogram-bar-group\n{\n\tflex: 1 1 0%;\n\tmin-width: 0;\n}\n.pict-histogram-fill .pict-histogram-bar\n{\n\twidth: 100%;\n}\n.pict-histogram-axis-line\n{\n\twidth: 100%;\n\theight: 1px;\n\tbackground: #ccc;\n}\n.pict-histogram-label-row\n{\n\tdisplay: flex;\n\twidth: 100%;\n}\n.pict-histogram-fill-label\n{\n\tfont-size: 10px;\n\tcolor: #666;\n\ttext-align: center;\n\twhite-space: nowrap;\n\toverflow: visible;\n\tline-height: 16px;\n}\n`\n});\n\n},{}],8:[function(require,module,exports){\n/**\n * Pict Section Histogram\n *\n * A histogram visualization section for the Pict MVC framework.\n *\n * Supports:\n * - Vertical and horizontal orientation\n * - Three render modes: browser (HTML/CSS), consoleui (blessed), cli (ANSI)\n * - Interactive selection: single click, multi-select, or range slider\n * - Data binding via Pict AppData addresses\n *\n * @module pict-section-histogram\n */\n\nconst libPictViewClass = require('pict-view');\nconst _DefaultConfiguration = require('./Pict-Section-Histogram-DefaultConfiguration.js');\n\nconst libRendererBrowser = require('./renderers/Pict-Histogram-Renderer-Browser.js');\nconst libRendererConsoleUI = require('./renderers/Pict-Histogram-Renderer-ConsoleUI.js');\nconst libRendererCLI = require('./renderers/Pict-Histogram-Renderer-CLI.js');\n\nclass PictSectionHistogram extends libPictViewClass\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tlet tmpOptions = Object.assign({}, _DefaultConfiguration, pOptions);\n\t\tsuper(pFable, tmpOptions, pServiceHash);\n\n\t\tthis.initialRenderComplete = false;\n\n\t\t// --- Selection State ---\n\n\t\t// Set of selected bin indices (for \"single\" and \"multiple\" modes)\n\t\tthis._selectedIndices = new Set();\n\n\t\t// Range bounds (for \"range\" mode)\n\t\tthis._selectionRangeStart = 0;\n\t\tthis._selectionRangeEnd = 0;\n\n\t\t// Resolve the renderer for the configured mode\n\t\tthis._renderer = this._resolveRenderer();\n\n\t\t// Apply initial selection if provided\n\t\tthis._applyInitialSelection();\n\t}\n\n\t/**\n\t * Set up the initial selection state from options.\n\t */\n\t_applyInitialSelection()\n\t{\n\t\tif (this.options.InitialSelection)\n\t\t{\n\t\t\tthis.setSelection(this.options.InitialSelection);\n\t\t}\n\t\telse if (this.options.Selectable && this.options.SelectionMode === 'range')\n\t\t{\n\t\t\t// Default: select all bins\n\t\t\tlet tmpBins = this.getBins();\n\t\t\tthis._selectionRangeStart = 0;\n\t\t\tthis._selectionRangeEnd = Math.max(0, tmpBins.length - 1);\n\t\t\tthis._syncSelectionFromRange();\n\t\t}\n\t}\n\n\t/**\n\t * Pick the renderer module based on RenderMode option.\n\t *\n\t * @returns {object} The renderer module { render, wireEvents }\n\t */\n\t_resolveRenderer()\n\t{\n\t\tswitch (this.options.RenderMode)\n\t\t{\n\t\t\tcase 'consoleui':\n\t\t\t\treturn libRendererConsoleUI;\n\t\t\tcase 'cli':\n\t\t\t\treturn libRendererCLI;\n\t\t\tcase 'browser':\n\t\t\tdefault:\n\t\t\t\treturn libRendererBrowser;\n\t\t}\n\t}\n\n\t// --- Data Access ---\n\n\t/**\n\t * Get the current bin data array.\n\t *\n\t * Reads from the configured DataAddress in AppData, falling back to\n\t * the static Bins option.\n\t *\n\t * @returns {Array} Array of bin objects\n\t */\n\tgetBins()\n\t{\n\t\tif (this.options.DataAddress)\n\t\t{\n\t\t\tconst tmpAddressSpace =\n\t\t\t{\n\t\t\t\tFable: this.fable,\n\t\t\t\tPict: this.fable,\n\t\t\t\tAppData: this.AppData,\n\t\t\t\tBundle: this.Bundle,\n\t\t\t\tOptions: this.options\n\t\t\t};\n\t\t\tlet tmpData = this.fable.manifest.getValueByHash(tmpAddressSpace, this.options.DataAddress);\n\t\t\tif (Array.isArray(tmpData))\n\t\t\t{\n\t\t\t\treturn tmpData;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.log.warn(`PICT-Histogram DataAddress [${this.options.DataAddress}] did not return an array.`);\n\t\t\t}\n\t\t}\n\n\t\treturn this.options.Bins || [];\n\t}\n\n\t/**\n\t * Set the bins programmatically (updates the Bins option).\n\t *\n\t * @param {Array} pBins - Array of bin objects { Label, Value, ... }\n\t */\n\tsetBins(pBins)\n\t{\n\t\tif (!Array.isArray(pBins))\n\t\t{\n\t\t\tthis.log.warn('PICT-Histogram setBins requires an array.');\n\t\t\treturn;\n\t\t}\n\t\tthis.options.Bins = pBins;\n\n\t\t// If we also have a DataAddress, write through\n\t\tif (this.options.DataAddress)\n\t\t{\n\t\t\tconst tmpAddressSpace =\n\t\t\t{\n\t\t\t\tFable: this.fable,\n\t\t\t\tPict: this.fable,\n\t\t\t\tAppData: this.AppData,\n\t\t\t\tBundle: this.Bundle,\n\t\t\t\tOptions: this.options\n\t\t\t};\n\t\t\tthis.fable.manifest.setValueByHash(tmpAddressSpace, this.options.DataAddress, pBins);\n\t\t}\n\t}\n\n\t// --- Selection Logic ---\n\n\t/**\n\t * Check whether a bin index is currently selected.\n\t *\n\t * @param {number} pIndex\n\t * @returns {boolean}\n\t */\n\tisIndexSelected(pIndex)\n\t{\n\t\tif (!this.options.Selectable)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.options.SelectionMode === 'range')\n\t\t{\n\t\t\treturn (pIndex === this._selectionRangeStart || pIndex === this._selectionRangeEnd);\n\t\t}\n\n\t\treturn this._selectedIndices.has(pIndex);\n\t}\n\n\t/**\n\t * Check whether a bin index falls within the current range selection\n\t * (but is not one of the range endpoints).\n\t *\n\t * @param {number} pIndex\n\t * @returns {boolean}\n\t */\n\tisIndexInRange(pIndex)\n\t{\n\t\tif (!this.options.Selectable || this.options.SelectionMode !== 'range')\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn (pIndex > this._selectionRangeStart && pIndex < this._selectionRangeEnd);\n\t}\n\n\t/**\n\t * Get the current selection state.\n\t *\n\t * @returns {object} Selection descriptor\n\t */\n\tgetSelection()\n\t{\n\t\tif (this.options.SelectionMode === 'range')\n\t\t{\n\t\t\tlet tmpBins = this.getBins();\n\t\t\tlet tmpIndices = [];\n\t\t\tfor (let i = this._selectionRangeStart; i <= this._selectionRangeEnd; i++)\n\t\t\t{\n\t\t\t\ttmpIndices.push(i);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tMode: 'range',\n\t\t\t\tRangeStart: this._selectionRangeStart,\n\t\t\t\tRangeEnd: this._selectionRangeEnd,\n\t\t\t\tSelectedIndices: tmpIndices,\n\t\t\t\tStartLabel: (tmpBins[this._selectionRangeStart] || {})[this.options.LabelProperty],\n\t\t\t\tEndLabel: (tmpBins[this._selectionRangeEnd] || {})[this.options.LabelProperty]\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn {\n\t\t\t\tMode: this.options.SelectionMode,\n\t\t\t\tSelectedIndices: Array.from(this._selectedIndices).sort((a, b) => a - b)\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Programmatically set the selection.\n\t *\n\t * @param {object|Array} pSelection - For range: { Start, End }; for single/multiple: array of indices\n\t */\n\tsetSelection(pSelection)\n\t{\n\t\tif (this.options.SelectionMode === 'range')\n\t\t{\n\t\t\tif (pSelection && typeof (pSelection.Start) === 'number' && typeof (pSelection.End) === 'number')\n\t\t\t{\n\t\t\t\tthis._selectionRangeStart = pSelection.Start;\n\t\t\t\tthis._selectionRangeEnd = pSelection.End;\n\t\t\t\tthis._syncSelectionFromRange();\n\t\t\t}\n\t\t}\n\t\telse if (Array.isArray(pSelection))\n\t\t{\n\t\t\tthis._selectedIndices = new Set(pSelection);\n\t\t}\n\n\t\tthis._writeSelectionToAddress();\n\t}\n\n\t/**\n\t * Handle a bar click in single or multiple selection mode.\n\t *\n\t * @param {number} pIndex - The clicked bin index\n\t */\n\thandleBarClick(pIndex)\n\t{\n\t\tif (this.options.SelectionMode === 'single')\n\t\t{\n\t\t\tthis._selectedIndices.clear();\n\t\t\tthis._selectedIndices.add(pIndex);\n\t\t}\n\t\telse if (this.options.SelectionMode === 'multiple')\n\t\t{\n\t\t\tif (this._selectedIndices.has(pIndex))\n\t\t\t{\n\t\t\t\tthis._selectedIndices.delete(pIndex);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis._selectedIndices.add(pIndex);\n\t\t\t}\n\t\t}\n\n\t\tthis._writeSelectionToAddress();\n\t\tthis.onSelectionChange(this.getSelection());\n\t\tthis.renderHistogram();\n\t}\n\n\t/**\n\t * Handle a bar click in range mode — moves the nearest handle.\n\t *\n\t * @param {number} pIndex - The clicked bin index\n\t */\n\thandleRangeBarClick(pIndex)\n\t{\n\t\tlet tmpDistStart = Math.abs(pIndex - this._selectionRangeStart);\n\t\tlet tmpDistEnd = Math.abs(pIndex - this._selectionRangeEnd);\n\n\t\tif (tmpDistStart <= tmpDistEnd)\n\t\t{\n\t\t\tthis._selectionRangeStart = Math.min(pIndex, this._selectionRangeEnd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._selectionRangeEnd = Math.max(pIndex, this._selectionRangeStart);\n\t\t}\n\n\t\tthis._syncSelectionFromRange();\n\t\tthis._writeSelectionToAddress();\n\t\tthis.onSelectionChange(this.getSelection());\n\t\tthis.renderHistogram();\n\t}\n\n\t/**\n\t * Sync _selectedIndices from the range bounds (so getSelection is consistent).\n\t */\n\t_syncSelectionFromRange()\n\t{\n\t\tthis._selectedIndices.clear();\n\t\tfor (let i = this._selectionRangeStart; i <= this._selectionRangeEnd; i++)\n\t\t{\n\t\t\tthis._selectedIndices.add(i);\n\t\t}\n\t}\n\n\t/**\n\t * Write the current selection state to the configured SelectionDataAddress.\n\t */\n\t_writeSelectionToAddress()\n\t{\n\t\tif (!this.options.SelectionDataAddress)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst tmpAddressSpace =\n\t\t{\n\t\t\tFable: this.fable,\n\t\t\tPict: this.fable,\n\t\t\tAppData: this.AppData,\n\t\t\tBundle: this.Bundle,\n\t\t\tOptions: this.options\n\t\t};\n\n\t\tthis.fable.manifest.setValueByHash(tmpAddressSpace, this.options.SelectionDataAddress, this.getSelection());\n\t}\n\n\t/**\n\t * Hook for subclasses or consumers to react to selection changes.\n\t *\n\t * @param {object} pSelection - The new selection state\n\t */\n\tonSelectionChange(pSelection)\n\t{\n\t\t// Override in subclass or assign externally\n\t}\n\n\t// --- Lifecycle Hooks ---\n\n\tonBeforeInitialize()\n\t{\n\t\tsuper.onBeforeInitialize();\n\t\treturn super.onBeforeInitialize();\n\t}\n\n\tonAfterRender(pRenderable)\n\t{\n\t\t// Inject CSS\n\t\tthis.pict.CSSMap.injectCSS();\n\n\t\tif (!this.initialRenderComplete)\n\t\t{\n\t\t\tthis.onAfterInitialRender();\n\t\t\tthis.initialRenderComplete = true;\n\t\t}\n\n\t\treturn super.onAfterRender(pRenderable);\n\t}\n\n\tonAfterInitialRender()\n\t{\n\t\tthis.renderHistogram();\n\t}\n\n\t/**\n\t * Render the histogram using the active renderer and wire events.\n\t */\n\trenderHistogram()\n\t{\n\t\t// Ensure CSS is injected (covers both lifecycle and direct calls)\n\t\tif (this.pict.CSSMap)\n\t\t{\n\t\t\tthis.pict.CSSMap.injectCSS();\n\t\t}\n\t\tthis._renderer.render(this);\n\t\tthis._renderer.wireEvents(this);\n\t\tthis.initialRenderComplete = true;\n\t}\n\n\t// --- Data Marshaling ---\n\n\tmarshalToView()\n\t{\n\t\tsuper.marshalToView();\n\t\tif (this.initialRenderComplete)\n\t\t{\n\t\t\tthis.renderHistogram();\n\t\t}\n\t}\n\n\tmarshalFromView()\n\t{\n\t\tsuper.marshalFromView();\n\t\tthis._writeSelectionToAddress();\n\t}\n\n\t// --- Public API ---\n\n\t/**\n\t * Change the orientation and re-render.\n\t *\n\t * @param {string} pOrientation - \"vertical\" or \"horizontal\"\n\t */\n\tsetOrientation(pOrientation)\n\t{\n\t\tif (pOrientation !== 'vertical' && pOrientation !== 'horizontal')\n\t\t{\n\t\t\tthis.log.warn(`PICT-Histogram invalid orientation: ${pOrientation}`);\n\t\t\treturn;\n\t\t}\n\t\tthis.options.Orientation = pOrientation;\n\t\tif (this.initialRenderComplete)\n\t\t{\n\t\t\tthis.renderHistogram();\n\t\t}\n\t}\n\n\t/**\n\t * Change the render mode and re-render.\n\t *\n\t * @param {string} pRenderMode - \"browser\", \"consoleui\", or \"cli\"\n\t */\n\tsetRenderMode(pRenderMode)\n\t{\n\t\tthis.options.RenderMode = pRenderMode;\n\t\tthis._renderer = this._resolveRenderer();\n\t\tif (this.initialRenderComplete)\n\t\t{\n\t\t\tthis.renderHistogram();\n\t\t}\n\t}\n\n\t/**\n\t * Convenience: get the text representation (useful for CLI/consoleui).\n\t *\n\t * @returns {string}\n\t */\n\ttoText()\n\t{\n\t\tif (this.options.Orientation === 'vertical')\n\t\t{\n\t\t\treturn libRendererConsoleUI.renderVertical(this);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn libRendererConsoleUI.renderHorizontal(this);\n\t\t}\n\t}\n}\n\nmodule.exports = PictSectionHistogram;\n\nmodule.exports.default_configuration = _DefaultConfiguration;\nmodule.exports.renderers = {\n\tbrowser: libRendererBrowser,\n\tconsoleui: libRendererConsoleUI,\n\tcli: libRendererCLI\n};\n\n},{\"./Pict-Section-Histogram-DefaultConfiguration.js\":7,\"./renderers/Pict-Histogram-Renderer-Browser.js\":9,\"./renderers/Pict-Histogram-Renderer-CLI.js\":10,\"./renderers/Pict-Histogram-Renderer-ConsoleUI.js\":11,\"pict-view\":13}],9:[function(require,module,exports){\n/**\n * Browser renderer for pict-section-histogram.\n *\n * Renders the histogram as HTML/CSS elements using the Pict ContentAssignment\n * pipeline. Also wires up interactive selection (click, drag-slider) via\n * DOM event listeners.\n *\n * @module Pict-Histogram-Renderer-Browser\n */\n\n/**\n * Build the HTML string for a single bar group (bar + optional labels).\n *\n * @param {object} pBin - The bin data { Label, Value, ... }\n * @param {number} pIndex - Index of the bin\n * @param {number} pBarSize - Computed bar size in pixels\n * @param {object} pOptions - View options\n * @param {boolean} pIsSelected - Whether this bin is selected\n * @param {boolean} pInRange - Whether this bin is inside the range selection\n * @param {number} pLabelWidth - Fixed label width in pixels (horizontal mode)\n * @returns {string} HTML fragment\n */\nfunction buildBarGroupHTML(pBin, pIndex, pBarSize, pOptions, pIsSelected, pInRange, pLabelWidth)\n{\n\tlet tmpLabel = pBin[pOptions.LabelProperty] || '';\n\tlet tmpValue = pBin[pOptions.ValueProperty] || 0;\n\tlet tmpVertical = (pOptions.Orientation === 'vertical');\n\tlet tmpBarColor = pIsSelected ? pOptions.SelectedBarColor\n\t\t: pInRange ? pOptions.SelectionRangeColor\n\t\t: pOptions.BarColor;\n\n\tlet tmpSelectableClass = pOptions.Selectable ? ' pict-histogram-selectable' : '';\n\tlet tmpSelectedClass = pIsSelected ? ' pict-histogram-selected' : '';\n\tlet tmpInRangeClass = pInRange ? ' pict-histogram-in-range' : '';\n\n\tlet tmpFillMode = pOptions.FillContainer;\n\n\tlet tmpBarStyle = '';\n\tif (tmpVertical)\n\t{\n\t\tif (tmpFillMode)\n\t\t{\n\t\t\ttmpBarStyle = `height:${pBarSize}px;background-color:${tmpBarColor};`;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpBarStyle = `height:${pBarSize}px;width:${pOptions.BarThickness}px;background-color:${tmpBarColor};`;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (tmpFillMode)\n\t\t{\n\t\t\ttmpBarStyle = `width:${pBarSize}px;background-color:${tmpBarColor};`;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpBarStyle = `width:${pBarSize}px;height:${pOptions.BarThickness}px;background-color:${tmpBarColor};`;\n\t\t}\n\t}\n\n\tlet tmpGroupWidth = pOptions.BarThickness + pOptions.BarGap;\n\tlet tmpGroupStyle = '';\n\tif (tmpFillMode)\n\t{\n\t\t// No fixed dimensions — CSS flex:1 handles sizing\n\t\ttmpGroupStyle = '';\n\t}\n\telse if (tmpVertical)\n\t{\n\t\ttmpGroupStyle = `margin:0 ${pOptions.BarGap / 2}px;width:${tmpGroupWidth}px;`;\n\t}\n\telse\n\t{\n\t\ttmpGroupStyle = `margin:${pOptions.BarGap / 2}px 0;`;\n\t}\n\n\tlet tmpHTML = `<div class=\"pict-histogram-bar-group\" style=\"${tmpGroupStyle}\" data-histogram-index=\"${pIndex}\">`;\n\n\tif (tmpVertical)\n\t{\n\t\t// Value label above bar (skipped in fill mode — values don't fit in narrow columns)\n\t\tif (pOptions.ShowValues && !tmpFillMode)\n\t\t{\n\t\t\ttmpHTML += `<div class=\"pict-histogram-value-label\" style=\"width:${tmpGroupWidth}px;\">${tmpValue}</div>`;\n\t\t}\n\t\t// Bar\n\t\ttmpHTML += `<div class=\"pict-histogram-bar${tmpSelectableClass}${tmpSelectedClass}${tmpInRangeClass}\" style=\"${tmpBarStyle}\" data-histogram-index=\"${pIndex}\"></div>`;\n\t\t// Bin label below bar (skipped in fill mode — labels rendered in a separate row)\n\t\tif (pOptions.ShowLabels && !tmpFillMode)\n\t\t{\n\t\t\ttmpHTML += `<div class=\"pict-histogram-bin-label\" style=\"width:${tmpGroupWidth}px;\">${tmpLabel}</div>`;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Bin label to the left (fixed width so bars align)\n\t\tif (pOptions.ShowLabels)\n\t\t{\n\t\t\tlet tmpLabelStyle = pLabelWidth ? `width:${pLabelWidth}px;min-width:${pLabelWidth}px;` : '';\n\t\t\ttmpHTML += `<div class=\"pict-histogram-bin-label\" style=\"${tmpLabelStyle}\">${tmpLabel}</div>`;\n\t\t}\n\t\t// Bar\n\t\ttmpHTML += `<div class=\"pict-histogram-bar${tmpSelectableClass}${tmpSelectedClass}${tmpInRangeClass}\" style=\"${tmpBarStyle}\" data-histogram-index=\"${pIndex}\"></div>`;\n\t\t// Value label to the right\n\t\tif (pOptions.ShowValues)\n\t\t{\n\t\t\ttmpHTML += `<div class=\"pict-histogram-value-label\">${tmpValue}</div>`;\n\t\t}\n\t}\n\n\ttmpHTML += '</div>';\n\treturn tmpHTML;\n}\n\n/**\n * Build the HTML for the range-slider overlay (used in \"range\" selection mode).\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} HTML fragment\n */\nfunction buildRangeSliderHTML(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '';\n\t}\n\n\tlet tmpRangeStart = pView._selectionRangeStart;\n\tlet tmpRangeEnd = pView._selectionRangeEnd;\n\tlet tmpMax = tmpBins.length - 1;\n\n\t// Calculate percentage positions for the handles\n\tlet tmpStartPct = (tmpMax > 0) ? ((tmpRangeStart / tmpMax) * 100) : 0;\n\tlet tmpEndPct = (tmpMax > 0) ? ((tmpRangeEnd / tmpMax) * 100) : 100;\n\n\tlet tmpVertical = (pView.options.Orientation === 'vertical');\n\n\tlet tmpHTML = '<div class=\"pict-histogram-range-slider-container\">';\n\ttmpHTML += '<div class=\"pict-histogram-range-track\"></div>';\n\n\tif (tmpVertical)\n\t{\n\t\ttmpHTML += `<div class=\"pict-histogram-range-fill\" style=\"left:${tmpStartPct}%;right:${100 - tmpEndPct}%;\"></div>`;\n\t\ttmpHTML += `<div class=\"pict-histogram-range-handle pict-histogram-range-handle-start\" tabindex=\"0\" style=\"left:${tmpStartPct}%;\" data-handle=\"start\"></div>`;\n\t\ttmpHTML += `<div class=\"pict-histogram-range-handle pict-histogram-range-handle-end\" tabindex=\"0\" style=\"left:${tmpEndPct}%;\" data-handle=\"end\"></div>`;\n\t}\n\telse\n\t{\n\t\ttmpHTML += `<div class=\"pict-histogram-range-fill\" style=\"top:${tmpStartPct}%;bottom:${100 - tmpEndPct}%;\"></div>`;\n\t\ttmpHTML += `<div class=\"pict-histogram-range-handle pict-histogram-range-handle-start\" tabindex=\"0\" style=\"top:${tmpStartPct}%;\" data-handle=\"start\"></div>`;\n\t\ttmpHTML += `<div class=\"pict-histogram-range-handle pict-histogram-range-handle-end\" tabindex=\"0\" style=\"top:${tmpEndPct}%;\" data-handle=\"end\"></div>`;\n\t}\n\n\ttmpHTML += '</div>';\n\treturn tmpHTML;\n}\n\n/**\n * Build the label row for FillContainer vertical mode.\n *\n * Labels are rendered in a separate flex row below the axis line, with\n * automatic interval calculation to avoid overlap when there are many bins.\n *\n * @param {object} pView - The histogram view instance\n * @param {Array} pBins - The bin data array\n * @returns {string} HTML fragment\n */\nfunction buildFillLabelRow(pView, pBins)\n{\n\tif (!pBins || pBins.length === 0)\n\t{\n\t\treturn '';\n\t}\n\n\t// Determine label interval: explicit setting or auto-compute\n\tlet tmpLabelInterval = pView.options.LabelInterval || 0;\n\tif (tmpLabelInterval <= 0)\n\t{\n\t\t// Auto-compute: space labels approximately 80px apart\n\t\tlet tmpTargetElementSet = pView.services.ContentAssignment.getElement(pView.options.TargetElementAddress);\n\t\tlet tmpContainerWidth = 800;\n\t\tif (tmpTargetElementSet && tmpTargetElementSet.length > 0 && tmpTargetElementSet[0])\n\t\t{\n\t\t\ttmpContainerWidth = tmpTargetElementSet[0].clientWidth || 800;\n\t\t}\n\t\tif (pBins.length > 0)\n\t\t{\n\t\t\tlet tmpBarWidth = tmpContainerWidth / pBins.length;\n\t\t\ttmpLabelInterval = Math.max(1, Math.ceil(80 / tmpBarWidth));\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpLabelInterval = 1;\n\t\t}\n\t}\n\n\tlet tmpHTML = '<div class=\"pict-histogram-label-row\">';\n\n\tfor (let i = 0; i < pBins.length; i++)\n\t{\n\t\tlet tmpIsLabeled = (i % tmpLabelInterval === 0);\n\t\tif (tmpIsLabeled)\n\t\t{\n\t\t\tlet tmpLabel = pBins[i][pView.options.LabelProperty] || '';\n\t\t\t// Span covers this label and the unlabeled bars until the next label\n\t\t\tlet tmpSpan = Math.min(tmpLabelInterval, pBins.length - i);\n\t\t\ttmpHTML += `<div class=\"pict-histogram-fill-label\" style=\"flex:${tmpSpan};\">${tmpLabel}</div>`;\n\t\t\ti += tmpSpan - 1;\n\t\t}\n\t}\n\n\ttmpHTML += '</div>';\n\treturn tmpHTML;\n}\n\n/**\n * Render the full histogram into the target element.\n *\n * @param {object} pView - The histogram view instance\n */\nfunction render(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\tpView.services.ContentAssignment.assignContent(\n\t\t\tpView.options.TargetElementAddress,\n\t\t\t'<div class=\"pict-histogram-container\"><em>No histogram data</em></div>'\n\t\t);\n\t\treturn;\n\t}\n\n\tlet tmpMaxValue = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][pView.options.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\tlet tmpVertical = (pView.options.Orientation === 'vertical');\n\tlet tmpOrientationClass = tmpVertical ? 'pict-histogram-vertical' : 'pict-histogram-horizontal';\n\tlet tmpFillClass = pView.options.FillContainer ? ' pict-histogram-fill' : '';\n\n\t// For horizontal mode (non-fill), measure the longest label so all labels share the same width\n\tlet tmpLabelWidth = 0;\n\tif (!tmpVertical && pView.options.ShowLabels && !pView.options.FillContainer)\n\t{\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpLabel = String(tmpBins[i][pView.options.LabelProperty] || '');\n\t\t\t// Approximate character width at 11px font: ~6.5px per character\n\t\t\tlet tmpEstWidth = tmpLabel.length * 6.5 + 8;\n\t\t\tif (tmpEstWidth > tmpLabelWidth)\n\t\t\t{\n\t\t\t\ttmpLabelWidth = tmpEstWidth;\n\t\t\t}\n\t\t}\n\t\ttmpLabelWidth = Math.max(tmpLabelWidth, 40);\n\t}\n\n\tlet tmpHTML = `<div class=\"pict-histogram-container ${tmpOrientationClass}${tmpFillClass}\">`;\n\ttmpHTML += `<div class=\"pict-histogram-chart ${tmpOrientationClass}${tmpFillClass}\">`;\n\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][pView.options.ValueProperty] || 0;\n\t\tlet tmpBarSize = Math.round((tmpVal / tmpMaxValue) * pView.options.MaxBarSize);\n\t\tif (tmpVal > 0 && tmpBarSize < 1)\n\t\t{\n\t\t\ttmpBarSize = 1;\n\t\t}\n\n\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\n\t\ttmpHTML += buildBarGroupHTML(tmpBins[i], i, tmpBarSize, pView.options, tmpIsSelected, tmpInRange, tmpLabelWidth);\n\t}\n\n\ttmpHTML += '</div>';\n\n\t// In FillContainer vertical mode, render axis line and label row separately\n\tif (pView.options.FillContainer && tmpVertical && pView.options.ShowLabels)\n\t{\n\t\ttmpHTML += '<div class=\"pict-histogram-axis-line\"></div>';\n\t\ttmpHTML += buildFillLabelRow(pView, tmpBins);\n\t}\n\n\t// Range slider for \"range\" selection mode\n\tif (pView.options.Selectable && pView.options.SelectionMode === 'range')\n\t{\n\t\ttmpHTML += buildRangeSliderHTML(pView);\n\t}\n\n\ttmpHTML += '</div>';\n\n\tpView.services.ContentAssignment.assignContent(pView.options.TargetElementAddress, tmpHTML);\n}\n\n/**\n * Wire up DOM event listeners for interactivity (click selection, range drag).\n *\n * @param {object} pView - The histogram view instance\n */\nfunction wireEvents(pView)\n{\n\tif (!pView.options.Selectable)\n\t{\n\t\treturn;\n\t}\n\n\tlet tmpTargetElementSet = pView.services.ContentAssignment.getElement(pView.options.TargetElementAddress);\n\tif (!tmpTargetElementSet || tmpTargetElementSet.length < 1)\n\t{\n\t\treturn;\n\t}\n\tlet tmpContainer = tmpTargetElementSet[0];\n\tif (!tmpContainer)\n\t{\n\t\treturn;\n\t}\n\n\t// --- Bar click selection (single / multiple modes) ---\n\tif (pView.options.SelectionMode === 'single' || pView.options.SelectionMode === 'multiple')\n\t{\n\t\tlet tmpBars = tmpContainer.querySelectorAll('.pict-histogram-bar[data-histogram-index]');\n\t\tfor (let i = 0; i < tmpBars.length; i++)\n\t\t{\n\t\t\ttmpBars[i].addEventListener('click', (pEvent) =>\n\t\t\t{\n\t\t\t\tlet tmpIndex = parseInt(pEvent.currentTarget.getAttribute('data-histogram-index'), 10);\n\t\t\t\tif (isNaN(tmpIndex))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpView.handleBarClick(tmpIndex);\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Range slider drag ---\n\tif (pView.options.SelectionMode === 'range')\n\t{\n\t\t// Also allow clicking bars to move nearest handle\n\t\tlet tmpBars = tmpContainer.querySelectorAll('.pict-histogram-bar[data-histogram-index]');\n\t\tfor (let i = 0; i < tmpBars.length; i++)\n\t\t{\n\t\t\ttmpBars[i].addEventListener('click', (pEvent) =>\n\t\t\t{\n\t\t\t\tlet tmpIndex = parseInt(pEvent.currentTarget.getAttribute('data-histogram-index'), 10);\n\t\t\t\tif (isNaN(tmpIndex))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpView.handleRangeBarClick(tmpIndex);\n\t\t\t});\n\t\t}\n\n\t\tlet tmpHandles = tmpContainer.querySelectorAll('.pict-histogram-range-handle');\n\t\tfor (let i = 0; i < tmpHandles.length; i++)\n\t\t{\n\t\t\twireRangeHandle(pView, tmpHandles[i], tmpContainer);\n\t\t}\n\t}\n}\n\n/**\n * Wire drag behavior on a single range handle element.\n *\n * @param {object} pView - The histogram view instance\n * @param {Element} pHandle - The handle DOM element\n * @param {Element} pContainer - The histogram container element\n */\nfunction wireRangeHandle(pView, pHandle, pContainer)\n{\n\tlet tmpHandleType = pHandle.getAttribute('data-handle'); // \"start\" or \"end\"\n\tlet tmpVertical = (pView.options.Orientation === 'vertical');\n\n\tlet tmpDragging = false;\n\n\tfunction getSliderBounds()\n\t{\n\t\t// Re-query from pContainer every time because renderHistogram() replaces\n\t\t// the inner HTML, detaching any previously-captured slider element.\n\t\tlet tmpSlider = pContainer.querySelector('.pict-histogram-range-slider-container');\n\t\tif (!tmpSlider)\n\t\t{\n\t\t\treturn { start: 0, size: 1 };\n\t\t}\n\t\tlet tmpRect = tmpSlider.getBoundingClientRect();\n\t\tif (tmpVertical)\n\t\t{\n\t\t\treturn { start: tmpRect.left, size: tmpRect.width || 1 };\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn { start: tmpRect.top, size: tmpRect.height || 1 };\n\t\t}\n\t}\n\n\tfunction onPointerMove(pEvent)\n\t{\n\t\tif (!tmpDragging)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpBins = pView.getBins();\n\t\tif (!tmpBins || tmpBins.length === 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpBounds = getSliderBounds();\n\t\tlet tmpPos = tmpVertical ? pEvent.clientX : pEvent.clientY;\n\t\tlet tmpPct = (tmpPos - tmpBounds.start) / tmpBounds.size;\n\t\ttmpPct = Math.max(0, Math.min(1, tmpPct));\n\n\t\tlet tmpIndex = Math.round(tmpPct * (tmpBins.length - 1));\n\n\t\tif (tmpHandleType === 'start')\n\t\t{\n\t\t\tif (tmpIndex > pView._selectionRangeEnd)\n\t\t\t{\n\t\t\t\ttmpIndex = pView._selectionRangeEnd;\n\t\t\t}\n\t\t\tpView._selectionRangeStart = tmpIndex;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (tmpIndex < pView._selectionRangeStart)\n\t\t\t{\n\t\t\t\ttmpIndex = pView._selectionRangeStart;\n\t\t\t}\n\t\t\tpView._selectionRangeEnd = tmpIndex;\n\t\t}\n\n\t\tpView._syncSelectionFromRange();\n\t\tpView.renderHistogram();\n\t}\n\n\tfunction onPointerUp()\n\t{\n\t\tif (!tmpDragging)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\ttmpDragging = false;\n\t\tif (typeof (document) !== 'undefined')\n\t\t{\n\t\t\tdocument.removeEventListener('mousemove', onPointerMove);\n\t\t\tdocument.removeEventListener('mouseup', onPointerUp);\n\t\t}\n\t}\n\n\tpHandle.addEventListener('mousedown', (pEvent) =>\n\t{\n\t\tpEvent.preventDefault();\n\t\ttmpDragging = true;\n\t\tif (typeof (document) !== 'undefined')\n\t\t{\n\t\t\tdocument.addEventListener('mousemove', onPointerMove);\n\t\t\tdocument.addEventListener('mouseup', onPointerUp);\n\t\t}\n\t});\n}\n\nmodule.exports = { render, wireEvents };\n\n},{}],10:[function(require,module,exports){\n(function (process){(function (){\n/**\n * CLI renderer for pict-section-histogram.\n *\n * Renders the histogram as ANSI-colored text written directly to stdout\n * (or through the Pict ContentAssignment pipeline if available).\n *\n * This mode is intended for command-line tools that print histogram output\n * without a full terminal UI framework.\n *\n * @module Pict-Histogram-Renderer-CLI\n */\n\n// ANSI color codes (basic 16-color)\nconst ANSI_COLORS = {\n\t'black': '\\x1b[30m',\n\t'red': '\\x1b[31m',\n\t'green': '\\x1b[32m',\n\t'yellow': '\\x1b[33m',\n\t'blue': '\\x1b[34m',\n\t'magenta': '\\x1b[35m',\n\t'cyan': '\\x1b[36m',\n\t'white': '\\x1b[37m',\n\t'reset': '\\x1b[0m',\n\t'bold': '\\x1b[1m',\n\t'dim': '\\x1b[2m'\n};\n\n/**\n * Map a CSS-ish color string to the nearest ANSI color.\n *\n * @param {string} pColor - A color string (name or hex)\n * @returns {string} ANSI escape code\n */\nfunction colorToAnsi(pColor)\n{\n\tif (!pColor)\n\t{\n\t\treturn ANSI_COLORS.blue;\n\t}\n\n\tlet tmpLower = pColor.toLowerCase();\n\n\t// Direct name match\n\tif (ANSI_COLORS[tmpLower])\n\t{\n\t\treturn ANSI_COLORS[tmpLower];\n\t}\n\n\t// Simple hex-to-nearest mapping\n\tif (tmpLower.charAt(0) === '#' && tmpLower.length >= 7)\n\t{\n\t\tlet tmpR = parseInt(tmpLower.substring(1, 3), 16);\n\t\tlet tmpG = parseInt(tmpLower.substring(3, 5), 16);\n\t\tlet tmpB = parseInt(tmpLower.substring(5, 7), 16);\n\n\t\t// Pick nearest basic color\n\t\tif (tmpG > tmpR && tmpG > tmpB)\n\t\t{\n\t\t\treturn ANSI_COLORS.green;\n\t\t}\n\t\tif (tmpR > tmpG && tmpR > tmpB)\n\t\t{\n\t\t\treturn ANSI_COLORS.red;\n\t\t}\n\t\tif (tmpB > tmpR && tmpB > tmpG)\n\t\t{\n\t\t\treturn ANSI_COLORS.blue;\n\t\t}\n\t\tif (tmpR > 200 && tmpG > 200)\n\t\t{\n\t\t\treturn ANSI_COLORS.yellow;\n\t\t}\n\t\tif (tmpR > 200 && tmpB > 200)\n\t\t{\n\t\t\treturn ANSI_COLORS.magenta;\n\t\t}\n\t\tif (tmpG > 200 && tmpB > 200)\n\t\t{\n\t\t\treturn ANSI_COLORS.cyan;\n\t\t}\n\t}\n\n\treturn ANSI_COLORS.blue;\n}\n\n/**\n * Render a vertical CLI histogram.\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} The ANSI text output\n */\nfunction renderVertical(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tlet tmpOptions = pView.options;\n\tlet tmpHeight = tmpOptions.TextHeight || 15;\n\tlet tmpBarChar = tmpOptions.BarCharacter;\n\tlet tmpPartials = tmpOptions.BarPartialCharacters;\n\tlet tmpBarColor = colorToAnsi(tmpOptions.BarColor);\n\tlet tmpSelectedColor = colorToAnsi(tmpOptions.SelectedBarColor);\n\tlet tmpRangeColor = colorToAnsi(tmpOptions.SelectionRangeColor);\n\tlet tmpReset = ANSI_COLORS.reset;\n\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '(no data)\\n';\n\t}\n\n\tlet tmpMaxValue = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\tlet tmpValueAxisWidth = String(tmpMaxValue).length + 1;\n\tlet tmpLines = [];\n\n\tfor (let tmpRow = tmpHeight; tmpRow >= 1; tmpRow--)\n\t{\n\t\tlet tmpLine = '';\n\n\t\t// Axis labels\n\t\tif (tmpRow === tmpHeight)\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + padLeft(String(tmpMaxValue), tmpValueAxisWidth) + '|' + tmpReset;\n\t\t}\n\t\telse if (tmpRow === 1)\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + padLeft('0', tmpValueAxisWidth) + '|' + tmpReset;\n\t\t}\n\t\telse if (tmpRow === Math.ceil(tmpHeight / 2))\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + padLeft(String(Math.round(tmpMaxValue / 2)), tmpValueAxisWidth) + '|' + tmpReset;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + padLeft('', tmpValueAxisWidth) + '|' + tmpReset;\n\t\t}\n\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\t\tlet tmpBarHeight = (tmpVal / tmpMaxValue) * tmpHeight;\n\t\t\tlet tmpFullRows = Math.floor(tmpBarHeight);\n\t\t\tlet tmpFraction = tmpBarHeight - tmpFullRows;\n\n\t\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\t\t\tlet tmpColor = tmpIsSelected ? tmpSelectedColor : (tmpInRange ? tmpRangeColor : tmpBarColor);\n\n\t\t\tlet tmpChar = ' ';\n\t\t\tif (tmpRow <= tmpFullRows)\n\t\t\t{\n\t\t\t\ttmpChar = tmpBarChar;\n\t\t\t}\n\t\t\telse if (tmpRow === tmpFullRows + 1 && tmpFraction > 0)\n\t\t\t{\n\t\t\t\tlet tmpPartialIndex = Math.round(tmpFraction * (tmpPartials.length - 1));\n\t\t\t\ttmpChar = tmpPartials[tmpPartialIndex];\n\t\t\t}\n\n\t\t\tif (tmpChar !== ' ')\n\t\t\t{\n\t\t\t\ttmpLine += ' ' + tmpColor + tmpChar + tmpChar + tmpChar + tmpReset;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmpLine += ' ';\n\t\t\t}\n\t\t}\n\n\t\ttmpLines.push(tmpLine);\n\t}\n\n\t// Bottom axis\n\tlet tmpAxisLine = ANSI_COLORS.dim + padLeft('', tmpValueAxisWidth) + '+';\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\ttmpAxisLine += '----';\n\t}\n\ttmpAxisLine += tmpReset;\n\ttmpLines.push(tmpAxisLine);\n\n\t// Labels\n\tif (tmpOptions.ShowLabels)\n\t{\n\t\tlet tmpLabelLine = padLeft('', tmpValueAxisWidth) + ' ';\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\t\ttmpLabelLine += padCenter(tmpLabel.substring(0, 4), 4);\n\t\t}\n\t\ttmpLines.push(tmpLabelLine);\n\t}\n\n\t// Range selection info\n\tif (tmpOptions.Selectable && tmpOptions.SelectionMode === 'range')\n\t{\n\t\tlet tmpStart = pView._selectionRangeStart;\n\t\tlet tmpEnd = pView._selectionRangeEnd;\n\t\tlet tmpStartLabel = tmpBins[tmpStart] ? tmpBins[tmpStart][tmpOptions.LabelProperty] : tmpStart;\n\t\tlet tmpEndLabel = tmpBins[tmpEnd] ? tmpBins[tmpEnd][tmpOptions.LabelProperty] : tmpEnd;\n\t\ttmpLines.push('');\n\t\ttmpLines.push(ANSI_COLORS.bold + ' Selection: ' + tmpStartLabel + ' - ' + tmpEndLabel + tmpReset);\n\t}\n\n\treturn tmpLines.join('\\n') + '\\n';\n}\n\n/**\n * Render a horizontal CLI histogram.\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} The ANSI text output\n */\nfunction renderHorizontal(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tlet tmpOptions = pView.options;\n\tlet tmpWidth = tmpOptions.TextWidth || 60;\n\tlet tmpBarChar = tmpOptions.BarCharacter;\n\tlet tmpBarColor = colorToAnsi(tmpOptions.BarColor);\n\tlet tmpSelectedColor = colorToAnsi(tmpOptions.SelectedBarColor);\n\tlet tmpRangeColor = colorToAnsi(tmpOptions.SelectionRangeColor);\n\tlet tmpReset = ANSI_COLORS.reset;\n\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '(no data)\\n';\n\t}\n\n\tlet tmpMaxValue = 0;\n\tlet tmpMaxLabelLen = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\tif (tmpLabel.length > tmpMaxLabelLen)\n\t\t{\n\t\t\ttmpMaxLabelLen = tmpLabel.length;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\tlet tmpLabelWidth = Math.min(tmpMaxLabelLen, 12);\n\tlet tmpValueWidth = String(tmpMaxValue).length;\n\tlet tmpBarWidth = tmpWidth - tmpLabelWidth - tmpValueWidth - 4;\n\tif (tmpBarWidth < 10)\n\t{\n\t\ttmpBarWidth = 10;\n\t}\n\n\tlet tmpLines = [];\n\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\tlet tmpBarLen = Math.round((tmpVal / tmpMaxValue) * tmpBarWidth);\n\n\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\t\tlet tmpColor = tmpIsSelected ? tmpSelectedColor : (tmpInRange ? tmpRangeColor : tmpBarColor);\n\n\t\tlet tmpBar = '';\n\t\tfor (let j = 0; j < tmpBarLen; j++)\n\t\t{\n\t\t\ttmpBar += tmpBarChar;\n\t\t}\n\n\t\tlet tmpLine = ANSI_COLORS.dim + padRight(tmpLabel.substring(0, tmpLabelWidth), tmpLabelWidth) + ' |' + tmpReset;\n\t\ttmpLine += tmpColor + tmpBar + tmpReset;\n\t\ttmpLine += ' ' + tmpVal;\n\n\t\tif (tmpIsSelected)\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.bold + ' *' + tmpReset;\n\t\t}\n\t\telse if (tmpInRange)\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + ' ~' + tmpReset;\n\t\t}\n\n\t\ttmpLines.push(tmpLine);\n\t}\n\n\t// Range info\n\tif (tmpOptions.Selectable && tmpOptions.SelectionMode === 'range')\n\t{\n\t\tlet tmpStart = pView._selectionRangeStart;\n\t\tlet tmpEnd = pView._selectionRangeEnd;\n\t\tlet tmpStartLabel = tmpBins[tmpStart] ? tmpBins[tmpStart][tmpOptions.LabelProperty] : tmpStart;\n\t\tlet tmpEndLabel = tmpBins[tmpEnd] ? tmpBins[tmpEnd][tmpOptions.LabelProperty] : tmpEnd;\n\t\ttmpLines.push('');\n\t\ttmpLines.push(ANSI_COLORS.bold + ' Selection: ' + tmpStartLabel + ' - ' + tmpEndLabel + tmpReset);\n\t}\n\n\treturn tmpLines.join('\\n') + '\\n';\n}\n\n/**\n * Render in CLI mode. Writes to ContentAssignment if available, otherwise\n * falls back to process.stdout.\n *\n * @param {object} pView - The histogram view instance\n */\nfunction render(pView)\n{\n\tlet tmpText;\n\tif (pView.options.Orientation === 'vertical')\n\t{\n\t\ttmpText = renderVertical(pView);\n\t}\n\telse\n\t{\n\t\ttmpText = renderHorizontal(pView);\n\t}\n\n\t// Try ContentAssignment first (might be mocked in tests or bridged)\n\tif (pView.services && pView.services.ContentAssignment)\n\t{\n\t\tpView.services.ContentAssignment.assignContent(pView.options.TargetElementAddress, tmpText);\n\t}\n\telse if (typeof (process) !== 'undefined' && process.stdout)\n\t{\n\t\tprocess.stdout.write(tmpText);\n\t}\n}\n\n// No interactive events in CLI mode\nfunction wireEvents()\n{\n\t// No-op for CLI\n}\n\n// --- Utility ---\n\nfunction padLeft(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = ' ' + tmpStr;\n\t}\n\treturn tmpStr;\n}\n\nfunction padRight(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = tmpStr + ' ';\n\t}\n\treturn tmpStr;\n}\n\nfunction padCenter(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = (tmpStr.length % 2 === 0) ? (tmpStr + ' ') : (' ' + tmpStr);\n\t}\n\treturn tmpStr;\n}\n\nmodule.exports = { render, wireEvents, renderVertical, renderHorizontal, colorToAnsi, ANSI_COLORS };\n\n}).call(this)}).call(this,require('_process'))\n\n},{\"_process\":14}],11:[function(require,module,exports){\n/**\n * Console UI (blessed) renderer for pict-section-histogram.\n *\n * Renders the histogram as text art through the Pict ContentAssignment\n * pipeline, suitable for blessed/ncurses terminal UI widgets.\n *\n * The output is assigned via ContentAssignment so the pict-terminalui\n * bridge (customAssignFunction) can project it into blessed boxes.\n *\n * @module Pict-Histogram-Renderer-ConsoleUI\n */\n\n/**\n * Build a vertical text histogram.\n *\n * Each column is one bar. Rows go from top (max value) to bottom (0).\n * Uses block characters for fractional rows.\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} The rendered text block\n */\nfunction renderVertical(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tlet tmpOptions = pView.options;\n\tlet tmpHeight = tmpOptions.TextHeight || 15;\n\tlet tmpBarChar = tmpOptions.BarCharacter;\n\tlet tmpPartials = tmpOptions.BarPartialCharacters;\n\tlet tmpEmptyChar = tmpOptions.EmptyCharacter;\n\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '(no data)';\n\t}\n\n\tlet tmpMaxValue = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\t// Determine label width for the value axis\n\tlet tmpValueAxisWidth = String(tmpMaxValue).length + 1;\n\n\t// Build the grid top-down\n\tlet tmpLines = [];\n\n\tfor (let tmpRow = tmpHeight; tmpRow >= 1; tmpRow--)\n\t{\n\t\tlet tmpLine = '';\n\n\t\t// Value axis label (only on a few rows)\n\t\tif (tmpRow === tmpHeight)\n\t\t{\n\t\t\ttmpLine += padLeft(String(tmpMaxValue), tmpValueAxisWidth) + '|';\n\t\t}\n\t\telse if (tmpRow === 1)\n\t\t{\n\t\t\ttmpLine += padLeft('0', tmpValueAxisWidth) + '|';\n\t\t}\n\t\telse if (tmpRow === Math.ceil(tmpHeight / 2))\n\t\t{\n\t\t\ttmpLine += padLeft(String(Math.round(tmpMaxValue / 2)), tmpValueAxisWidth) + '|';\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpLine += padLeft('', tmpValueAxisWidth) + '|';\n\t\t}\n\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\t\tlet tmpBarHeight = (tmpVal / tmpMaxValue) * tmpHeight;\n\t\t\tlet tmpFullRows = Math.floor(tmpBarHeight);\n\t\t\tlet tmpFraction = tmpBarHeight - tmpFullRows;\n\n\t\t\tlet tmpChar = tmpEmptyChar;\n\t\t\tif (tmpRow <= tmpFullRows)\n\t\t\t{\n\t\t\t\ttmpChar = tmpBarChar;\n\t\t\t}\n\t\t\telse if (tmpRow === tmpFullRows + 1 && tmpFraction > 0)\n\t\t\t{\n\t\t\t\tlet tmpPartialIndex = Math.round(tmpFraction * (tmpPartials.length - 1));\n\t\t\t\ttmpChar = tmpPartials[tmpPartialIndex];\n\t\t\t}\n\n\t\t\t// Mark selected bins\n\t\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\n\t\t\tif (tmpIsSelected && tmpChar !== tmpEmptyChar)\n\t\t\t{\n\t\t\t\ttmpChar = '*';\n\t\t\t}\n\t\t\telse if (tmpInRange && tmpChar !== tmpEmptyChar)\n\t\t\t{\n\t\t\t\ttmpChar = '#';\n\t\t\t}\n\n\t\t\t// Each bar is 3 chars wide with 1 char gap\n\t\t\ttmpLine += ' ' + tmpChar + tmpChar + tmpChar;\n\t\t}\n\n\t\ttmpLines.push(tmpLine);\n\t}\n\n\t// Bottom axis\n\tlet tmpAxisLine = padLeft('', tmpValueAxisWidth) + '+';\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\ttmpAxisLine += '----';\n\t}\n\ttmpLines.push(tmpAxisLine);\n\n\t// Labels row\n\tif (tmpOptions.ShowLabels)\n\t{\n\t\tlet tmpLabelLine = padLeft('', tmpValueAxisWidth) + ' ';\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\t\ttmpLabelLine += padCenter(tmpLabel.substring(0, 4), 4);\n\t\t}\n\t\ttmpLines.push(tmpLabelLine);\n\t}\n\n\t// Selection range indicator\n\tif (tmpOptions.Selectable && tmpOptions.SelectionMode === 'range')\n\t{\n\t\tlet tmpRangeLine = padLeft('', tmpValueAxisWidth) + ' ';\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tif (i === pView._selectionRangeStart)\n\t\t\t{\n\t\t\t\ttmpRangeLine += ' [ ';\n\t\t\t}\n\t\t\telse if (i === pView._selectionRangeEnd)\n\t\t\t{\n\t\t\t\ttmpRangeLine += ' ] ';\n\t\t\t}\n\t\t\telse if (i > pView._selectionRangeStart && i < pView._selectionRangeEnd)\n\t\t\t{\n\t\t\t\ttmpRangeLine += ' - ';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmpRangeLine += ' ';\n\t\t\t}\n\t\t}\n\t\ttmpLines.push(tmpRangeLine);\n\t}\n\n\treturn tmpLines.join('\\n');\n}\n\n/**\n * Build a horizontal text histogram.\n *\n * Each row is one bar growing rightward.\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} The rendered text block\n */\nfunction renderHorizontal(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tlet tmpOptions = pView.options;\n\tlet tmpWidth = tmpOptions.TextWidth || 60;\n\tlet tmpBarChar = tmpOptions.BarCharacter;\n\tlet tmpPartials = tmpOptions.BarPartialCharacters;\n\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '(no data)';\n\t}\n\n\tlet tmpMaxValue = 0;\n\tlet tmpMaxLabelLen = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\tif (tmpLabel.length > tmpMaxLabelLen)\n\t\t{\n\t\t\ttmpMaxLabelLen = tmpLabel.length;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\tlet tmpLabelWidth = Math.min(tmpMaxLabelLen, 12);\n\tlet tmpBarWidth = tmpWidth - tmpLabelWidth - 2; // space for \" |\"\n\tif (tmpBarWidth < 10)\n\t{\n\t\ttmpBarWidth = 10;\n\t}\n\n\tlet tmpLines = [];\n\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\tlet tmpBarLen = (tmpVal / tmpMaxValue) * tmpBarWidth;\n\t\tlet tmpFullChars = Math.floor(tmpBarLen);\n\t\tlet tmpFraction = tmpBarLen - tmpFullChars;\n\n\t\tlet tmpBar = '';\n\t\tfor (let j = 0; j < tmpFullChars; j++)\n\t\t{\n\t\t\ttmpBar += tmpBarChar;\n\t\t}\n\t\tif (tmpFraction > 0 && tmpFullChars < tmpBarWidth)\n\t\t{\n\t\t\tlet tmpPartialIndex = Math.round(tmpFraction * (tmpPartials.length - 1));\n\t\t\ttmpBar += tmpPartials[tmpPartialIndex];\n\t\t}\n\n\t\t// Mark selected\n\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\t\tlet tmpMarker = tmpIsSelected ? '*' : (tmpInRange ? '~' : '');\n\n\t\tlet tmpValueStr = tmpOptions.ShowValues ? (' ' + tmpVal) : '';\n\t\tlet tmpLine = padRight(tmpLabel.substring(0, tmpLabelWidth), tmpLabelWidth) + ' |' + tmpBar + tmpValueStr + tmpMarker;\n\t\ttmpLines.push(tmpLine);\n\t}\n\n\t// Range indicator for range selection\n\tif (tmpOptions.Selectable && tmpOptions.SelectionMode === 'range')\n\t{\n\t\ttmpLines.push('');\n\t\ttmpLines.push(padRight('', tmpLabelWidth) + ' Range: [' + pView._selectionRangeStart + ' - ' + pView._selectionRangeEnd + ']');\n\t}\n\n\treturn tmpLines.join('\\n');\n}\n\n/**\n * Render via ContentAssignment for consoleui mode.\n *\n * @param {object} pView - The histogram view instance\n */\nfunction render(pView)\n{\n\tlet tmpText;\n\tif (pView.options.Orientation === 'vertical')\n\t{\n\t\ttmpText = renderVertical(pView);\n\t}\n\telse\n\t{\n\t\ttmpText = renderHorizontal(pView);\n\t}\n\n\tpView.services.ContentAssignment.assignContent(pView.options.TargetElementAddress, tmpText);\n}\n\n// No interactive events for consoleui — input is handled by the blessed widget layer\nfunction wireEvents()\n{\n\t// No-op for consoleui\n}\n\n// --- Utility ---\n\nfunction padLeft(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = ' ' + tmpStr;\n\t}\n\treturn tmpStr;\n}\n\nfunction padRight(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = tmpStr + ' ';\n\t}\n\treturn tmpStr;\n}\n\nfunction padCenter(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = (tmpStr.length % 2 === 0) ? (tmpStr + ' ') : (' ' + tmpStr);\n\t}\n\treturn tmpStr;\n}\n\nmodule.exports = { render, wireEvents, renderVertical, renderHorizontal };\n\n},{}],12:[function(require,module,exports){\nmodule.exports={\n \"name\": \"pict-view\",\n \"version\": \"1.0.67\",\n \"description\": \"Pict View Base Class\",\n \"main\": \"source/Pict-View.js\",\n \"scripts\": {\n \"test\": \"npx quack test\",\n \"tests\": \"npx quack test -g\",\n \"start\": \"node source/Pict-View.js\",\n \"coverage\": \"npx quack coverage\",\n \"build\": \"npx quack build\",\n \"docker-dev-build\": \"docker build ./ -f Dockerfile_LUXURYCode -t pict-view-image:local\",\n \"docker-dev-run\": \"docker run -it -d --name pict-view-dev -p 30001:8080 -p 38086:8086 -v \\\"$PWD/.config:/home/coder/.config\\\" -v \\\"$PWD:/home/coder/pict-view\\\" -u \\\"$(id -u):$(id -g)\\\" -e \\\"DOCKER_USER=$USER\\\" pict-view-image:local\",\n \"docker-dev-shell\": \"docker exec -it pict-view-dev /bin/bash\",\n \"types\": \"tsc -p .\",\n \"lint\": \"eslint source/**\"\n },\n \"types\": \"types/source/Pict-View.d.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/stevenvelozo/pict-view.git\"\n },\n \"author\": \"steven velozo <steven@velozo.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/stevenvelozo/pict-view/issues\"\n },\n \"homepage\": \"https://github.com/stevenvelozo/pict-view#readme\",\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.1\",\n \"browser-env\": \"^3.3.0\",\n \"eslint\": \"^9.39.1\",\n \"pict\": \"^1.0.348\",\n \"quackage\": \"^1.0.58\",\n \"typescript\": \"^5.9.3\"\n },\n \"mocha\": {\n \"diff\": true,\n \"extension\": [\n \"js\"\n ],\n \"package\": \"./package.json\",\n \"reporter\": \"spec\",\n \"slow\": \"75\",\n \"timeout\": \"5000\",\n \"ui\": \"tdd\",\n \"watch-files\": [\n \"source/**/*.js\",\n \"test/**/*.js\"\n ],\n \"watch-ignore\": [\n \"lib/vendor\"\n ]\n },\n \"dependencies\": {\n \"fable\": \"^3.1.63\",\n \"fable-serviceproviderbase\": \"^3.0.19\"\n }\n}\n\n},{}],13:[function(require,module,exports){\n\nconst libFableServiceBase = require('fable-serviceproviderbase');\n\nconst libPackage = require('../package.json');\n\nconst defaultPictViewSettings = (\n\t{\n\t\tDefaultRenderable: false,\n\t\tDefaultDestinationAddress: false,\n\t\tDefaultTemplateRecordAddress: false,\n\n\t\tViewIdentifier: false,\n\n\t\t// If this is set to true, when the App initializes this will.\n\t\t// After the App initializes, initialize will be called as soon as it's added.\n\t\tAutoInitialize: true,\n\t\tAutoInitializeOrdinal: 0,\n\n\t\t// If this is set to true, when the App autorenders (on load) this will.\n\t\t// After the App initializes, render will be called as soon as it's added.\n\t\tAutoRender: true,\n\t\tAutoRenderOrdinal: 0,\n\n\t\tAutoSolveWithApp: true,\n\t\tAutoSolveOrdinal: 0,\n\n\t\tCSSHash: false,\n\t\tCSS: false,\n\t\tCSSProvider: false,\n\t\tCSSPriority: 500,\n\n\t\tTemplates: [],\n\n\t\tDefaultTemplates: [],\n\n\t\tRenderables: [],\n\n\t\tManifests: {}\n\t});\n\n/** @typedef {(error?: Error) => void} ErrorCallback */\n/** @typedef {number | boolean} PictTimestamp */\n\n/**\n * @typedef {'replace' | 'append' | 'prepend' | 'append_once' | 'virtual-assignment'} RenderMethod\n */\n/**\n * @typedef {Object} Renderable\n *\n * @property {string} RenderableHash - A unique hash for the renderable.\n * @property {string} TemplateHash - The hash of the template to use for rendering this renderable.\n * @property {string} [DefaultTemplateRecordAddress] - The default address for resolving the data record for this renderable.\n * @property {string} [ContentDestinationAddress] - The default address (DOM CSS selector) for rendering the content of this renderable.\n * @property {RenderMethod} [RenderMethod=replace] - The method to use when projecting the renderable to the DOM ('replace', 'append', 'prepend', 'append_once', 'virtual-assignment').\n * @property {string} [TestAddress] - The address to use for testing the renderable.\n * @property {string} [TransactionHash] - The transaction hash for the root renderable.\n * @property {string} [RootRenderableViewHash] - The hash of the root renderable.\n * @property {string} [Content] - The rendered content for this renderable, if applicable.\n */\n\n/**\n * Represents a view in the Pict ecosystem.\n */\nclass PictView extends libFableServiceBase\n{\n\t/**\n\t * @param {any} pFable - The Fable object that this service is attached to.\n\t * @param {any} [pOptions] - (optional) The options for this service.\n\t * @param {string} [pServiceHash] - (optional) The hash of the service.\n\t */\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\t// Intersect default options, parent constructor, service information\n\t\tlet tmpOptions = Object.assign({}, JSON.parse(JSON.stringify(defaultPictViewSettings)), pOptions);\n\t\tsuper(pFable, tmpOptions, pServiceHash);\n\t\t//FIXME: add types to fable and ancillaries\n\t\t/** @type {any} */\n\t\tthis.fable;\n\t\t/** @type {any} */\n\t\tthis.options;\n\t\t/** @type {String} */\n\t\tthis.UUID;\n\t\t/** @type {String} */\n\t\tthis.Hash;\n\t\t/** @type {any} */\n\t\tthis.log;\n\n\t\tconst tmpHashIsUUID = this.Hash === this.UUID;\n\t\t//NOTE: since many places are using the view UUID as the HTML element ID, we prefix it to avoid starting with a number\n\t\tthis.UUID = `V-${this.UUID}`;\n\t\tif (tmpHashIsUUID)\n\t\t{\n\t\t\tthis.Hash = this.UUID;\n\t\t}\n\n\t\tif (!this.options.ViewIdentifier)\n\t\t{\n\t\t\tthis.options.ViewIdentifier = `AutoViewID-${this.fable.getUUID()}`;\n\t\t}\n\t\tthis.serviceType = 'PictView';\n\t\t/** @type {Record<string, any>} */\n\t\tthis._Package = libPackage;\n\t\t// Convenience and consistency naming\n\t\t/** @type {import('pict') & { log: any, instantiateServiceProviderWithoutRegistration: (hash: String) => any, instantiateServiceProviderIfNotExists: (hash: string) => any, TransactionTracking: import('pict/types/source/services/Fable-Service-TransactionTracking') }} */\n\t\tthis.pict = this.fable;\n\t\t// Wire in the essential Pict application state\n\t\tthis.AppData = this.pict.AppData;\n\t\tthis.Bundle = this.pict.Bundle;\n\n\t\t/** @type {PictTimestamp} */\n\t\tthis.initializeTimestamp = false;\n\t\t/** @type {PictTimestamp} */\n\t\tthis.lastSolvedTimestamp = false;\n\t\t/** @type {PictTimestamp} */\n\t\tthis.lastRenderedTimestamp = false;\n\t\t/** @type {PictTimestamp} */\n\t\tthis.lastMarshalFromViewTimestamp = false;\n\t\t/** @type {PictTimestamp} */\n\t\tthis.lastMarshalToViewTimestamp = false;\n\n\t\tthis.pict.instantiateServiceProviderIfNotExists('TransactionTracking');\n\n\t\t// Load all templates from the array in the options\n\t\t// Templates are in the form of {Hash:'Some-Template-Hash',Template:'Template content',Source:'TemplateSource'}\n\t\tfor (let i = 0; i < this.options.Templates.length; i++)\n\t\t{\n\t\t\tlet tmpTemplate = this.options.Templates[i];\n\n\t\t\tif (!('Hash' in tmpTemplate) || !('Template' in tmpTemplate))\n\t\t\t{\n\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not load Template ${i} in the options array.`, tmpTemplate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!tmpTemplate.Source)\n\t\t\t\t{\n\t\t\t\t\ttmpTemplate.Source = `PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} options object.`;\n\t\t\t\t}\n\t\t\t\tthis.pict.TemplateProvider.addTemplate(tmpTemplate.Hash, tmpTemplate.Template, tmpTemplate.Source);\n\t\t\t}\n\t\t}\n\n\t\t// Load all default templates from the array in the options\n\t\t// Templates are in the form of {Prefix:'',Postfix:'-List-Row',Template:'Template content',Source:'TemplateSourceString'}\n\t\tfor (let i = 0; i < this.options.DefaultTemplates.length; i++)\n\t\t{\n\t\t\tlet tmpDefaultTemplate = this.options.DefaultTemplates[i];\n\n\t\t\tif (!('Postfix' in tmpDefaultTemplate) || !('Template' in tmpDefaultTemplate))\n\t\t\t{\n\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not load Default Template ${i} in the options array.`, tmpDefaultTemplate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!tmpDefaultTemplate.Source)\n\t\t\t\t{\n\t\t\t\t\ttmpDefaultTemplate.Source = `PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} options object.`;\n\t\t\t\t}\n\t\t\t\tthis.pict.TemplateProvider.addDefaultTemplate(tmpDefaultTemplate.Prefix, tmpDefaultTemplate.Postfix, tmpDefaultTemplate.Template, tmpDefaultTemplate.Source);\n\t\t\t}\n\t\t}\n\n\t\t// Load the CSS if it's available\n\t\tif (this.options.CSS)\n\t\t{\n\t\t\tlet tmpCSSHash = this.options.CSSHash ? this.options.CSSHash : `View-${this.options.ViewIdentifier}`;\n\t\t\tlet tmpCSSProvider = this.options.CSSProvider ? this.options.CSSProvider : tmpCSSHash;\n\t\t\tthis.pict.CSSMap.addCSS(tmpCSSHash, this.options.CSS, tmpCSSProvider, this.options.CSSPriority);\n\t\t}\n\n\t\t// Load all renderables\n\t\t// Renderables are launchable renderable instructions with templates\n\t\t// They look as such: {Identifier:'ContentEntry', TemplateHash:'Content-Entry-Section-Main', ContentDestinationAddress:'#ContentSection', RecordAddress:'AppData.Content.DefaultText', ManifestTransformation:'ManyfestHash', ManifestDestinationAddress:'AppData.Content.DataToTransformContent'}\n\t\t// The only parts that are necessary are Identifier and Template\n\t\t// A developer can then do render('ContentEntry') and it just kinda works. Or they can override the ContentDestinationAddress\n\t\t/** @type {Record<String, Renderable>} */\n\t\tthis.renderables = {};\n\t\tfor (let i = 0; i < this.options.Renderables.length; i++)\n\t\t{\n\t\t\t/** @type {Renderable} */\n\t\t\tlet tmpRenderable = this.options.Renderables[i];\n\t\t\tthis.addRenderable(tmpRenderable);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a renderable to the view.\n\t *\n\t * @param {string | Renderable} pRenderableHash - The hash of the renderable, or a renderable object.\n\t * @param {string} [pTemplateHash] - (optional) The hash of the template for the renderable.\n\t * @param {string} [pDefaultTemplateRecordAddress] - (optional) The default data address for the template.\n\t * @param {string} [pDefaultDestinationAddress] - (optional) The default destination address for the renderable.\n\t * @param {RenderMethod} [pRenderMethod=replace] - (optional) The method to use when rendering the renderable (ex. 'replace').\n\t */\n\taddRenderable(pRenderableHash, pTemplateHash, pDefaultTemplateRecordAddress, pDefaultDestinationAddress, pRenderMethod)\n\t{\n\t\t/** @type {Renderable} */\n\t\tlet tmpRenderable;\n\n\t\tif (typeof(pRenderableHash) == 'object')\n\t\t{\n\t\t\t// The developer passed in the renderable as an object.\n\t\t\t// Use theirs instead!\n\t\t\ttmpRenderable = pRenderableHash;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/** @type {RenderMethod} */\n\t\t\tlet tmpRenderMethod = (typeof(pRenderMethod) !== 'string') ? pRenderMethod : 'replace';\n\t\t\ttmpRenderable = (\n\t\t\t\t{\n\t\t\t\t\tRenderableHash: pRenderableHash,\n\t\t\t\t\tTemplateHash: pTemplateHash,\n\t\t\t\t\tDefaultTemplateRecordAddress: pDefaultTemplateRecordAddress,\n\t\t\t\t\tContentDestinationAddress: pDefaultDestinationAddress,\n\t\t\t\t\tRenderMethod: tmpRenderMethod\n\t\t\t\t});\n\t\t}\n\n\t\tif ((typeof(tmpRenderable.RenderableHash) != 'string') || (typeof(tmpRenderable.TemplateHash) != 'string'))\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not load Renderable; RenderableHash or TemplateHash are invalid.`, tmpRenderable);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t{\n\t\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} adding renderable [${tmpRenderable.RenderableHash}] pointed to template ${tmpRenderable.TemplateHash}.`);\n\t\t\t}\n\n\t\t\tthis.renderables[tmpRenderable.RenderableHash] = tmpRenderable;\n\t\t}\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Initialization */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before the view is initialized.\n\t */\n\tonBeforeInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is initialized (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonBeforeInitializeAsync(fCallback)\n\t{\n\t\tthis.onBeforeInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when the view is initialized.\n\t */\n\tonInitialize()\n\t{\n\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when the view is initialized (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonInitializeAsync(fCallback)\n\t{\n\t\tthis.onInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Performs view initialization.\n\t */\n\tinitialize()\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow VIEW [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initialize:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tthis.onBeforeInitialize();\n\t\t\tthis.onInitialize();\n\t\t\tthis.onAfterInitialize();\n\t\t\tthis.initializeTimestamp = this.pict.log.getTimeStamp();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initialize called but initialization is already completed. Aborting.`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Performs view initialization (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tinitializeAsync(fCallback)\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow VIEW [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initializeAsync:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t{\n\t\t\t\tthis.log.info(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} beginning initialization...`);\n\t\t\t}\n\n\t\t\ttmpAnticipate.anticipate(this.onBeforeInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onAfterInitializeAsync.bind(this));\n\n\t\t\ttmpAnticipate.wait(\n\t\t\t\t/** @param {Error} pError */\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initialization failed: ${pError.message || pError}`, { stack: pError.stack });\n\t\t\t\t\t}\n\t\t\t\t\tthis.initializeTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.info(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initialization complete.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn fCallback();\n\t\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} async initialize called but initialization is already completed. Aborting.`);\n\t\t\t// TODO: Should this be an error?\n\t\t\treturn fCallback();\n\t\t}\n\t}\n\n\tonAfterInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is initialized (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonAfterInitializeAsync(fCallback)\n\t{\n\t\tthis.onAfterInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Render */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before the view is rendered.\n\t *\n\t * @param {Renderable} pRenderable - The renderable that will be rendered.\n\t */\n\tonBeforeRender(pRenderable)\n\t{\n\t\t// Overload this to mess with stuff before the content gets generated from the template\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is rendered (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that will be rendered.\n\t */\n\tonBeforeRenderAsync(fCallback, pRenderable)\n\t{\n\t\tthis.onBeforeRender(pRenderable);\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is projected into the DOM.\n\t *\n\t * @param {Renderable} pRenderable - The renderable that will be projected.\n\t */\n\tonBeforeProject(pRenderable)\n\t{\n\t\t// Overload this to mess with stuff before the content gets generated from the template\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeProject:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is projected into the DOM (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that will be projected.\n\t */\n\tonBeforeProjectAsync(fCallback, pRenderable)\n\t{\n\t\tthis.onBeforeProject(pRenderable);\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Builds the render options for a renderable.\n\t *\n\t * For DRY purposes on the three flavors of render.\n\t *\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object|ErrorCallback} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t */\n\tbuildRenderOptions(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress)\n\t{\n\t\tlet tmpRenderOptions = {Valid: true};\n\t\ttmpRenderOptions.RenderableHash = (typeof (pRenderableHash) === 'string') ? pRenderableHash :\n\t\t\t\t\t\t\t\t(typeof (this.options.DefaultRenderable) == 'string') ?\n\t\t\t\t\t\t\t\tthis.options.DefaultRenderable : false;\n\t\tif (!tmpRenderOptions.RenderableHash)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not find a suitable RenderableHash ${tmpRenderOptions.RenderableHash} (param ${pRenderableHash}because it is not a valid renderable.`);\n\t\t\ttmpRenderOptions.Valid = false;\n\t\t}\n\n\t\ttmpRenderOptions.Renderable = this.renderables[tmpRenderOptions.RenderableHash];\n\t\tif (!tmpRenderOptions.Renderable)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderOptions.RenderableHash} (param ${pRenderableHash}) because it does not exist.`);\n\t\t\ttmpRenderOptions.Valid = false;\n\t\t}\n\n\t\ttmpRenderOptions.DestinationAddress = (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress :\n\t\t\t(typeof (tmpRenderOptions.Renderable.ContentDestinationAddress) === 'string') ? tmpRenderOptions.Renderable.ContentDestinationAddress :\n\t\t\t\t(typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : false;\n\t\tif (!tmpRenderOptions.DestinationAddress)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderOptions.RenderableHash} (param ${pRenderableHash}) because it does not have a valid destination address (param ${pRenderDestinationAddress}).`);\n\t\t\ttmpRenderOptions.Valid = false;\n\t\t}\n\n\t\tif (typeof(pTemplateRecordAddress) === 'object')\n\t\t{\n\t\t\ttmpRenderOptions.RecordAddress = 'Passed in as object';\n\t\t\ttmpRenderOptions.Record = pTemplateRecordAddress;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRenderOptions.RecordAddress = (typeof (pTemplateRecordAddress) === 'string') ? pTemplateRecordAddress :\n\t\t\t\t(typeof (tmpRenderOptions.Renderable.DefaultTemplateRecordAddress) === 'string') ? tmpRenderOptions.Renderable.DefaultTemplateRecordAddress :\n\t\t\t\t(typeof (this.options.DefaultTemplateRecordAddress) === 'string') ? this.options.DefaultTemplateRecordAddress : false;\n\t\t\ttmpRenderOptions.Record = (typeof (tmpRenderOptions.RecordAddress) === 'string') ? this.pict.DataProvider.getDataByAddress(tmpRenderOptions.RecordAddress) : undefined;\n\t\t}\n\n\t\treturn tmpRenderOptions;\n\t}\n\n\t/**\n\t * Assigns the content to the destination address.\n\t *\n\t * For DRY purposes on the three flavors of render.\n\t *\n\t * @param {Renderable} pRenderable - The renderable to render.\n\t * @param {string} pRenderDestinationAddress - The address where the renderable will be rendered.\n\t * @param {string} pContent - The content to render.\n\t * @returns {boolean} - Returns true if the content was assigned successfully.\n\t * @memberof PictView\n\t */\n\tassignRenderContent(pRenderable, pRenderDestinationAddress, pContent)\n\t{\n\t\treturn this.pict.ContentAssignment.projectContent(pRenderable.RenderMethod, pRenderDestinationAddress, pContent, pRenderable.TestAddress);\n\t}\n\n\t/**\n\t * Render a renderable from this view.\n\t *\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object} [pTemplateRecordAddress] - The address where the data for the template is stored.\n\t * @param {Renderable} [pRootRenderable] - The root renderable for the render operation, if applicable.\n\t * @return {boolean}\n\t */\n\trender(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable)\n\t{\n\t\treturn this.renderWithScope(this, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable);\n\t}\n\n\t/**\n\t * Render a renderable from this view, providing a specifici scope for the template.\n\t *\n\t * @param {any} pScope - The scope to use for the template rendering.\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object} [pTemplateRecordAddress] - The address where the data for the template is stored.\n\t * @param {Renderable} [pRootRenderable] - The root renderable for the render operation, if applicable.\n\t * @return {boolean}\n\t */\n\trenderWithScope(pScope, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable)\n\t{\n\t\tlet tmpRenderableHash = (typeof (pRenderableHash) === 'string') ? pRenderableHash :\n\t\t\t(typeof (this.options.DefaultRenderable) == 'string') ? this.options.DefaultRenderable : false;\n\t\tif (!tmpRenderableHash)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it is not a valid renderable.`);\n\t\t\treturn false;\n\t\t}\n\n\t\t/** @type {Renderable} */\n\t\tlet tmpRenderable;\n\t\tif (tmpRenderableHash == '__Virtual')\n\t\t{\n\t\t\ttmpRenderable = {\n\t\t\t\tRenderableHash: '__Virtual',\n\t\t\t\tTemplateHash: this.renderables[this.options.DefaultRenderable].TemplateHash,\n\t\t\t\tContentDestinationAddress: (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress :\n\t\t\t\t\t(typeof (tmpRenderable.ContentDestinationAddress) === 'string') ? tmpRenderable.ContentDestinationAddress :\n\t\t\t\t\t(typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : null,\n\t\t\t\tRenderMethod: 'virtual-assignment',\n\t\t\t\tTransactionHash: pRootRenderable && pRootRenderable.TransactionHash,\n\t\t\t\tRootRenderableViewHash: pRootRenderable && pRootRenderable.RootRenderableViewHash,\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRenderable = Object.assign({}, this.renderables[tmpRenderableHash]);\n\t\t\ttmpRenderable.ContentDestinationAddress = (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress :\n\t\t\t\t(typeof (tmpRenderable.ContentDestinationAddress) === 'string') ? tmpRenderable.ContentDestinationAddress :\n\t\t\t\t(typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : null;\n\t\t}\n\n\t\tif (!tmpRenderable.TransactionHash)\n\t\t{\n\t\t\ttmpRenderable.TransactionHash = `ViewRender-V-${this.options.ViewIdentifier}-R-${tmpRenderableHash}-U-${this.pict.getUUID()}`;\n\t\t\ttmpRenderable.RootRenderableViewHash = this.Hash;\n\t\t\tthis.pict.TransactionTracking.registerTransaction(tmpRenderable.TransactionHash);\n\t\t}\n\n\t\tif (!tmpRenderable)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not exist.`);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!tmpRenderable.ContentDestinationAddress)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not have a valid destination address.`);\n\t\t\treturn false;\n\t\t}\n\n\t\tlet tmpRecordAddress;\n\t\tlet tmpRecord;\n\n\t\tif (typeof(pTemplateRecordAddress) === 'object')\n\t\t{\n\t\t\ttmpRecord = pTemplateRecordAddress;\n\t\t\ttmpRecordAddress = 'Passed in as object';\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRecordAddress = (typeof (pTemplateRecordAddress) === 'string') ? pTemplateRecordAddress :\n\t\t\t\t(typeof (tmpRenderable.DefaultTemplateRecordAddress) === 'string') ? tmpRenderable.DefaultTemplateRecordAddress :\n\t\t\t\t\t(typeof (this.options.DefaultTemplateRecordAddress) === 'string') ? this.options.DefaultTemplateRecordAddress : false;\n\n\t\t\ttmpRecord = (typeof (tmpRecordAddress) === 'string') ? this.pict.DataProvider.getDataByAddress(tmpRecordAddress) : undefined;\n\t\t}\n\n\t\t// Execute the developer-overridable pre-render behavior\n\t\tthis.onBeforeRender(tmpRenderable);\n\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow VIEW [${this.UUID}]::[${this.Hash}] Renderable[${tmpRenderableHash}] Destination[${tmpRenderable.ContentDestinationAddress}] TemplateRecordAddress[${tmpRecordAddress}] render:`);\n\t\t}\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} Beginning Render of Renderable[${tmpRenderableHash}] to Destination [${tmpRenderable.ContentDestinationAddress}]...`);\n\t\t}\n\t\t// Generate the content output from the template and data\n\t\ttmpRenderable.Content = this.pict.parseTemplateByHash(tmpRenderable.TemplateHash, tmpRecord, null, [this], pScope, { RootRenderable: typeof pRootRenderable === 'object' ? pRootRenderable : tmpRenderable });\n\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} Assigning Renderable[${tmpRenderableHash}] content length ${tmpRenderable.Content.length} to Destination [${tmpRenderable.ContentDestinationAddress}] using render method [${tmpRenderable.RenderMethod}].`);\n\t\t}\n\n\t\tthis.onBeforeProject(tmpRenderable);\n\t\tthis.onProject(tmpRenderable);\n\n\t\tif (tmpRenderable.RenderMethod !== 'virtual-assignment')\n\t\t{\n\t\t\tthis.onAfterProject(tmpRenderable);\n\n\t\t\t// Execute the developer-overridable post-render behavior\n\t\t\tthis.onAfterRender(tmpRenderable);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Render a renderable from this view.\n\t *\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object|ErrorCallback} [pTemplateRecordAddress] - The address where the data for the template is stored.\n\t * @param {Renderable|ErrorCallback} [pRootRenderable] - The root renderable for the render operation, if applicable.\n\t * @param {ErrorCallback} [fCallback] - The callback to call when the async operation is complete.\n\t *\n\t * @return {void}\n\t */\n\trenderAsync(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable, fCallback)\n\t{\n\t\treturn this.renderWithScopeAsync(this, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable, fCallback);\n\t}\n\n\t/**\n\t * Render a renderable from this view.\n\t *\n\t * @param {any} pScope - The scope to use for the template rendering.\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object|ErrorCallback} [pTemplateRecordAddress] - The address where the data for the template is stored.\n\t * @param {Renderable|ErrorCallback} [pRootRenderable] - The root renderable for the render operation, if applicable.\n\t * @param {ErrorCallback} [fCallback] - The callback to call when the async operation is complete.\n\t *\n\t * @return {void}\n\t */\n\trenderWithScopeAsync(pScope, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable, fCallback)\n\t{\n\t\tlet tmpRenderableHash = (typeof (pRenderableHash) === 'string') ? pRenderableHash :\n\t\t\t(typeof (this.options.DefaultRenderable) == 'string') ? this.options.DefaultRenderable : false;\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback :\n\t\t\t\t\t\t\t(typeof(pTemplateRecordAddress) === 'function') ? pTemplateRecordAddress :\n\t\t\t\t\t\t\t(typeof(pRenderDestinationAddress) === 'function') ? pRenderDestinationAddress :\n\t\t\t\t\t\t\t(typeof(pRenderableHash) === 'function') ? pRenderableHash :\n\t\t\t\t\t\t\t(typeof(pRootRenderable) === 'function') ? pRootRenderable :\n\t\t\t\t\t\t\tnull;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tif (!tmpRenderableHash)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not asynchronously render ${tmpRenderableHash} (param ${pRenderableHash}because it is not a valid renderable.`);\n\t\t\treturn tmpCallback(new Error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not asynchronously render ${tmpRenderableHash} (param ${pRenderableHash}because it is not a valid renderable.`));\n\t\t}\n\n\t\t/** @type {Renderable} */\n\t\tlet tmpRenderable;\n\t\tif (tmpRenderableHash == '__Virtual')\n\t\t{\n\t\t\ttmpRenderable = {\n\t\t\t\tRenderableHash: '__Virtual',\n\t\t\t\tTemplateHash: this.renderables[this.options.DefaultRenderable].TemplateHash,\n\t\t\t\tContentDestinationAddress: (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress : (typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : null,\n\t\t\t\tRenderMethod: 'virtual-assignment',\n\t\t\t\tTransactionHash: pRootRenderable && typeof pRootRenderable !== 'function' && pRootRenderable.TransactionHash,\n\t\t\t\tRootRenderableViewHash: pRootRenderable && typeof pRootRenderable !== 'function' && pRootRenderable.RootRenderableViewHash,\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRenderable = Object.assign({}, this.renderables[tmpRenderableHash]);\n\t\t\ttmpRenderable.ContentDestinationAddress = (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress :\n\t\t\t\t(typeof (tmpRenderable.ContentDestinationAddress) === 'string') ? tmpRenderable.ContentDestinationAddress :\n\t\t\t\t(typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : null;\n\t\t}\n\n\t\tif (!tmpRenderable.TransactionHash)\n\t\t{\n\t\t\ttmpRenderable.TransactionHash = `ViewRender-V-${this.options.ViewIdentifier}-R-${tmpRenderableHash}-U-${this.pict.getUUID()}`;\n\t\t\ttmpRenderable.RootRenderableViewHash = this.Hash;\n\t\t\tthis.pict.TransactionTracking.registerTransaction(tmpRenderable.TransactionHash);\n\t\t}\n\n\t\tif (!tmpRenderable)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not exist.`);\n\t\t\treturn tmpCallback(new Error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not exist.`));\n\t\t}\n\n\t\tif (!tmpRenderable.ContentDestinationAddress)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not have a valid destination address.`);\n\t\t\treturn tmpCallback(new Error(`Could not render ${tmpRenderableHash}`));\n\t\t}\n\n\t\tlet tmpRecordAddress;\n\t\tlet tmpRecord;\n\n\t\tif (typeof(pTemplateRecordAddress) === 'object')\n\t\t{\n\t\t\ttmpRecord = pTemplateRecordAddress;\n\t\t\ttmpRecordAddress = 'Passed in as object';\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRecordAddress = (typeof (pTemplateRecordAddress) === 'string') ? pTemplateRecordAddress :\n\t\t\t\t(typeof (tmpRenderable.DefaultTemplateRecordAddress) === 'string') ? tmpRenderable.DefaultTemplateRecordAddress :\n\t\t\t\t\t(typeof (this.options.DefaultTemplateRecordAddress) === 'string') ? this.options.DefaultTemplateRecordAddress : false;\n\n\t\t\ttmpRecord = (typeof (tmpRecordAddress) === 'string') ? this.pict.DataProvider.getDataByAddress(tmpRecordAddress) : undefined;\n\t\t}\n\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow VIEW [${this.UUID}]::[${this.Hash}] Renderable[${tmpRenderableHash}] Destination[${tmpRenderable.ContentDestinationAddress}] TemplateRecordAddress[${tmpRecordAddress}] renderAsync:`);\n\t\t}\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} Beginning Asynchronous Render (callback-style)...`);\n\t\t}\n\n\t\tlet tmpAnticipate = this.fable.newAnticipate();\n\n\t\ttmpAnticipate.anticipate(\n\t\t\t(fOnBeforeRenderCallback) =>\n\t\t\t{\n\t\t\t\tthis.onBeforeRenderAsync(fOnBeforeRenderCallback, tmpRenderable);\n\t\t\t});\n\n\t\ttmpAnticipate.anticipate(\n\t\t\t(fAsyncTemplateCallback) =>\n\t\t\t{\n\t\t\t\t// Render the template (asynchronously)\n\t\t\t\tthis.pict.parseTemplateByHash(tmpRenderable.TemplateHash, tmpRecord,\n\t\t\t\t\t(pError, pContent) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pError)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render (asynchronously) ${tmpRenderableHash} (param ${pRenderableHash}) because it did not parse the template.`, pError);\n\t\t\t\t\t\t\treturn fAsyncTemplateCallback(pError);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttmpRenderable.Content = pContent;\n\n\t\t\t\t\t\treturn fAsyncTemplateCallback();\n\t\t\t\t\t}, [this], pScope, { RootRenderable: typeof pRootRenderable === 'object' ? pRootRenderable : tmpRenderable });\n\t\t\t});\n\n\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t{\n\t\t\tthis.onBeforeProjectAsync(fNext, tmpRenderable);\n\t\t});\n\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t{\n\t\t\tthis.onProjectAsync(fNext, tmpRenderable);\n\t\t});\n\n\t\tif (tmpRenderable.RenderMethod !== 'virtual-assignment')\n\t\t{\n\t\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t\t{\n\t\t\t\tthis.onAfterProjectAsync(fNext, tmpRenderable);\n\t\t\t});\n\n\t\t\t// Execute the developer-overridable post-render behavior\n\t\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t\t{\n\t\t\t\tthis.onAfterRenderAsync(fNext, tmpRenderable);\n\t\t\t});\n\t\t}\n\n\t\ttmpAnticipate.wait(tmpCallback);\n\t}\n\n\t/**\n\t * Renders the default renderable.\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\trenderDefaultAsync(fCallback)\n\t{\n\t\t// Render the default renderable\n\t\tthis.renderAsync(fCallback);\n\t}\n\n\t/**\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t */\n\tbasicRender(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress)\n\t{\n\t\treturn this.basicRenderWithScope(this, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress);\n\t}\n\n\t/**\n\t * @param {any} pScope - The scope to use for the template rendering.\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t */\n\tbasicRenderWithScope(pScope, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress)\n\t{\n\t\tlet tmpRenderOptions = this.buildRenderOptions(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress);\n\t\tif (tmpRenderOptions.Valid)\n\t\t{\n\t\t\tthis.assignRenderContent(tmpRenderOptions.Renderable, tmpRenderOptions.DestinationAddress, this.pict.parseTemplateByHash(tmpRenderOptions.Renderable.TemplateHash, tmpRenderOptions.Record, null, [this], pScope, { RootRenderable: tmpRenderOptions.Renderable }));\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not perform a basic render of ${tmpRenderOptions.RenderableHash} because it is not valid.`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|Object|ErrorCallback} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t * @param {ErrorCallback} [fCallback] - The callback to call when the async operation is complete.\n\t */\n\tbasicRenderAsync(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, fCallback)\n\t{\n\t\treturn this.basicRenderWithScopeAsync(this, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, fCallback);\n\t}\n\n\t/**\n\t * @param {any} pScope - The scope to use for the template rendering.\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|Object|ErrorCallback} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t * @param {ErrorCallback} [fCallback] - The callback to call when the async operation is complete.\n\t */\n\tbasicRenderWithScopeAsync(pScope, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, fCallback)\n\t{\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback :\n\t\t\t\t\t\t\t(typeof(pTemplateRecordAddress) === 'function') ? pTemplateRecordAddress :\n\t\t\t\t\t\t\t(typeof(pRenderDestinationAddress) === 'function') ? pRenderDestinationAddress :\n\t\t\t\t\t\t\t(typeof(pRenderableHash) === 'function') ? pRenderableHash :\n\t\t\t\t\t\t\tnull;\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} basicRenderAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} basicRenderAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tconst tmpRenderOptions = this.buildRenderOptions(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress);\n\t\tif (tmpRenderOptions.Valid)\n\t\t{\n\t\t\tthis.pict.parseTemplateByHash(tmpRenderOptions.Renderable.TemplateHash, tmpRenderOptions.Record,\n\t\t\t\t/**\n\t\t\t\t * @param {Error} [pError] - The error that occurred during template parsing.\n\t\t\t\t * @param {string} [pContent] - The content that was rendered from the template.\n\t\t\t\t */\n\t\t\t\t(pError, pContent) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render (asynchronously) ${tmpRenderOptions.RenderableHash} because it did not parse the template.`, pError);\n\t\t\t\t\t\treturn tmpCallback(pError);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.assignRenderContent(tmpRenderOptions.Renderable, tmpRenderOptions.DestinationAddress, pContent);\n\t\t\t\t\treturn tmpCallback();\n\t\t\t\t}, [this], pScope, { RootRenderable: tmpRenderOptions.Renderable });\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet tmpErrorMessage = `PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not perform a basic render of ${tmpRenderOptions.RenderableHash} because it is not valid.`;\n\t\t\tthis.log.error(tmpErrorMessage);\n\t\t\treturn tmpCallback(new Error(tmpErrorMessage));\n\t\t}\n\t}\n\n\t/**\n\t * @param {Renderable} pRenderable - The renderable that was rendered.\n\t */\n\tonProject(pRenderable)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onProject:`);\n\t\t}\n\t\tif (pRenderable.RenderMethod === 'virtual-assignment')\n\t\t{\n\t\t\tthis.pict.TransactionTracking.pushToTransactionQueue(pRenderable.TransactionHash, { ViewHash: this.Hash, Renderable: pRenderable }, 'Deferred-Post-Content-Assignment');\n\t\t}\n\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} Assigning Renderable[${pRenderable.RenderableHash}] content length ${pRenderable.Content.length} to Destination [${pRenderable.ContentDestinationAddress}] using Async render method ${pRenderable.RenderMethod}.`);\n\t\t}\n\n\t\t// Assign the content to the destination address\n\t\tthis.pict.ContentAssignment.projectContent(pRenderable.RenderMethod, pRenderable.ContentDestinationAddress, pRenderable.Content, pRenderable.TestAddress);\n\n\t\tthis.lastRenderedTimestamp = this.pict.log.getTimeStamp();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is projected into the DOM (async flow).\n\t *\n\t * @param {(error?: Error, content?: string) => void} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that is being projected.\n\t */\n\tonProjectAsync(fCallback, pRenderable)\n\t{\n\t\tthis.onProject(pRenderable);\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is rendered.\n\t *\n\t * @param {Renderable} pRenderable - The renderable that was rendered.\n\t */\n\tonAfterRender(pRenderable)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterRender:`);\n\t\t}\n\t\tif (pRenderable && pRenderable.RootRenderableViewHash === this.Hash)\n\t\t{\n\t\t\tconst tmpTransactionQueue = this.pict.TransactionTracking.clearTransactionQueue(pRenderable.TransactionHash) || [];\n\t\t\tfor (const tmpEvent of tmpTransactionQueue)\n\t\t\t{\n\t\t\t\tconst tmpView = this.pict.views[tmpEvent.Data.ViewHash];\n\t\t\t\tif (!tmpView)\n\t\t\t\t{\n\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterRender: Could not find view for transaction hash ${pRenderable.TransactionHash} and ViewHash ${tmpEvent.Data.ViewHash}.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttmpView.onAfterProject();\n\n\t\t\t\t// Execute the developer-overridable post-render behavior\n\t\t\t\ttmpView.onAfterRender(tmpEvent.Data.Renderable);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is rendered (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that was rendered.\n\t */\n\tonAfterRenderAsync(fCallback, pRenderable)\n\t{\n\t\tthis.onAfterRender(pRenderable);\n\t\tconst tmpAnticipate = this.fable.newAnticipate();\n\t\tif (pRenderable && pRenderable.RootRenderableViewHash === this.Hash)\n\t\t{\n\t\t\tconst queue = this.pict.TransactionTracking.clearTransactionQueue(pRenderable.TransactionHash) || [];\n\t\t\tfor (const event of queue)\n\t\t\t{\n\t\t\t\t/** @type {PictView} */\n\t\t\t\tconst tmpView = this.pict.views[event.Data.ViewHash];\n\t\t\t\tif (!tmpView)\n\t\t\t\t{\n\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterRenderAsync: Could not find view for transaction hash ${pRenderable.TransactionHash} and ViewHash ${event.Data.ViewHash}.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttmpAnticipate.anticipate(tmpView.onAfterProjectAsync.bind(tmpView));\n\t\t\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t\t\t{\n\t\t\t\t\ttmpView.onAfterRenderAsync(fNext, event.Data.Renderable);\n\t\t\t\t});\n\n\t\t\t\t// Execute the developer-overridable post-render behavior\n\t\t\t}\n\t\t}\n\t\treturn tmpAnticipate.wait(fCallback);\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is projected into the DOM.\n\t *\n\t * @param {Renderable} pRenderable - The renderable that was projected.\n\t */\n\tonAfterProject(pRenderable)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterProject:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is projected into the DOM (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that was projected.\n\t */\n\tonAfterProjectAsync(fCallback, pRenderable)\n\t{\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Solver */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before the view is solved.\n\t */\n\tonBeforeSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is solved (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonBeforeSolveAsync(fCallback)\n\t{\n\t\tthis.onBeforeSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when the view is solved.\n\t */\n\tonSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when the view is solved (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonSolveAsync(fCallback)\n\t{\n\t\tthis.onSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Performs view solving and triggers lifecycle hooks.\n\t *\n\t * @return {boolean} - True if the view was solved successfully, false otherwise.\n\t */\n\tsolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} executing solve() function...`);\n\t\t}\n\t\tthis.onBeforeSolve();\n\t\tthis.onSolve();\n\t\tthis.onAfterSolve();\n\t\tthis.lastSolvedTimestamp = this.pict.log.getTimeStamp();\n\t\treturn true;\n\t}\n\n\t/**\n\t * Performs view solving and triggers lifecycle hooks (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tsolveAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : null;\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeSolveAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onSolveAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterSolveAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} solveAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastSolvedTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is solved.\n\t */\n\tonAfterSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is solved (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonAfterSolveAsync(fCallback)\n\t{\n\t\tthis.onAfterSolve();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Marshal From View */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before data is marshaled from the view.\n\t *\n\t * @return {boolean} - True if the operation was successful, false otherwise.\n\t */\n\tonBeforeMarshalFromView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeMarshalFromView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before data is marshaled from the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonBeforeMarshalFromViewAsync(fCallback)\n\t{\n\t\tthis.onBeforeMarshalFromView();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when data is marshaled from the view.\n\t */\n\tonMarshalFromView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onMarshalFromView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when data is marshaled from the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonMarshalFromViewAsync(fCallback)\n\t{\n\n\t\tthis.onMarshalFromView();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Marshals data from the view.\n\t *\n\t * @return {boolean} - True if the operation was successful, false otherwise.\n\t */\n\tmarshalFromView()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} executing solve() function...`);\n\t\t}\n\t\tthis.onBeforeMarshalFromView();\n\t\tthis.onMarshalFromView();\n\t\tthis.onAfterMarshalFromView();\n\t\tthis.lastMarshalFromViewTimestamp = this.pict.log.getTimeStamp();\n\t\treturn true;\n\t}\n\n\t/**\n\t * Marshals data from the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tmarshalFromViewAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : null;\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeMarshalFromViewAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onMarshalFromViewAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterMarshalFromViewAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} marshalFromViewAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastMarshalFromViewTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after data is marshaled from the view.\n\t */\n\tonAfterMarshalFromView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterMarshalFromView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after data is marshaled from the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonAfterMarshalFromViewAsync(fCallback)\n\t{\n\t\tthis.onAfterMarshalFromView();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Marshal To View */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before data is marshaled into the view.\n\t */\n\tonBeforeMarshalToView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeMarshalToView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before data is marshaled into the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonBeforeMarshalToViewAsync(fCallback)\n\t{\n\t\tthis.onBeforeMarshalToView();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when data is marshaled into the view.\n\t */\n\tonMarshalToView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onMarshalToView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when data is marshaled into the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonMarshalToViewAsync(fCallback)\n\t{\n\t\tthis.onMarshalToView();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Marshals data into the view.\n\t *\n\t * @return {boolean} - True if the operation was successful, false otherwise.\n\t */\n\tmarshalToView()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} executing solve() function...`);\n\t\t}\n\t\tthis.onBeforeMarshalToView();\n\t\tthis.onMarshalToView();\n\t\tthis.onAfterMarshalToView();\n\t\tthis.lastMarshalToViewTimestamp = this.pict.log.getTimeStamp();\n\t\treturn true;\n\t}\n\n\t/**\n\t * Marshals data into the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tmarshalToViewAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : null;\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\t\ttmpAnticipate.anticipate(this.onBeforeMarshalToViewAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onMarshalToViewAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterMarshalToViewAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} marshalToViewAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastMarshalToViewTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after data is marshaled into the view.\n\t */\n\tonAfterMarshalToView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterMarshalToView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after data is marshaled into the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonAfterMarshalToViewAsync(fCallback)\n\t{\n\t\tthis.onAfterMarshalToView();\n\t\treturn fCallback();\n\t}\n\n\t/** @return {boolean} - True if the object is a PictView. */\n\tget isPictView()\n\t{\n\t\treturn true;\n\t}\n}\n\nmodule.exports = PictView;\n\n},{\"../package.json\":12,\"fable-serviceproviderbase\":2}],14:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],15:[function(require,module,exports){\nmodule.exports={\n\t\"Name\": \"Retold Comprehension Loader\",\n\t\"Hash\": \"ComprehensionLoader\",\n\t\"MainViewportViewIdentifier\": \"ComprehensionLoader-Layout\",\n\t\"MainViewportDestinationAddress\": \"#ComprehensionLoader-Application-Container\",\n\t\"MainViewportDefaultDataAddress\": \"AppData.ComprehensionLoader\",\n\t\"pict_configuration\": { \"Product\": \"ComprehensionLoader\" },\n\t\"AutoRenderMainViewportViewAfterInitialize\": false\n}\n\n},{}],16:[function(require,module,exports){\nconst libPictApplication = require('pict-application');\n\nconst libProvider = require('./providers/Pict-Provider-ComprehensionLoader.js');\n\nconst libViewLayout = require('./views/PictView-ComprehensionLoader-Layout.js');\nconst libViewSession = require('./views/PictView-ComprehensionLoader-Session.js');\nconst libViewSchema = require('./views/PictView-ComprehensionLoader-Schema.js');\nconst libViewSource = require('./views/PictView-ComprehensionLoader-Source.js');\nconst libViewLoad = require('./views/PictView-ComprehensionLoader-Load.js');\nconst libViewHistogram = require('pict-section-histogram');\n\nclass ComprehensionLoaderApplication extends libPictApplication\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\n\t\t// Register provider\n\t\tthis.pict.addProvider('ComprehensionLoader', libProvider.default_configuration, libProvider);\n\n\t\t// Register views\n\t\tthis.pict.addView('ComprehensionLoader-Layout', libViewLayout.default_configuration, libViewLayout);\n\t\tthis.pict.addView('ComprehensionLoader-Session', libViewSession.default_configuration, libViewSession);\n\t\tthis.pict.addView('ComprehensionLoader-Schema', libViewSchema.default_configuration, libViewSchema);\n\t\tthis.pict.addView('ComprehensionLoader-Source', libViewSource.default_configuration, libViewSource);\n\t\tthis.pict.addView('ComprehensionLoader-Load', libViewLoad.default_configuration, libViewLoad);\n\t\tthis.pict.addView('ComprehensionLoader-StatusHistogram',\n\t\t\t{\n\t\t\t\tViewIdentifier: 'ComprehensionLoader-StatusHistogram',\n\t\t\t\tTargetElementAddress: '#ComprehensionLoader-Throughput-Histogram',\n\t\t\t\tDefaultDestinationAddress: '#ComprehensionLoader-Throughput-Histogram',\n\t\t\t\tRenderOnLoad: false,\n\t\t\t\tSelectable: false,\n\t\t\t\tOrientation: 'vertical',\n\t\t\t\tFillContainer: true,\n\t\t\t\tShowValues: false,\n\t\t\t\tShowLabels: true,\n\t\t\t\tMaxBarSize: 80,\n\t\t\t\tBarColor: '#4a90d9',\n\t\t\t\tBins: []\n\t\t\t}, libViewHistogram);\n\t}\n\n\tonAfterInitializeAsync(fCallback)\n\t{\n\t\t// Centralized state\n\t\tthis.pict.AppData.ComprehensionLoader =\n\t\t{\n\t\t\tFetchedEntities: [],\n\t\t\tLastReport: null,\n\t\t\tServerBusyAtLoad: false,\n\t\t\tLoadPollTimer: null,\n\t\t\tLiveStatusTimer: null,\n\t\t\tStatusDetailExpanded: false,\n\t\t\tStatusDetailTimer: null,\n\t\t\tStatusDetailData: null,\n\t\t\tLastLiveStatus: null,\n\t\t\tPersistFields: [\n\t\t\t\t'serverURL', 'authMethod', 'authURI', 'checkURI',\n\t\t\t\t'cookieName', 'cookieValueAddr', 'cookieValueTemplate', 'loginMarker',\n\t\t\t\t'userName', 'password', 'schemaURL',\n\t\t\t\t'comprehensionSourceMode', 'comprehensionURL'\n\t\t\t]\n\t\t};\n\n\t\t// Make pict available for inline onclick handlers\n\t\twindow.pict = this.pict;\n\n\t\t// Render layout (which chains child view renders via onAfterRender)\n\t\tthis.pict.views['ComprehensionLoader-Layout'].render();\n\n\t\t// Post-render initialization\n\t\tthis.pict.providers.ComprehensionLoader.initPersistence();\n\t\tthis.pict.providers.ComprehensionLoader.startLiveStatusPolling();\n\t\tthis.pict.providers.ComprehensionLoader.initAccordionPreviews();\n\t\tthis.pict.providers.ComprehensionLoader.updateAllPreviews();\n\t\tthis.pict.views['ComprehensionLoader-Layout'].collapseAllSections();\n\t\tthis.pict.providers.ComprehensionLoader.initAutoProcess();\n\n\t\treturn fCallback();\n\t}\n}\n\nmodule.exports = ComprehensionLoaderApplication;\n\nmodule.exports.default_configuration = require('./Pict-Application-ComprehensionLoader-Configuration.json');\n\n},{\"./Pict-Application-ComprehensionLoader-Configuration.json\":15,\"./providers/Pict-Provider-ComprehensionLoader.js\":18,\"./views/PictView-ComprehensionLoader-Layout.js\":19,\"./views/PictView-ComprehensionLoader-Load.js\":20,\"./views/PictView-ComprehensionLoader-Schema.js\":21,\"./views/PictView-ComprehensionLoader-Session.js\":22,\"./views/PictView-ComprehensionLoader-Source.js\":23,\"pict-application\":4,\"pict-section-histogram\":8}],17:[function(require,module,exports){\nmodule.exports = { ComprehensionLoaderApplication: require('./Pict-Application-ComprehensionLoader.js') };\n\nif (typeof(window) !== 'undefined')\n{\n\twindow.ComprehensionLoaderApplication = module.exports.ComprehensionLoaderApplication;\n}\n\n},{\"./Pict-Application-ComprehensionLoader.js\":16}],18:[function(require,module,exports){\nconst libPictProvider = require('pict-provider');\n\nclass ComprehensionLoaderProvider extends libPictProvider\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\t// ================================================================\n\t// API Helper\n\t// ================================================================\n\n\tapi(pMethod, pPath, pBody)\n\t{\n\t\tlet tmpOpts = { method: pMethod, headers: {} };\n\t\tif (pBody)\n\t\t{\n\t\t\ttmpOpts.headers['Content-Type'] = 'application/json';\n\t\t\ttmpOpts.body = JSON.stringify(pBody);\n\t\t}\n\t\treturn fetch(pPath, tmpOpts).then(function(pResponse) { return pResponse.json(); });\n\t}\n\n\tsetStatus(pElementId, pMessage, pType)\n\t{\n\t\tlet tmpEl = document.getElementById(pElementId);\n\t\tif (!tmpEl) return;\n\t\ttmpEl.className = 'status ' + (pType || 'info');\n\t\ttmpEl.textContent = pMessage;\n\t\ttmpEl.style.display = 'block';\n\t}\n\n\tescapeHtml(pStr)\n\t{\n\t\tlet tmpDiv = document.createElement('div');\n\t\ttmpDiv.appendChild(document.createTextNode(pStr));\n\t\treturn tmpDiv.innerHTML;\n\t}\n\n\t// ================================================================\n\t// Phase status indicators\n\t// ================================================================\n\n\tsetSectionPhase(pSection, pState)\n\t{\n\t\tlet tmpEl = document.getElementById('phase' + pSection);\n\t\tif (!tmpEl) return;\n\n\t\ttmpEl.className = 'accordion-phase';\n\n\t\tif (pState === 'ok')\n\t\t{\n\t\t\ttmpEl.innerHTML = '&#10003;';\n\t\t\ttmpEl.classList.add('visible', 'accordion-phase-ok');\n\t\t}\n\t\telse if (pState === 'error')\n\t\t{\n\t\t\ttmpEl.innerHTML = '&#10007;';\n\t\t\ttmpEl.classList.add('visible', 'accordion-phase-error');\n\t\t}\n\t\telse if (pState === 'busy')\n\t\t{\n\t\t\ttmpEl.innerHTML = '<span class=\"phase-spinner\"></span>';\n\t\t\ttmpEl.classList.add('visible', 'accordion-phase-busy');\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpEl.innerHTML = '';\n\t\t}\n\t}\n\n\t// ================================================================\n\t// Accordion Previews\n\t// ================================================================\n\n\tupdateAllPreviews()\n\t{\n\t\t// Section 1 — Remote Session\n\t\tlet tmpServerURL = document.getElementById('serverURL');\n\t\tif (!tmpServerURL) return;\n\t\ttmpServerURL = tmpServerURL.value;\n\t\tlet tmpUserName = document.getElementById('userName').value;\n\t\tif (tmpServerURL)\n\t\t{\n\t\t\tlet tmpPreview1 = tmpServerURL;\n\t\t\tif (tmpUserName) tmpPreview1 += ' as ' + tmpUserName;\n\t\t\tdocument.getElementById('preview1').textContent = tmpPreview1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdocument.getElementById('preview1').textContent = 'Configure remote server URL and credentials';\n\t\t}\n\n\t\t// Section 2 — Remote Schema\n\t\tlet tmpEntities = this.pict.AppData.ComprehensionLoader.FetchedEntities || [];\n\t\tif (tmpEntities.length > 0)\n\t\t{\n\t\t\tdocument.getElementById('preview2').textContent = tmpEntities.length + ' entit' + (tmpEntities.length === 1 ? 'y' : 'ies') + ' discovered';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet tmpSchemaURL = document.getElementById('schemaURL').value;\n\t\t\tif (tmpSchemaURL)\n\t\t\t{\n\t\t\t\tdocument.getElementById('preview2').textContent = 'Schema from ' + tmpSchemaURL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdocument.getElementById('preview2').textContent = 'Fetch entity schema from the remote server';\n\t\t\t}\n\t\t}\n\n\t\t// Section 3 — Comprehension Source\n\t\tlet tmpSourceMode = document.querySelector('input[name=\"comprehensionSourceMode\"]:checked');\n\t\tlet tmpModeName = tmpSourceMode ? tmpSourceMode.value : 'url';\n\t\tif (tmpModeName === 'url')\n\t\t{\n\t\t\tlet tmpURL = document.getElementById('comprehensionURL').value;\n\t\t\tif (tmpURL)\n\t\t\t{\n\t\t\t\tdocument.getElementById('preview3').textContent = 'URL: ' + tmpURL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdocument.getElementById('preview3').textContent = 'Provide a comprehension JSON URL or upload files';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdocument.getElementById('preview3').textContent = 'File upload mode';\n\t\t}\n\n\t\t// Section 4 — Load\n\t\tlet tmpPreview4El = document.getElementById('preview4');\n\t\tif (tmpPreview4El)\n\t\t{\n\t\t\ttmpPreview4El.textContent = 'Push comprehension data to the remote server';\n\t\t}\n\t}\n\n\tinitAccordionPreviews()\n\t{\n\t\tlet tmpSelf = this;\n\n\t\tlet tmpPreviewFields = [\n\t\t\t'serverURL', 'userName',\n\t\t\t'schemaURL',\n\t\t\t'comprehensionURL'\n\t\t];\n\n\t\tlet tmpHandler = function() { tmpSelf.updateAllPreviews(); };\n\n\t\tfor (let i = 0; i < tmpPreviewFields.length; i++)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById(tmpPreviewFields[i]);\n\t\t\tif (tmpEl)\n\t\t\t{\n\t\t\t\ttmpEl.addEventListener('input', tmpHandler);\n\t\t\t\ttmpEl.addEventListener('change', tmpHandler);\n\t\t\t}\n\t\t}\n\n\t\tdocument.querySelectorAll('input[name=\"comprehensionSourceMode\"]').forEach(function(pEl)\n\t\t{\n\t\t\tpEl.addEventListener('change', tmpHandler);\n\t\t});\n\t}\n\n\t// ================================================================\n\t// LocalStorage Persistence\n\t// ================================================================\n\n\tsaveField(pFieldId)\n\t{\n\t\tlet tmpEl = document.getElementById(pFieldId);\n\t\tif (tmpEl)\n\t\t{\n\t\t\tlocalStorage.setItem('comprehensionLoader_' + pFieldId, tmpEl.value);\n\t\t}\n\t}\n\n\trestoreFields()\n\t{\n\t\tlet tmpPersistFields = this.pict.AppData.ComprehensionLoader.PersistFields;\n\t\tfor (let i = 0; i < tmpPersistFields.length; i++)\n\t\t{\n\t\t\tlet tmpId = tmpPersistFields[i];\n\t\t\tlet tmpSaved = localStorage.getItem('comprehensionLoader_' + tmpId);\n\t\t\tif (tmpSaved !== null)\n\t\t\t{\n\t\t\t\tlet tmpEl = document.getElementById(tmpId);\n\t\t\t\tif (tmpEl) tmpEl.value = tmpSaved;\n\t\t\t}\n\t\t}\n\n\t\t// Restore source mode radio\n\t\tlet tmpSourceMode = localStorage.getItem('comprehensionLoader_comprehensionSourceMode');\n\t\tif (tmpSourceMode === 'file')\n\t\t{\n\t\t\tlet tmpFileRadio = document.getElementById('sourceMode_file');\n\t\t\tif (tmpFileRadio) tmpFileRadio.checked = true;\n\t\t}\n\t}\n\n\tinitPersistence()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.restoreFields();\n\n\t\tlet tmpPersistFields = this.pict.AppData.ComprehensionLoader.PersistFields;\n\t\tfor (let i = 0; i < tmpPersistFields.length; i++)\n\t\t{\n\t\t\t(function(pId)\n\t\t\t{\n\t\t\t\tlet tmpEl = document.getElementById(pId);\n\t\t\t\tif (tmpEl)\n\t\t\t\t{\n\t\t\t\t\ttmpEl.addEventListener('input', function() { tmpSelf.saveField(pId); });\n\t\t\t\t\ttmpEl.addEventListener('change', function() { tmpSelf.saveField(pId); });\n\t\t\t\t}\n\t\t\t})(tmpPersistFields[i]);\n\t\t}\n\n\t\t// Persist source mode radio\n\t\tdocument.querySelectorAll('input[name=\"comprehensionSourceMode\"]').forEach(function(pEl)\n\t\t{\n\t\t\tpEl.addEventListener('change', function()\n\t\t\t{\n\t\t\t\tlocalStorage.setItem('comprehensionLoader_comprehensionSourceMode', this.value);\n\t\t\t});\n\t\t});\n\n\t\t// Persist auto-process checkboxes\n\t\tlet tmpAutoIds = ['auto1', 'auto2', 'auto3', 'auto4'];\n\t\tfor (let a = 0; a < tmpAutoIds.length; a++)\n\t\t{\n\t\t\t(function(pId)\n\t\t\t{\n\t\t\t\tlet tmpEl = document.getElementById(pId);\n\t\t\t\tif (tmpEl)\n\t\t\t\t{\n\t\t\t\t\tlet tmpSaved = localStorage.getItem('comprehensionLoader_' + pId);\n\t\t\t\t\tif (tmpSaved !== null) tmpEl.checked = tmpSaved === 'true';\n\t\t\t\t\ttmpEl.addEventListener('change', function()\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalStorage.setItem('comprehensionLoader_' + pId, this.checked);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})(tmpAutoIds[a]);\n\t\t}\n\t}\n\n\t// ================================================================\n\t// Live Status Indicator\n\t// ================================================================\n\n\tstartLiveStatusPolling()\n\t{\n\t\tlet tmpAppData = this.pict.AppData.ComprehensionLoader;\n\t\tif (tmpAppData.LiveStatusTimer) clearInterval(tmpAppData.LiveStatusTimer);\n\t\tthis.pollLiveStatus();\n\t\tlet tmpSelf = this;\n\t\ttmpAppData.LiveStatusTimer = setInterval(function() { tmpSelf.pollLiveStatus(); }, 1500);\n\t}\n\n\tpollLiveStatus()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.api('GET', '/comprehension_load/load/live-status')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.renderLiveStatus(pData);\n\t\t\t})\n\t\t\t.catch(function()\n\t\t\t{\n\t\t\t\ttmpSelf.renderLiveStatus({ Phase: 'disconnected', Message: 'Cannot reach server', TotalPushed: 0, TotalRecords: 0 });\n\t\t\t});\n\t}\n\n\trenderLiveStatus(pData)\n\t{\n\t\t// Cache the live status data for the detail view\n\t\tthis.pict.AppData.ComprehensionLoader.LastLiveStatus = pData;\n\n\t\tlet tmpBar = document.getElementById('liveStatusBar');\n\t\tlet tmpMsg = document.getElementById('liveStatusMessage');\n\t\tlet tmpMeta = document.getElementById('liveStatusMeta');\n\t\tlet tmpProgressFill = document.getElementById('liveStatusProgressFill');\n\t\tif (!tmpBar) return;\n\n\t\t// Update phase class (preserve expanded class if present)\n\t\tlet tmpWasExpanded = tmpBar.classList.contains('expanded');\n\t\ttmpBar.className = 'live-status-bar phase-' + (pData.Phase || 'idle');\n\t\tif (tmpWasExpanded) tmpBar.classList.add('expanded');\n\n\t\t// Update message\n\t\ttmpMsg.textContent = pData.Message || 'Idle';\n\n\t\t// Update meta info\n\t\tlet tmpMetaParts = [];\n\t\tif (pData.Phase === 'loading' || pData.Phase === 'stopping')\n\t\t{\n\t\t\tif (pData.Elapsed)\n\t\t\t{\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\">\\u23F1 ' + pData.Elapsed + '</span>');\n\t\t\t}\n\t\t\tif (pData.ETA)\n\t\t\t{\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\">~' + pData.ETA + ' remaining</span>');\n\t\t\t}\n\t\t\tif (pData.TotalEntities > 0)\n\t\t\t{\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\"><strong>' + pData.Completed + '</strong> / ' + pData.TotalEntities + ' entities</span>');\n\t\t\t}\n\t\t\tif (pData.TotalPushed > 0)\n\t\t\t{\n\t\t\t\tlet tmpPushed = pData.TotalPushed.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\t\t\t\tif (pData.TotalRecords > 0)\n\t\t\t\t{\n\t\t\t\t\tlet tmpTotal = pData.TotalRecords.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\t\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\"><strong>' + tmpPushed + '</strong> / ' + tmpTotal + ' records</span>');\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\"><strong>' + tmpPushed + '</strong> records</span>');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pData.Errors > 0)\n\t\t\t{\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\" style=\"color:#dc3545\"><strong>' + pData.Errors + '</strong> error' + (pData.Errors === 1 ? '' : 's') + '</span>');\n\t\t\t}\n\t\t}\n\t\telse if (pData.Phase === 'complete')\n\t\t{\n\t\t\tif (pData.TotalPushed > 0)\n\t\t\t{\n\t\t\t\tlet tmpPushed = pData.TotalPushed.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\"><strong>' + tmpPushed + '</strong> records pushed</span>');\n\t\t\t}\n\t\t}\n\t\ttmpMeta.innerHTML = tmpMetaParts.join('');\n\n\t\t// Update progress bar\n\t\tlet tmpPct = 0;\n\t\tif (pData.Phase === 'loading' && pData.TotalRecords > 0 && pData.TotalPushed > 0)\n\t\t{\n\t\t\ttmpPct = Math.min((pData.TotalPushed / pData.TotalRecords) * 100, 99.9);\n\t\t}\n\t\telse if (pData.Phase === 'loading' && pData.TotalEntities > 0)\n\t\t{\n\t\t\ttmpPct = (pData.Completed / pData.TotalEntities) * 100;\n\t\t}\n\t\telse if (pData.Phase === 'complete')\n\t\t{\n\t\t\ttmpPct = 100;\n\t\t}\n\t\ttmpProgressFill.style.width = Math.min(100, Math.round(tmpPct)) + '%';\n\n\t\t// Auto-expand the detail view when load starts\n\t\tif ((pData.Phase === 'loading' || pData.Phase === 'stopping') && !this.pict.AppData.ComprehensionLoader.StatusDetailExpanded)\n\t\t{\n\t\t\tlet tmpLayoutView = this.pict.views['ComprehensionLoader-Layout'];\n\t\t\tif (tmpLayoutView && typeof tmpLayoutView.toggleStatusDetail === 'function')\n\t\t\t{\n\t\t\t\ttmpLayoutView.toggleStatusDetail();\n\t\t\t}\n\t\t}\n\n\t\t// If the detail view is expanded, re-render it with fresh data\n\t\tif (this.pict.AppData.ComprehensionLoader.StatusDetailExpanded)\n\t\t{\n\t\t\tthis.renderStatusDetail();\n\t\t}\n\n\t\t// Auto-fetch the load report when we detect a completed load but haven't loaded the report yet\n\t\tif (pData.Phase === 'complete' && !this.pict.AppData.ComprehensionLoader.LastReport)\n\t\t{\n\t\t\tlet tmpSelf = this;\n\t\t\tthis.api('GET', '/comprehension_load/load/report')\n\t\t\t\t.then(function(pReportData)\n\t\t\t\t{\n\t\t\t\t\tif (pReportData && pReportData.ReportVersion)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmpSelf.pict.AppData.ComprehensionLoader.LastReport = pReportData;\n\t\t\t\t\t\tif (tmpSelf.pict.AppData.ComprehensionLoader.StatusDetailExpanded)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.renderStatusDetail();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(function() { /* ignore fetch errors */ });\n\t\t}\n\t}\n\n\t// ================================================================\n\t// Status Detail Expansion\n\t// ================================================================\n\n\tonStatusDetailExpanded()\n\t{\n\t\tlet tmpAppData = this.pict.AppData.ComprehensionLoader;\n\t\ttmpAppData.StatusDetailExpanded = true;\n\n\t\t// Immediate render from whatever data we have\n\t\tthis.renderStatusDetail();\n\n\t\t// Start detail polling (poll /load/status for per-entity data)\n\t\tif (tmpAppData.StatusDetailTimer) clearInterval(tmpAppData.StatusDetailTimer);\n\t\tlet tmpSelf = this;\n\t\ttmpAppData.StatusDetailTimer = setInterval(function() { tmpSelf.pollStatusDetail(); }, 2000);\n\t\tthis.pollStatusDetail();\n\t}\n\n\tonStatusDetailCollapsed()\n\t{\n\t\tlet tmpAppData = this.pict.AppData.ComprehensionLoader;\n\t\ttmpAppData.StatusDetailExpanded = false;\n\n\t\tif (tmpAppData.StatusDetailTimer)\n\t\t{\n\t\t\tclearInterval(tmpAppData.StatusDetailTimer);\n\t\t\ttmpAppData.StatusDetailTimer = null;\n\t\t}\n\t}\n\n\tpollStatusDetail()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.api('GET', '/comprehension_load/load/status')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.AppData.ComprehensionLoader.StatusDetailData = pData;\n\t\t\t\ttmpSelf.renderStatusDetail();\n\t\t\t})\n\t\t\t.catch(function() { /* ignore poll errors */ });\n\t}\n\n\trenderStatusDetail()\n\t{\n\t\tlet tmpContainer = document.getElementById('ComprehensionLoader-StatusDetail-Container');\n\t\tif (!tmpContainer) return;\n\n\t\tlet tmpAppData = this.pict.AppData.ComprehensionLoader;\n\t\tlet tmpLiveStatus = tmpAppData.LastLiveStatus;\n\t\tlet tmpStatusData = tmpAppData.StatusDetailData;\n\t\tlet tmpReport = tmpAppData.LastReport;\n\n\t\t// Determine data source: live during load, report after load\n\t\tlet tmpEntities = {};\n\t\tlet tmpThroughputSamples = [];\n\t\tlet tmpIsLive = false;\n\n\t\tif (tmpLiveStatus && (tmpLiveStatus.Phase === 'loading' || tmpLiveStatus.Phase === 'stopping'))\n\t\t{\n\t\t\ttmpIsLive = true;\n\t\t\tif (tmpStatusData && tmpStatusData.Entities) tmpEntities = tmpStatusData.Entities;\n\t\t\tif (tmpLiveStatus.ThroughputSamples) tmpThroughputSamples = tmpLiveStatus.ThroughputSamples;\n\t\t}\n\t\telse if (tmpReport && tmpReport.ReportVersion)\n\t\t{\n\t\t\t// Build entities object from report\n\t\t\tfor (let i = 0; i < tmpReport.Entities.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpE = tmpReport.Entities[i];\n\t\t\t\ttmpEntities[tmpE.Name] = tmpE;\n\t\t\t}\n\t\t\ttmpThroughputSamples = tmpReport.ThroughputSamples || [];\n\t\t}\n\t\telse if (tmpStatusData && tmpStatusData.Entities)\n\t\t{\n\t\t\ttmpEntities = tmpStatusData.Entities;\n\t\t\tif (tmpLiveStatus && tmpLiveStatus.ThroughputSamples)\n\t\t\t{\n\t\t\t\ttmpThroughputSamples = tmpLiveStatus.ThroughputSamples;\n\t\t\t}\n\t\t}\n\n\t\t// Categorize entities\n\t\tlet tmpRunning = [];\n\t\tlet tmpPending = [];\n\t\tlet tmpCompleted = [];\n\t\tlet tmpErrors = [];\n\t\tlet tmpEntityNames = Object.keys(tmpEntities);\n\n\t\tfor (let i = 0; i < tmpEntityNames.length; i++)\n\t\t{\n\t\t\tlet tmpName = tmpEntityNames[i];\n\t\t\tlet tmpE = tmpEntities[tmpName];\n\t\t\tif (tmpE.Status === 'Pushing')\n\t\t\t{\n\t\t\t\ttmpRunning.push({ Name: tmpName, Data: tmpE });\n\t\t\t}\n\t\t\telse if (tmpE.Status === 'Pending')\n\t\t\t{\n\t\t\t\ttmpPending.push(tmpName);\n\t\t\t}\n\t\t\telse if (tmpE.Status === 'Complete')\n\t\t\t{\n\t\t\t\ttmpCompleted.push({ Name: tmpName, Data: tmpE });\n\t\t\t}\n\t\t\telse if (tmpE.Status === 'Error')\n\t\t\t{\n\t\t\t\ttmpErrors.push({ Name: tmpName, Data: tmpE });\n\t\t\t}\n\t\t}\n\n\t\tlet tmpHtml = '';\n\n\t\t// === Section 1: Running Operations ===\n\t\tif (tmpRunning.length > 0 || tmpPending.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"status-detail-section\">';\n\t\t\ttmpHtml += '<div class=\"status-detail-section-title\">Running</div>';\n\t\t\tfor (let i = 0; i < tmpRunning.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpOp = tmpRunning[i];\n\t\t\t\tlet tmpPct = tmpOp.Data.Total > 0 ? Math.round((tmpOp.Data.Pushed / tmpOp.Data.Total) * 100) : 0;\n\t\t\t\tlet tmpPushedFmt = this.formatNumber(tmpOp.Data.Pushed || 0);\n\t\t\t\tlet tmpTotalFmt = this.formatNumber(tmpOp.Data.Total || 0);\n\t\t\t\ttmpHtml += '<div class=\"running-op-row\">';\n\t\t\t\ttmpHtml += ' <div class=\"running-op-name\">' + this.escapeHtml(tmpOp.Name) + '</div>';\n\t\t\t\ttmpHtml += ' <div class=\"running-op-bar\"><div class=\"running-op-bar-fill\" style=\"width:' + tmpPct + '%\"></div></div>';\n\t\t\t\ttmpHtml += ' <div class=\"running-op-count\">' + tmpPushedFmt + ' / ' + tmpTotalFmt + ' (' + tmpPct + '%)</div>';\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t}\n\t\t\tif (tmpPending.length > 0)\n\t\t\t{\n\t\t\t\ttmpHtml += '<div class=\"running-op-pending\">' + tmpPending.length + ' entit' + (tmpPending.length === 1 ? 'y' : 'ies') + ' waiting</div>';\n\t\t\t}\n\t\t\ttmpHtml += '</div>';\n\t\t}\n\n\t\t// === Section 2: Completed Operations ===\n\t\tif (tmpCompleted.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"status-detail-section\">';\n\t\t\ttmpHtml += '<div class=\"status-detail-section-title\">Completed (' + tmpCompleted.length + ')</div>';\n\t\t\tfor (let i = 0; i < tmpCompleted.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpOp = tmpCompleted[i];\n\t\t\t\tlet tmpPushedFmt = this.formatNumber(tmpOp.Data.Pushed || tmpOp.Data.Total || 0);\n\t\t\t\ttmpHtml += '<div class=\"completed-op-row\">';\n\t\t\t\ttmpHtml += '<div class=\"completed-op-header\">';\n\t\t\t\ttmpHtml += ' <span class=\"completed-op-checkmark\">\\u2713</span>';\n\t\t\t\ttmpHtml += ' <span class=\"completed-op-name\">' + this.escapeHtml(tmpOp.Name) + '</span>';\n\t\t\t\ttmpHtml += ' <span class=\"completed-op-stats\">' + tmpPushedFmt + ' records</span>';\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t}\n\t\t\ttmpHtml += '</div>';\n\t\t}\n\n\t\t// === Section 3: Errors ===\n\t\tif (tmpErrors.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"status-detail-section\">';\n\t\t\ttmpHtml += '<div class=\"status-detail-section-title\">Errors (' + tmpErrors.length + ')</div>';\n\t\t\tfor (let i = 0; i < tmpErrors.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpOp = tmpErrors[i];\n\t\t\t\tlet tmpPushedFmt = this.formatNumber(tmpOp.Data.Pushed || 0);\n\t\t\t\tlet tmpTotalFmt = this.formatNumber(tmpOp.Data.Total || 0);\n\t\t\t\ttmpHtml += '<div class=\"error-op-row\">';\n\t\t\t\ttmpHtml += '<div class=\"error-op-header\">';\n\t\t\t\ttmpHtml += ' <span style=\"color:#dc3545\">\\u2717</span>';\n\t\t\t\ttmpHtml += ' <span class=\"error-op-name\">' + this.escapeHtml(tmpOp.Name) + '</span>';\n\t\t\t\ttmpHtml += ' <span class=\"error-op-status\">' + tmpPushedFmt + ' / ' + tmpTotalFmt + '</span>';\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t\tif (tmpOp.Data.ErrorMessage)\n\t\t\t\t{\n\t\t\t\t\ttmpHtml += '<div class=\"error-op-message\">' + this.escapeHtml(tmpOp.Data.ErrorMessage) + '</div>';\n\t\t\t\t}\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t}\n\t\t\ttmpHtml += '</div>';\n\t\t}\n\n\t\tif (tmpHtml === '')\n\t\t{\n\t\t\tif (tmpIsLive)\n\t\t\t{\n\t\t\t\ttmpHtml = '<div style=\"font-size:0.9em; color:#888; padding:8px 0\">Load in progress, waiting for entity data\\u2026</div>';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmpHtml = '<div style=\"font-size:0.9em; color:#888; padding:8px 0\">No load data available. Run a load to see operation details here.</div>';\n\t\t\t}\n\t\t}\n\n\t\ttmpContainer.innerHTML = tmpHtml;\n\n\t\t// Update the throughput histogram\n\t\tthis.updateThroughputHistogram(tmpThroughputSamples);\n\t}\n\n\tupdateThroughputHistogram(pSamples)\n\t{\n\t\tlet tmpHistContainer = document.getElementById('ComprehensionLoader-Throughput-Histogram');\n\t\tif (!tmpHistContainer) return;\n\n\t\tif (!pSamples || pSamples.length < 2)\n\t\t{\n\t\t\ttmpHistContainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\t// Compute raw deltas per interval\n\t\tlet tmpRawDeltas = [];\n\t\tfor (let i = 1; i < pSamples.length; i++)\n\t\t{\n\t\t\tlet tmpDelta = pSamples[i].pushed - pSamples[i - 1].pushed;\n\t\t\tif (tmpDelta < 0) tmpDelta = 0;\n\t\t\ttmpRawDeltas.push({ delta: tmpDelta, t: pSamples[i].t });\n\t\t}\n\n\t\t// Downsample if too many bars\n\t\tlet tmpContainerWidth = tmpHistContainer.clientWidth || 800;\n\t\tlet tmpMaxBars = Math.max(20, Math.floor(tmpContainerWidth / 6));\n\t\tlet tmpAggregated = tmpRawDeltas;\n\n\t\tif (tmpRawDeltas.length > tmpMaxBars)\n\t\t{\n\t\t\tlet tmpBucketSize = Math.ceil(tmpRawDeltas.length / tmpMaxBars);\n\t\t\ttmpAggregated = [];\n\t\t\tfor (let i = 0; i < tmpRawDeltas.length; i += tmpBucketSize)\n\t\t\t{\n\t\t\t\tlet tmpSum = 0;\n\t\t\t\tlet tmpLastT = 0;\n\t\t\t\tfor (let j = i; j < Math.min(i + tmpBucketSize, tmpRawDeltas.length); j++)\n\t\t\t\t{\n\t\t\t\t\ttmpSum += tmpRawDeltas[j].delta;\n\t\t\t\t\ttmpLastT = tmpRawDeltas[j].t;\n\t\t\t\t}\n\t\t\t\ttmpAggregated.push({ delta: tmpSum, t: tmpLastT });\n\t\t\t}\n\t\t}\n\n\t\t// Check for data\n\t\tlet tmpHasData = false;\n\t\tfor (let i = 0; i < tmpAggregated.length; i++)\n\t\t{\n\t\t\tif (tmpAggregated[i].delta > 0) { tmpHasData = true; break; }\n\t\t}\n\t\tif (!tmpHasData)\n\t\t{\n\t\t\ttmpHistContainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\t// Build bins\n\t\tlet tmpStartT = pSamples[0].t;\n\t\tlet tmpBins = [];\n\t\tfor (let i = 0; i < tmpAggregated.length; i++)\n\t\t{\n\t\t\tlet tmpElapsedSec = Math.round((tmpAggregated[i].t - tmpStartT) / 1000);\n\t\t\ttmpBins.push({\n\t\t\t\tLabel: this.formatElapsed(tmpElapsedSec),\n\t\t\t\tValue: tmpAggregated[i].delta\n\t\t\t});\n\t\t}\n\n\t\t// Update the histogram view\n\t\ttmpHistContainer.style.display = '';\n\t\tlet tmpHistView = this.pict.views['ComprehensionLoader-StatusHistogram'];\n\t\tif (tmpHistView)\n\t\t{\n\t\t\ttmpHistView.setBins(tmpBins);\n\t\t\ttmpHistView.renderHistogram();\n\t\t}\n\t}\n\n\tformatElapsed(pSec)\n\t{\n\t\tif (pSec < 60) return pSec + 's';\n\t\tif (pSec < 3600)\n\t\t{\n\t\t\tlet tmpM = Math.floor(pSec / 60);\n\t\t\tlet tmpS = pSec % 60;\n\t\t\treturn tmpM + ':' + (tmpS < 10 ? '0' : '') + tmpS;\n\t\t}\n\t\tlet tmpH = Math.floor(pSec / 3600);\n\t\tlet tmpM = Math.floor((pSec % 3600) / 60);\n\t\treturn tmpH + 'h' + (tmpM < 10 ? '0' : '') + tmpM;\n\t}\n\n\tformatCompact(pNum)\n\t{\n\t\tif (pNum >= 1000000) return (pNum / 1000000).toFixed(1) + 'M';\n\t\tif (pNum >= 10000) return (pNum / 1000).toFixed(0) + 'K';\n\t\tif (pNum >= 1000) return (pNum / 1000).toFixed(1) + 'K';\n\t\treturn pNum.toString();\n\t}\n\n\tformatNumber(pNum)\n\t{\n\t\treturn pNum.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\t}\n\n\t// ================================================================\n\t// Auto-Process\n\t// ================================================================\n\n\tinitAutoProcess()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.api('GET', '/comprehension_load/load/live-status')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\tif (pData.Phase === 'loading' || pData.Phase === 'stopping')\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.AppData.ComprehensionLoader.ServerBusyAtLoad = true;\n\t\t\t\t\ttmpSelf.setSectionPhase(4, 'busy');\n\t\t\t\t\ttmpSelf.pict.views['ComprehensionLoader-Load'].startPolling();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttmpSelf.runAutoProcessChain();\n\t\t\t})\n\t\t\t.catch(function()\n\t\t\t{\n\t\t\t\t// Server unreachable — don't auto-process\n\t\t\t});\n\t}\n\n\trunAutoProcessChain()\n\t{\n\t\tlet tmpSelf = this;\n\t\tlet tmpDelay = 0;\n\t\tlet tmpStepDelay = 2000;\n\n\t\tif (document.getElementById('auto1') && document.getElementById('auto1').checked)\n\t\t{\n\t\t\tsetTimeout(function() { tmpSelf.pict.views['ComprehensionLoader-Session'].goAction(); }, tmpDelay);\n\t\t\ttmpDelay += tmpStepDelay + 1500;\n\t\t}\n\t\tif (document.getElementById('auto2') && document.getElementById('auto2').checked)\n\t\t{\n\t\t\tsetTimeout(function() { tmpSelf.pict.views['ComprehensionLoader-Schema'].fetchSchema(); }, tmpDelay);\n\t\t\ttmpDelay += tmpStepDelay;\n\t\t}\n\t\tif (document.getElementById('auto3') && document.getElementById('auto3').checked)\n\t\t{\n\t\t\tsetTimeout(function() { tmpSelf.pict.views['ComprehensionLoader-Source'].goAction(); }, tmpDelay);\n\t\t\ttmpDelay += tmpStepDelay;\n\t\t}\n\t\tif (document.getElementById('auto4') && document.getElementById('auto4').checked)\n\t\t{\n\t\t\tsetTimeout(function() { tmpSelf.pict.views['ComprehensionLoader-Load'].startLoad(); }, tmpDelay);\n\t\t}\n\t}\n}\n\nmodule.exports = ComprehensionLoaderProvider;\n\nmodule.exports.default_configuration =\n{\n\tProviderIdentifier: 'ComprehensionLoader',\n\tAutoInitialize: true,\n\tAutoInitializeOrdinal: 0\n};\n\n},{\"pict-provider\":6}],19:[function(require,module,exports){\nconst libPictView = require('pict-view');\n\nclass ComprehensionLoaderLayoutView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tonAfterRender()\n\t{\n\t\t// Render all section views into their containers\n\t\tthis.pict.views['ComprehensionLoader-Session'].render();\n\t\tthis.pict.views['ComprehensionLoader-Schema'].render();\n\t\tthis.pict.views['ComprehensionLoader-Source'].render();\n\t\tthis.pict.views['ComprehensionLoader-Load'].render();\n\n\t\tthis.pict.CSSMap.injectCSS();\n\t}\n\n\ttoggleSection(pSectionId)\n\t{\n\t\tlet tmpCard = document.getElementById(pSectionId);\n\t\tif (!tmpCard) return;\n\t\ttmpCard.classList.toggle('open');\n\t}\n\n\texpandAllSections()\n\t{\n\t\tlet tmpCards = document.querySelectorAll('.accordion-card');\n\t\tfor (let i = 0; i < tmpCards.length; i++)\n\t\t{\n\t\t\ttmpCards[i].classList.add('open');\n\t\t}\n\t}\n\n\tcollapseAllSections()\n\t{\n\t\tlet tmpCards = document.querySelectorAll('.accordion-card');\n\t\tfor (let i = 0; i < tmpCards.length; i++)\n\t\t{\n\t\t\ttmpCards[i].classList.remove('open');\n\t\t}\n\t}\n\n\ttoggleStatusDetail()\n\t{\n\t\tlet tmpDetail = document.getElementById('liveStatusDetail');\n\t\tlet tmpMeta = document.getElementById('liveStatusMeta');\n\t\tlet tmpMessage = document.getElementById('liveStatusMessage');\n\t\tlet tmpToggle = document.getElementById('liveStatusToggle');\n\t\tlet tmpBar = document.getElementById('liveStatusBar');\n\t\tif (!tmpDetail) return;\n\n\t\tlet tmpIsExpanded = tmpDetail.style.display !== 'none';\n\n\t\tif (tmpIsExpanded)\n\t\t{\n\t\t\ttmpDetail.style.display = 'none';\n\t\t\ttmpMeta.style.display = '';\n\t\t\ttmpMessage.style.display = '';\n\t\t\ttmpToggle.innerHTML = '&#9660;';\n\t\t\ttmpBar.classList.remove('expanded');\n\t\t\tthis.pict.providers.ComprehensionLoader.onStatusDetailCollapsed();\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpDetail.style.display = '';\n\t\t\ttmpMeta.style.display = 'none';\n\t\t\ttmpMessage.style.display = 'none';\n\t\t\ttmpToggle.innerHTML = '&#9650;';\n\t\t\ttmpBar.classList.add('expanded');\n\t\t\tthis.pict.providers.ComprehensionLoader.onStatusDetailExpanded();\n\t\t}\n\t}\n}\n\nmodule.exports = ComprehensionLoaderLayoutView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Layout',\n\tDefaultRenderable: 'ComprehensionLoader-Layout',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Application-Container',\n\tCSS: /*css*/`\n* { box-sizing: border-box; margin: 0; padding: 0; }\nbody { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f5f5; color: #333; padding: 20px; }\nh1 { margin-bottom: 20px; color: #1a1a1a; }\nh2 { margin-bottom: 12px; color: #444; font-size: 1.2em; border-bottom: 2px solid #ddd; padding-bottom: 6px; }\n\n.section { background: #fff; border-radius: 8px; padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n\n/* Accordion layout */\n.accordion-row { display: flex; gap: 0; margin-bottom: 16px; align-items: stretch; }\n.accordion-number {\n\tflex: 0 0 48px; display: flex; align-items: flex-start; justify-content: center;\n\tpadding-top: 16px; font-size: 1.6em; font-weight: 700; color: #4a90d9;\n\tuser-select: none;\n}\n.accordion-card {\n\tflex: 1; background: #fff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\toverflow: hidden; min-width: 0;\n}\n.accordion-header {\n\tdisplay: flex; align-items: center; padding: 14px 20px; cursor: pointer;\n\tuser-select: none; gap: 12px; transition: background 0.15s; line-height: 1.4;\n}\n.accordion-header:hover { background: #fafafa; }\n.accordion-title { font-weight: 600; color: #333; font-size: 1.05em; white-space: nowrap; }\n.accordion-preview { flex: 1; font-style: italic; color: #888; font-size: 0.9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.accordion-toggle {\n\tflex: 0 0 20px; display: flex; align-items: center; justify-content: center;\n\tborder-radius: 4px; transition: background 0.15s, transform 0.25s; font-size: 0.7em; color: #888;\n}\n.accordion-header:hover .accordion-toggle { background: #eee; color: #555; }\n.accordion-card.open .accordion-toggle { transform: rotate(180deg); }\n.accordion-body { padding: 0 20px 20px; display: none; }\n.accordion-card.open .accordion-body { display: block; }\n.accordion-card.open .accordion-header { border-bottom: 1px solid #eee; }\n.accordion-card.open .accordion-preview { display: none; }\n\n/* Action controls (go link + auto checkbox) */\n.accordion-actions { display: flex; align-items: baseline; gap: 8px; flex-shrink: 0; }\n.accordion-card.open .accordion-actions { display: none; }\n.accordion-go {\n\tfont-size: 0.82em; color: #4a90d9; cursor: pointer; text-decoration: none;\n\tfont-weight: 500; white-space: nowrap; padding: 2px 6px; border-radius: 3px;\n\ttransition: background 0.15s;\n}\n.accordion-go:hover { background: #e8f0fe; text-decoration: underline; }\n.accordion-auto {\n\tfont-size: 0.82em; color: #999; white-space: nowrap; cursor: pointer;\n}\n.accordion-auto .auto-label { display: none; }\n.accordion-auto:hover .auto-label { display: inline; }\n.accordion-auto input[type=\"checkbox\"] { width: auto; margin: 0; cursor: pointer; vertical-align: middle; position: relative; top: 0px; opacity: 0.75; transition: opacity 0.15s; }\n.accordion-auto:hover input[type=\"checkbox\"] { opacity: 1; }\n.accordion-auto:hover { color: #666; }\n\n/* Phase status indicator */\n.accordion-phase {\n\tflex: 0 0 auto; display: none; align-items: center; justify-content: center;\n\tfont-size: 0.85em; line-height: 1;\n}\n.accordion-phase.visible { display: flex; }\n.accordion-phase-ok { color: #28a745; }\n.accordion-phase-error { color: #dc3545; }\n.accordion-phase-busy { color: #28a745; }\n.accordion-phase-busy .phase-spinner {\n\tdisplay: inline-block; width: 14px; height: 14px;\n\tborder: 2px solid #28a745; border-top-color: transparent; border-radius: 50%;\n\tanimation: phase-spin 0.8s linear infinite; vertical-align: middle;\n}\n@keyframes phase-spin {\n\tto { transform: rotate(360deg); }\n}\n\n.accordion-controls {\n\tdisplay: flex; gap: 8px; margin-bottom: 12px; justify-content: flex-end;\n}\n.accordion-controls button {\n\tpadding: 4px 10px; font-size: 0.82em; font-weight: 500; background: none;\n\tborder: 1px solid #ccc; border-radius: 4px; color: #666; cursor: pointer; margin: 0;\n}\n.accordion-controls button:hover { background: #f0f0f0; border-color: #aaa; color: #333; }\n\nlabel { display: block; font-weight: 600; margin-bottom: 4px; font-size: 0.9em; }\ninput[type=\"text\"], input[type=\"password\"], input[type=\"number\"] {\n\twidth: 100%; padding: 8px 12px; border: 1px solid #ccc; border-radius: 4px;\n\tfont-size: 0.95em; margin-bottom: 10px;\n}\ninput[type=\"text\"]:focus, input[type=\"password\"]:focus, input[type=\"number\"]:focus {\n\toutline: none; border-color: #4a90d9;\n}\n\nbutton {\n\tpadding: 8px 16px; border: none; border-radius: 4px; cursor: pointer;\n\tfont-size: 0.9em; font-weight: 600; margin-right: 8px; margin-bottom: 8px;\n}\nbutton.primary { background: #4a90d9; color: #fff; }\nbutton.primary:hover { background: #357abd; }\nbutton.secondary { background: #6c757d; color: #fff; }\nbutton.secondary:hover { background: #5a6268; }\nbutton.danger { background: #dc3545; color: #fff; }\nbutton.danger:hover { background: #c82333; }\nbutton.success { background: #28a745; color: #fff; }\nbutton.success:hover { background: #218838; }\nbutton:disabled { opacity: 0.5; cursor: not-allowed; }\n\n.status { padding: 8px 12px; border-radius: 4px; margin-top: 10px; font-size: 0.9em; }\n.status.ok { background: #d4edda; color: #155724; }\n.status.error { background: #f8d7da; color: #721c24; }\n.status.info { background: #d1ecf1; color: #0c5460; }\n.status.warn { background: #fff3cd; color: #856404; }\n\n.inline-group { display: flex; gap: 8px; align-items: flex-end; margin-bottom: 10px; }\n.inline-group > div { flex: 1; }\n\na { color: #4a90d9; }\n\nselect { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #ccc; border-radius: 4px; font-size: 0.95em; margin-bottom: 10px; }\n\n.checkbox-row { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }\n.checkbox-row input[type=\"checkbox\"] { width: auto; margin: 0; }\n.checkbox-row label { display: inline; margin: 0; font-weight: normal; cursor: pointer; }\n\n/* Live Status Bar */\n.live-status-bar {\n\tbackground: #fff; border-radius: 8px; margin-bottom: 16px;\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tposition: sticky; top: 0; z-index: 100; border-left: 4px solid #6c757d;\n}\n.live-status-bar.phase-idle { border-left-color: #6c757d; }\n.live-status-bar.phase-disconnected { border-left-color: #dc3545; }\n.live-status-bar.phase-ready { border-left-color: #4a90d9; }\n.live-status-bar.phase-loading { border-left-color: #28a745; }\n.live-status-bar.phase-stopping { border-left-color: #ffc107; }\n.live-status-bar.phase-complete { border-left-color: #28a745; }\n\n.live-status-dot {\n\twidth: 12px; height: 12px; border-radius: 50%; flex-shrink: 0;\n\tbackground: #6c757d;\n}\n.live-status-bar.phase-idle .live-status-dot { background: #6c757d; }\n.live-status-bar.phase-disconnected .live-status-dot { background: #dc3545; }\n.live-status-bar.phase-ready .live-status-dot { background: #4a90d9; }\n.live-status-bar.phase-loading .live-status-dot {\n\tbackground: #28a745;\n\tanimation: live-pulse 1.5s ease-in-out infinite;\n}\n.live-status-bar.phase-stopping .live-status-dot {\n\tbackground: #ffc107;\n\tanimation: live-pulse 0.8s ease-in-out infinite;\n}\n.live-status-bar.phase-complete .live-status-dot { background: #28a745; }\n\n@keyframes live-pulse {\n\t0%, 100% { opacity: 1; transform: scale(1); }\n\t50% { opacity: 0.4; transform: scale(0.8); }\n}\n\n.live-status-message { flex: 1; font-size: 0.92em; color: #333; line-height: 1.4; }\n\n.live-status-meta {\n\tdisplay: flex; gap: 16px; flex-shrink: 0; font-size: 0.82em; color: #666;\n}\n.live-status-meta-item { white-space: nowrap; }\n.live-status-meta-item strong { color: #333; }\n\n.live-status-progress-bar {\n\theight: 3px; background: #e9ecef; border-radius: 2px; overflow: hidden;\n\tposition: absolute; bottom: 0; left: 0; right: 0;\n}\n.live-status-progress-fill {\n\theight: 100%; background: #28a745; transition: width 1s ease;\n}\n/* Expandable status bar */\n.live-status-header {\n\tdisplay: flex; align-items: center; gap: 14px; cursor: pointer;\n\tpadding: 14px 20px; user-select: none;\n}\n.live-status-bar.expanded .live-status-header {\n\tborder-bottom: 1px solid #e9ecef; padding-bottom: 10px;\n}\n.live-status-expand-toggle {\n\tflex: 0 0 20px; display: flex; align-items: center; justify-content: center;\n\tfont-size: 0.7em; color: #888; transition: transform 0.25s;\n}\n.live-status-bar.expanded .live-status-expand-toggle { transform: rotate(180deg); }\n\n.live-status-detail {\n\tpadding: 12px 20px 16px; max-height: 60vh; overflow-y: auto;\n}\n\n/* Status Detail Sections */\n.status-detail-section { margin-bottom: 14px; }\n.status-detail-section:last-child { margin-bottom: 0; }\n.status-detail-section-title {\n\tfont-size: 0.85em; font-weight: 600; color: #555; text-transform: uppercase;\n\tletter-spacing: 0.5px; margin-bottom: 8px; padding-bottom: 4px;\n\tborder-bottom: 1px solid #eee;\n}\n\n/* Running Operations */\n.running-op-row {\n\tdisplay: flex; align-items: center; gap: 12px; padding: 6px 0;\n\tfont-size: 0.9em;\n}\n.running-op-name { font-weight: 600; min-width: 180px; }\n.running-op-bar {\n\tflex: 1; height: 8px; background: #e9ecef; border-radius: 4px; overflow: hidden;\n\tmin-width: 120px;\n}\n.running-op-bar-fill { height: 100%; background: #4a90d9; transition: width 0.5s ease; }\n.running-op-count { font-size: 0.85em; color: #666; white-space: nowrap; }\n.running-op-pending { color: #888; font-size: 0.85em; font-style: italic; padding: 4px 0; }\n\n/* Completed Operations */\n.completed-op-row { padding: 8px 0; border-bottom: 1px solid #f0f0f0; }\n.completed-op-row:last-child { border-bottom: none; }\n.completed-op-header {\n\tdisplay: flex; align-items: center; gap: 10px; font-size: 0.9em; margin-bottom: 4px;\n}\n.completed-op-name { font-weight: 600; }\n.completed-op-stats { color: #666; font-size: 0.85em; }\n.completed-op-checkmark { color: #28a745; }\n\n/* Error Operations */\n.error-op-row { padding: 6px 0; border-bottom: 1px solid #f0f0f0; font-size: 0.9em; }\n.error-op-row:last-child { border-bottom: none; }\n.error-op-header { display: flex; align-items: center; gap: 8px; }\n.error-op-name { font-weight: 600; color: #dc3545; }\n.error-op-status { font-size: 0.82em; color: #dc3545; }\n.error-op-message { font-size: 0.82em; color: #888; margin-top: 2px; padding-left: 18px; }\n`,\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Layout',\n\t\t\tTemplate: /*html*/`\n<h1>Retold Comprehension Loader</h1>\n\n<!-- Live Status Bar (Expandable) -->\n<div id=\"liveStatusBar\" class=\"live-status-bar phase-idle\" style=\"position:relative\">\n\t<div class=\"live-status-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleStatusDetail()\">\n\t\t<div class=\"live-status-dot\"></div>\n\t\t<div class=\"live-status-message\" id=\"liveStatusMessage\">Idle</div>\n\t\t<div class=\"live-status-meta\" id=\"liveStatusMeta\"></div>\n\t\t<div class=\"live-status-expand-toggle\" id=\"liveStatusToggle\">&#9660;</div>\n\t</div>\n\t<div class=\"live-status-detail\" id=\"liveStatusDetail\" style=\"display:none\">\n\t\t<div id=\"ComprehensionLoader-Throughput-Histogram\"></div>\n\t\t<div id=\"ComprehensionLoader-StatusDetail-Container\"></div>\n\t</div>\n\t<div class=\"live-status-progress-bar\"><div class=\"live-status-progress-fill\" id=\"liveStatusProgressFill\" style=\"width:0%\"></div></div>\n</div>\n\n<!-- Expand / Collapse All -->\n<div class=\"accordion-controls\">\n\t<button onclick=\"pict.views['ComprehensionLoader-Layout'].expandAllSections()\">Expand All</button>\n\t<button onclick=\"pict.views['ComprehensionLoader-Layout'].collapseAllSections()\">Collapse All</button>\n</div>\n\n<!-- Section containers -->\n<div id=\"ComprehensionLoader-Section-Session\"></div>\n<div id=\"ComprehensionLoader-Section-Schema\"></div>\n<div id=\"ComprehensionLoader-Section-Source\"></div>\n<div id=\"ComprehensionLoader-Section-Load\"></div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Layout',\n\t\t\tTemplateHash: 'ComprehensionLoader-Layout',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Application-Container'\n\t\t}\n\t]\n};\n\n},{\"pict-view\":13}],20:[function(require,module,exports){\nconst libPictView = require('pict-view');\n\nclass ComprehensionLoaderLoadView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tstartLoad()\n\t{\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(4, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Starting load...', 'info');\n\n\t\t// Clear previous report\n\t\tthis.pict.AppData.ComprehensionLoader.LastReport = null;\n\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/load/start')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\tif (pData.Success)\n\t\t\t\t{\n\t\t\t\t\tlet tmpMsg = 'Load started for ' + pData.Entities.length + ' entities (' + tmpSelf.pict.providers.ComprehensionLoader.formatNumber(pData.TotalRecords) + ' records).';\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', tmpMsg, 'ok');\n\t\t\t\t\ttmpSelf.startPolling();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Load start failed: ' + (pData.Error || 'Unknown error'), 'error');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(4, 'error');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(4, 'error');\n\t\t\t});\n\t}\n\n\tstopLoad()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/load/stop')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Load stop requested.', 'warn');\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t});\n\t}\n\n\tstartPolling()\n\t{\n\t\tif (this.pict.AppData.ComprehensionLoader.LoadPollTimer) clearInterval(this.pict.AppData.ComprehensionLoader.LoadPollTimer);\n\t\tlet tmpSelf = this;\n\t\tthis.pict.AppData.ComprehensionLoader.LoadPollTimer = setInterval(function() { tmpSelf.pollLoadStatus(); }, 2000);\n\t\tthis.pollLoadStatus();\n\t}\n\n\tstopPolling()\n\t{\n\t\tif (this.pict.AppData.ComprehensionLoader.LoadPollTimer)\n\t\t{\n\t\t\tclearInterval(this.pict.AppData.ComprehensionLoader.LoadPollTimer);\n\t\t\tthis.pict.AppData.ComprehensionLoader.LoadPollTimer = null;\n\t\t}\n\t}\n\n\tpollLoadStatus()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('GET', '/comprehension_load/load/status')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.renderLoadProgress(pData);\n\n\t\t\t\tif (!pData.Running)\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.stopPolling();\n\t\t\t\t\tlet tmpEntities = pData.Entities || {};\n\t\t\t\t\tlet tmpNames = Object.keys(tmpEntities);\n\t\t\t\t\tif (tmpNames.length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet tmpHasErrors = false;\n\t\t\t\t\t\tfor (let i = 0; i < tmpNames.length; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (tmpEntities[tmpNames[i]].Status === 'Error') tmpHasErrors = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tmpHasErrors)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Load finished with errors.', 'error');\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(4, 'error');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Load complete.', 'ok');\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(4, 'ok');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Fetch the structured report\n\t\t\t\t\t\ttmpSelf.fetchLoadReport();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\t// Silently ignore poll errors\n\t\t\t});\n\t}\n\n\tfetchLoadReport()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('GET', '/comprehension_load/load/report')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\tif (pData && pData.ReportVersion)\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.AppData.ComprehensionLoader.LastReport = pData;\n\t\t\t\t\ttmpSelf.renderLoadReport(pData);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\t// Ignore report fetch errors\n\t\t\t});\n\t}\n\n\trenderLoadReport(pReport)\n\t{\n\t\tlet tmpSection = document.getElementById('loadReportSection');\n\t\tif (!tmpSection) return;\n\t\ttmpSection.style.display = '';\n\n\t\tlet tmpCardsContainer = document.getElementById('reportSummaryCards');\n\t\tlet tmpOutcomeClass = 'outcome-' + pReport.Outcome.toLowerCase();\n\t\tlet tmpOutcomeColor = { Success: '#28a745', Partial: '#ffc107', Error: '#dc3545', Stopped: '#6c757d' }[pReport.Outcome] || '#666';\n\n\t\tlet tmpDurationSec = pReport.RunTimestamps.DurationSeconds || 0;\n\t\tlet tmpDurationStr = tmpDurationSec < 60 ? tmpDurationSec + 's' : Math.floor(tmpDurationSec / 60) + 'm ' + (tmpDurationSec % 60) + 's';\n\n\t\tlet tmpTotalPushed = this.pict.providers.ComprehensionLoader.formatNumber(pReport.Summary.TotalPushed);\n\t\tlet tmpTotalRecords = this.pict.providers.ComprehensionLoader.formatNumber(pReport.Summary.TotalRecords);\n\n\t\ttmpCardsContainer.innerHTML = ''\n\t\t\t+ '<div class=\"report-card ' + tmpOutcomeClass + '\">'\n\t\t\t+ ' <div class=\"card-label\">Outcome</div>'\n\t\t\t+ ' <div class=\"card-value\" style=\"color:' + tmpOutcomeColor + '\">' + pReport.Outcome + '</div>'\n\t\t\t+ '</div>'\n\t\t\t+ '<div class=\"report-card\">'\n\t\t\t+ ' <div class=\"card-label\">Duration</div>'\n\t\t\t+ ' <div class=\"card-value\">' + tmpDurationStr + '</div>'\n\t\t\t+ '</div>'\n\t\t\t+ '<div class=\"report-card\">'\n\t\t\t+ ' <div class=\"card-label\">Entities</div>'\n\t\t\t+ ' <div class=\"card-value\">' + pReport.Summary.Complete + ' / ' + pReport.Summary.TotalEntities + '</div>'\n\t\t\t+ '</div>'\n\t\t\t+ '<div class=\"report-card\">'\n\t\t\t+ ' <div class=\"card-label\">Records Pushed</div>'\n\t\t\t+ ' <div class=\"card-value\">' + tmpTotalPushed + '</div>'\n\t\t\t+ ' <div style=\"font-size:0.75em; color:#888\">of ' + tmpTotalRecords + '</div>'\n\t\t\t+ '</div>';\n\n\t\t// Anomalies\n\t\tlet tmpAnomalyContainer = document.getElementById('reportAnomalies');\n\t\tif (pReport.Anomalies.length === 0)\n\t\t{\n\t\t\ttmpAnomalyContainer.innerHTML = '<div style=\"color:#28a745; font-weight:600; font-size:0.9em\">No anomalies detected.</div>';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet tmpHtml = '<h4 style=\"margin:0 0 8px; color:#dc3545; font-size:0.95em\">Anomalies (' + pReport.Anomalies.length + ')</h4>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Type</th><th>Message</th></tr>';\n\t\t\tfor (let i = 0; i < pReport.Anomalies.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpAnomaly = pReport.Anomalies[i];\n\t\t\t\tlet tmpTypeColor = tmpAnomaly.Type === 'Error' ? '#dc3545' : '#6c757d';\n\t\t\t\ttmpHtml += '<tr>';\n\t\t\t\ttmpHtml += '<td><strong>' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpAnomaly.Entity) + '</strong></td>';\n\t\t\t\ttmpHtml += '<td style=\"color:' + tmpTypeColor + '\">' + tmpAnomaly.Type + '</td>';\n\t\t\t\ttmpHtml += '<td>' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpAnomaly.Message) + '</td>';\n\t\t\t\ttmpHtml += '</tr>';\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t\ttmpAnomalyContainer.innerHTML = tmpHtml;\n\t\t}\n\n\t\t// Entity details\n\t\tlet tmpEntityContainer = document.getElementById('reportEntityDetails');\n\t\tif (pReport.Entities && pReport.Entities.length > 0)\n\t\t{\n\t\t\tlet tmpHtml = '<h4 style=\"margin:0 0 8px; font-size:0.95em; color:#444\">Entity Details</h4>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Duration</th><th>Records</th><th>Status</th></tr>';\n\t\t\tfor (let i = 0; i < pReport.Entities.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpEntity = pReport.Entities[i];\n\t\t\t\tlet tmpDur = tmpEntity.DurationSeconds < 60 ? tmpEntity.DurationSeconds + 's' : Math.floor(tmpEntity.DurationSeconds / 60) + 'm ' + (tmpEntity.DurationSeconds % 60) + 's';\n\t\t\t\tlet tmpRecs = this.pict.providers.ComprehensionLoader.formatNumber(tmpEntity.Pushed);\n\t\t\t\tlet tmpStatusColor = { Complete: '#28a745', Error: '#dc3545' }[tmpEntity.Status] || '#666';\n\t\t\t\ttmpHtml += '<tr>';\n\t\t\t\ttmpHtml += '<td><strong>' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpEntity.Name) + '</strong></td>';\n\t\t\t\ttmpHtml += '<td>' + tmpDur + '</td>';\n\t\t\t\ttmpHtml += '<td>' + tmpRecs + '</td>';\n\t\t\t\ttmpHtml += '<td style=\"color:' + tmpStatusColor + '\">' + tmpEntity.Status + '</td>';\n\t\t\t\ttmpHtml += '</tr>';\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t\ttmpEntityContainer.innerHTML = tmpHtml;\n\t\t}\n\t}\n\n\tdownloadReport()\n\t{\n\t\tif (!this.pict.AppData.ComprehensionLoader.LastReport)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('reportStatus', 'No report available.', 'warn');\n\t\t\treturn;\n\t\t}\n\t\tlet tmpJson = JSON.stringify(this.pict.AppData.ComprehensionLoader.LastReport, null, '\\t');\n\t\tlet tmpBlob = new Blob([tmpJson], { type: 'application/json' });\n\t\tlet tmpAnchor = document.createElement('a');\n\t\ttmpAnchor.href = URL.createObjectURL(tmpBlob);\n\t\tlet tmpTimestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n\t\ttmpAnchor.download = 'ComprehensionLoader-Report-' + tmpTimestamp + '.json';\n\t\ttmpAnchor.click();\n\t\tURL.revokeObjectURL(tmpAnchor.href);\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('reportStatus', 'Report downloaded.', 'ok');\n\t}\n\n\tcopyReport()\n\t{\n\t\tif (!this.pict.AppData.ComprehensionLoader.LastReport)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('reportStatus', 'No report available.', 'warn');\n\t\t\treturn;\n\t\t}\n\t\tlet tmpJson = JSON.stringify(this.pict.AppData.ComprehensionLoader.LastReport, null, '\\t');\n\t\tlet tmpSelf = this;\n\t\tnavigator.clipboard.writeText(tmpJson).then(function()\n\t\t{\n\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('reportStatus', 'Report copied to clipboard.', 'ok');\n\t\t});\n\t}\n\n\trenderLoadProgress(pData)\n\t{\n\t\tlet tmpContainer = document.getElementById('loadProgress');\n\t\tlet tmpEntities = pData.Entities || {};\n\t\tlet tmpEntityNames = Object.keys(tmpEntities);\n\n\t\tif (tmpEntityNames.length === 0)\n\t\t{\n\t\t\ttmpContainer.innerHTML = '';\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpPushing = [];\n\t\tlet tmpPending = [];\n\t\tlet tmpCompleted = [];\n\t\tlet tmpErrors = [];\n\n\t\tfor (let i = 0; i < tmpEntityNames.length; i++)\n\t\t{\n\t\t\tlet tmpName = tmpEntityNames[i];\n\t\t\tlet tmpEntity = tmpEntities[tmpName];\n\n\t\t\tif (tmpEntity.Status === 'Pushing')\n\t\t\t{\n\t\t\t\ttmpPushing.push({ Name: tmpName, Data: tmpEntity });\n\t\t\t}\n\t\t\telse if (tmpEntity.Status === 'Pending')\n\t\t\t{\n\t\t\t\ttmpPending.push({ Name: tmpName, Data: tmpEntity });\n\t\t\t}\n\t\t\telse if (tmpEntity.Status === 'Complete')\n\t\t\t{\n\t\t\t\ttmpCompleted.push({ Name: tmpName, Data: tmpEntity });\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmpErrors.push({ Name: tmpName, Data: tmpEntity });\n\t\t\t}\n\t\t}\n\n\t\tlet tmpHtml = '';\n\t\tlet tmpSelf = this;\n\n\t\tlet fRenderRow = function(pName, pEntity)\n\t\t{\n\t\t\tlet tmpPct = 0;\n\t\t\tif (pEntity.Total === 0 && pEntity.Status === 'Complete')\n\t\t\t{\n\t\t\t\ttmpPct = 100;\n\t\t\t}\n\t\t\telse if (pEntity.Total > 0)\n\t\t\t{\n\t\t\t\ttmpPct = Math.round((pEntity.Pushed / pEntity.Total) * 100);\n\t\t\t}\n\n\t\t\tlet tmpBarColor = '#28a745';\n\t\t\tif (pEntity.Status === 'Error') tmpBarColor = '#dc3545';\n\t\t\telse if (pEntity.Status === 'Pushing') tmpBarColor = '#4a90d9';\n\t\t\telse if (pEntity.Status === 'Pending') tmpBarColor = '#adb5bd';\n\n\t\t\tlet tmpRow = '<tr>';\n\t\t\ttmpRow += '<td><strong>' + pName + '</strong></td>';\n\t\t\ttmpRow += '<td>' + pEntity.Status + '</td>';\n\t\t\ttmpRow += '<td>';\n\t\t\ttmpRow += '<div class=\"progress-bar-container\"><div class=\"progress-bar-fill\" style=\"width:' + tmpPct + '%; background:' + tmpBarColor + '\"></div></div>';\n\t\t\ttmpRow += ' ' + tmpPct + '%';\n\t\t\ttmpRow += '</td>';\n\t\t\ttmpRow += '<td>' + (pEntity.Pushed || 0) + ' / ' + (pEntity.Total || 0) + '</td>';\n\t\t\ttmpRow += '</tr>';\n\t\t\treturn tmpRow;\n\t\t};\n\n\t\tif (tmpPushing.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"sync-section-header\">Pushing</div>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Status</th><th>Progress</th><th>Pushed</th></tr>';\n\t\t\tfor (let i = 0; i < tmpPushing.length; i++)\n\t\t\t{\n\t\t\t\ttmpHtml += fRenderRow(tmpPushing[i].Name, tmpPushing[i].Data);\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t}\n\n\t\tif (tmpPending.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"sync-section-header\">Next Up <span class=\"sync-section-count\">' + tmpPending.length + '</span></div>';\n\t\t\tlet tmpShowCount = Math.min(8, tmpPending.length);\n\t\t\ttmpHtml += '<table class=\"progress-table progress-table-muted\">';\n\t\t\tfor (let i = 0; i < tmpShowCount; i++)\n\t\t\t{\n\t\t\t\ttmpHtml += '<tr><td>' + tmpPending[i].Name + '</td>';\n\t\t\t\tif (tmpPending[i].Data.Total > 0)\n\t\t\t\t{\n\t\t\t\t\ttmpHtml += '<td class=\"sync-pending-count\">' + tmpSelf.pict.providers.ComprehensionLoader.formatNumber(tmpPending[i].Data.Total) + ' records</td>';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpHtml += '<td class=\"sync-pending-count\">\\u2014</td>';\n\t\t\t\t}\n\t\t\t\ttmpHtml += '</tr>';\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t\tif (tmpPending.length > tmpShowCount)\n\t\t\t{\n\t\t\t\ttmpHtml += '<div class=\"sync-section-overflow\">+ ' + (tmpPending.length - tmpShowCount) + ' more</div>';\n\t\t\t}\n\t\t}\n\n\t\tif (tmpErrors.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"sync-section-header sync-section-header-error\">Errors <span class=\"sync-section-count\">' + tmpErrors.length + '</span></div>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Status</th><th>Progress</th><th>Pushed</th></tr>';\n\t\t\tfor (let i = 0; i < tmpErrors.length; i++)\n\t\t\t{\n\t\t\t\ttmpHtml += fRenderRow(tmpErrors[i].Name, tmpErrors[i].Data);\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t}\n\n\t\tif (tmpCompleted.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"sync-section-header sync-section-header-ok\">Completed <span class=\"sync-section-count\">' + tmpCompleted.length + '</span></div>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Status</th><th>Progress</th><th>Pushed</th></tr>';\n\t\t\tfor (let i = 0; i < tmpCompleted.length; i++)\n\t\t\t{\n\t\t\t\ttmpHtml += fRenderRow(tmpCompleted[i].Name, tmpCompleted[i].Data);\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t}\n\n\t\ttmpContainer.innerHTML = tmpHtml;\n\t}\n}\n\nmodule.exports = ComprehensionLoaderLoadView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Load',\n\tDefaultRenderable: 'ComprehensionLoader-Load',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Section-Load',\n\tCSS: /*css*/`\n.progress-table { width: 100%; border-collapse: collapse; margin-top: 4px; margin-bottom: 4px; }\n.progress-table th, .progress-table td { text-align: left; padding: 6px 12px; border-bottom: 1px solid #eee; font-size: 0.9em; }\n.progress-table th { background: #f8f9fa; font-weight: 600; }\n.progress-table-muted td { color: #888; padding: 3px 12px; font-size: 0.85em; border-bottom: 1px solid #f4f5f6; }\n.progress-bar-container { width: 120px; height: 16px; background: #e9ecef; border-radius: 8px; overflow: hidden; display: inline-block; vertical-align: middle; }\n.progress-bar-fill { height: 100%; background: #28a745; transition: width 0.3s; }\n.sync-section-header { font-size: 0.8em; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: #4a90d9; padding: 10px 0 2px 0; margin-top: 6px; border-top: 1px solid #e0e0e0; }\n.sync-section-header:first-child { border-top: none; margin-top: 10px; }\n.sync-section-header-error { color: #dc3545; }\n.sync-section-header-ok { color: #28a745; }\n.sync-section-count { font-weight: 400; color: #999; font-size: 0.95em; }\n.sync-section-overflow { font-size: 0.8em; color: #aaa; padding: 2px 12px 6px; }\n.sync-pending-count { text-align: right; color: #aaa; font-size: 0.85em; }\n.report-card { background: #f8f9fa; border-radius: 8px; padding: 12px 16px; min-width: 140px; text-align: center; border: 1px solid #e9ecef; }\n.report-card .card-label { font-size: 0.8em; color: #666; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; }\n.report-card .card-value { font-size: 1.4em; font-weight: 700; }\n.report-card.outcome-success { border-left: 4px solid #28a745; }\n.report-card.outcome-partial { border-left: 4px solid #ffc107; }\n.report-card.outcome-error { border-left: 4px solid #dc3545; }\n.report-card.outcome-stopped { border-left: 4px solid #6c757d; }\n`,\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Load',\n\t\t\tTemplate: /*html*/`\n<div class=\"accordion-row\">\n\t<div class=\"accordion-number\">4</div>\n\t<div class=\"accordion-card\" id=\"section4\" data-section=\"4\">\n\t\t<div class=\"accordion-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleSection('section4')\">\n\t\t\t<div class=\"accordion-title\">Load</div>\n\t\t\t<span class=\"accordion-phase\" id=\"phase4\"></span>\n\t\t\t<div class=\"accordion-preview\" id=\"preview4\">Push comprehension data to the remote server</div>\n\t\t\t<div class=\"accordion-actions\">\n\t\t\t\t<span class=\"accordion-go\" onclick=\"event.stopPropagation(); pict.views['ComprehensionLoader-Load'].startLoad()\">go</span>\n\t\t\t\t<label class=\"accordion-auto\" onclick=\"event.stopPropagation()\"><input type=\"checkbox\" id=\"auto4\"> <span class=\"auto-label\">auto</span></label>\n\t\t\t</div>\n\t\t\t<div class=\"accordion-toggle\">&#9660;</div>\n\t\t</div>\n\t\t<div class=\"accordion-body\">\n\t\t\t<div style=\"display:flex; gap:8px; margin-bottom:10px\">\n\t\t\t\t<button class=\"success\" style=\"margin:0\" onclick=\"pict.views['ComprehensionLoader-Load'].startLoad()\">Start Load</button>\n\t\t\t\t<button class=\"danger\" style=\"margin:0\" onclick=\"pict.views['ComprehensionLoader-Load'].stopLoad()\">Stop Load</button>\n\t\t\t</div>\n\n\t\t\t<div id=\"loadStatus\"></div>\n\t\t\t<div id=\"loadProgress\"></div>\n\n\t\t\t<!-- Load Report (appears after load completes) -->\n\t\t\t<div id=\"loadReportSection\" style=\"display:none; margin-top:16px; padding-top:16px; border-top:2px solid #ddd\">\n\t\t\t\t<h3 style=\"margin:0 0 12px; font-size:1.1em\">Load Report</h3>\n\n\t\t\t\t<div id=\"reportSummaryCards\" style=\"display:flex; gap:12px; flex-wrap:wrap; margin-bottom:16px\"></div>\n\t\t\t\t<div id=\"reportAnomalies\" style=\"margin-bottom:16px\"></div>\n\t\t\t\t<div id=\"reportEntityDetails\" style=\"margin-bottom:16px\"></div>\n\n\t\t\t\t<div style=\"display:flex; gap:8px\">\n\t\t\t\t\t<button class=\"secondary\" onclick=\"pict.views['ComprehensionLoader-Load'].downloadReport()\">Download Report JSON</button>\n\t\t\t\t\t<button class=\"secondary\" onclick=\"pict.views['ComprehensionLoader-Load'].copyReport()\">Copy Report</button>\n\t\t\t\t</div>\n\t\t\t\t<div id=\"reportStatus\"></div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Load',\n\t\t\tTemplateHash: 'ComprehensionLoader-Load',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Section-Load'\n\t\t}\n\t]\n};\n\n},{\"pict-view\":13}],21:[function(require,module,exports){\nconst libPictView = require('pict-view');\n\nclass ComprehensionLoaderSchemaView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tfetchSchema()\n\t{\n\t\tlet tmpSchemaURL = document.getElementById('schemaURL').value.trim();\n\t\tlet tmpBody = {};\n\t\tif (tmpSchemaURL)\n\t\t{\n\t\t\ttmpBody.SchemaURL = tmpSchemaURL;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(2, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('schemaStatus', 'Fetching schema...', 'info');\n\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/schema/fetch', tmpBody)\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tif (pData.Success)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.AppData.ComprehensionLoader.FetchedEntities = pData.Entities || [];\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('schemaStatus', 'Fetched schema with ' + pData.EntityCount + ' entities from ' + pData.SchemaURL, 'ok');\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(2, 'ok');\n\t\t\t\t\t\tthis.renderEntityList();\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.updateAllPreviews();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('schemaStatus', 'Fetch failed: ' + (pData.Error || 'Unknown error'), 'error');\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(2, 'error');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('schemaStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(2, 'error');\n\t\t\t\t});\n\t}\n\n\trenderEntityList()\n\t{\n\t\tlet tmpEntities = this.pict.AppData.ComprehensionLoader.FetchedEntities || [];\n\t\tlet tmpContainer = document.getElementById('entityList');\n\t\tif (!tmpContainer) return;\n\n\t\tif (tmpEntities.length === 0)\n\t\t{\n\t\t\ttmpContainer.innerHTML = '<div style=\"color:#888; font-size:0.9em\">No entities found.</div>';\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpHtml = '<div style=\"font-size:0.9em; color:#555\">';\n\t\tfor (let i = 0; i < tmpEntities.length; i++)\n\t\t{\n\t\t\ttmpHtml += '<span style=\"display:inline-block; background:#f0f0f0; border-radius:4px; padding:2px 8px; margin:2px 4px 2px 0; font-size:0.9em\">';\n\t\t\ttmpHtml += this.pict.providers.ComprehensionLoader.escapeHtml(tmpEntities[i]);\n\t\t\ttmpHtml += '</span>';\n\t\t}\n\t\ttmpHtml += '</div>';\n\t\ttmpContainer.innerHTML = tmpHtml;\n\t}\n}\n\nmodule.exports = ComprehensionLoaderSchemaView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Schema',\n\tDefaultRenderable: 'ComprehensionLoader-Schema',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Section-Schema',\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Schema',\n\t\t\tTemplate: /*html*/`\n<div class=\"accordion-row\">\n\t<div class=\"accordion-number\">2</div>\n\t<div class=\"accordion-card\" id=\"section2\" data-section=\"2\">\n\t\t<div class=\"accordion-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleSection('section2')\">\n\t\t\t<div class=\"accordion-title\">Remote Schema</div>\n\t\t\t<span class=\"accordion-phase\" id=\"phase2\"></span>\n\t\t\t<div class=\"accordion-preview\" id=\"preview2\">Fetch entity schema from the remote server</div>\n\t\t\t<div class=\"accordion-actions\">\n\t\t\t\t<span class=\"accordion-go\" onclick=\"event.stopPropagation(); pict.views['ComprehensionLoader-Schema'].fetchSchema()\">go</span>\n\t\t\t\t<label class=\"accordion-auto\" onclick=\"event.stopPropagation()\"><input type=\"checkbox\" id=\"auto2\"> <span class=\"auto-label\">auto</span></label>\n\t\t\t</div>\n\t\t\t<div class=\"accordion-toggle\">&#9660;</div>\n\t\t</div>\n\t\t<div class=\"accordion-body\">\n\t\t\t<label for=\"schemaURL\">Schema URL (leave blank for default: ServerURL + Retold/Models)</label>\n\t\t\t<input type=\"text\" id=\"schemaURL\" placeholder=\"http://remote-server:8086/1.0/Retold/Models\">\n\n\t\t\t<button class=\"primary\" onclick=\"pict.views['ComprehensionLoader-Schema'].fetchSchema()\">Fetch Schema</button>\n\t\t\t<div id=\"schemaStatus\"></div>\n\n\t\t\t<div id=\"entityList\" style=\"margin-top:12px\"></div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Schema',\n\t\t\tTemplateHash: 'ComprehensionLoader-Schema',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Section-Schema'\n\t\t}\n\t]\n};\n\n},{\"pict-view\":13}],22:[function(require,module,exports){\nconst libPictView = require('pict-view');\n\nclass ComprehensionLoaderSessionView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tconfigureSession()\n\t{\n\t\tlet tmpServerURL = document.getElementById('serverURL').value.trim();\n\t\tif (!tmpServerURL)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Server URL is required.', 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpBody = { ServerURL: tmpServerURL.replace(/\\/+$/, '') + '/1.0/' };\n\n\t\tlet tmpAuthMethod = document.getElementById('authMethod').value.trim();\n\t\tif (tmpAuthMethod)\n\t\t{\n\t\t\ttmpBody.AuthenticationMethod = tmpAuthMethod;\n\t\t}\n\n\t\tlet tmpAuthURI = document.getElementById('authURI').value.trim();\n\t\tif (tmpAuthURI)\n\t\t{\n\t\t\ttmpBody.AuthenticationURITemplate = tmpAuthURI;\n\t\t}\n\n\t\tlet tmpCheckURI = document.getElementById('checkURI').value.trim();\n\t\tif (tmpCheckURI)\n\t\t{\n\t\t\ttmpBody.CheckSessionURITemplate = tmpCheckURI;\n\t\t}\n\n\t\tlet tmpCookieName = document.getElementById('cookieName').value.trim();\n\t\tif (tmpCookieName)\n\t\t{\n\t\t\ttmpBody.CookieName = tmpCookieName;\n\t\t}\n\n\t\tlet tmpCookieValueAddr = document.getElementById('cookieValueAddr').value.trim();\n\t\tif (tmpCookieValueAddr)\n\t\t{\n\t\t\ttmpBody.CookieValueAddress = tmpCookieValueAddr;\n\t\t}\n\n\t\tlet tmpCookieValueTemplate = document.getElementById('cookieValueTemplate').value.trim();\n\t\tif (tmpCookieValueTemplate)\n\t\t{\n\t\t\ttmpBody.CookieValueTemplate = tmpCookieValueTemplate;\n\t\t}\n\n\t\tlet tmpLoginMarker = document.getElementById('loginMarker').value.trim();\n\t\tif (tmpLoginMarker)\n\t\t{\n\t\t\ttmpBody.CheckSessionLoginMarker = tmpLoginMarker;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Configuring session...', 'info');\n\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/session/configure', tmpBody)\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tif (pData.Success)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Session configured for ' + pData.ServerURL + ' (domain: ' + pData.DomainMatch + ')', 'ok');\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Configuration failed: ' + (pData.Error || 'Unknown error'), 'error');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t});\n\t}\n\n\tauthenticate()\n\t{\n\t\tlet tmpUserName = document.getElementById('userName').value.trim();\n\t\tlet tmpPassword = document.getElementById('password').value.trim();\n\n\t\tif (!tmpUserName || !tmpPassword)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Username and password are required.', 'error');\n\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Authenticating...', 'info');\n\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/session/authenticate', { UserName: tmpUserName, Password: tmpPassword })\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tif (pData.Success && pData.Authenticated)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Authenticated successfully.', 'ok');\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'ok');\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Authentication failed: ' + (pData.Error || 'Not authenticated'), 'error');\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'error');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'error');\n\t\t\t\t});\n\t}\n\n\tcheckSession()\n\t{\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Checking session...', 'info');\n\n\t\tthis.pict.providers.ComprehensionLoader.api('GET', '/comprehension_load/session/check')\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tif (pData.Authenticated)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Session is active. Server: ' + (pData.ServerURL || 'N/A'), 'ok');\n\t\t\t\t\t}\n\t\t\t\t\telse if (pData.Configured)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Session configured but not authenticated.', 'warn');\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'No session configured.', 'warn');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t});\n\t}\n\n\tdeauthenticate()\n\t{\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/session/deauthenticate')\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Session deauthenticated.', 'info');\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, '');\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t});\n\t}\n\n\tgoAction()\n\t{\n\t\t// Two-step: configure session, then authenticate after delay\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'busy');\n\t\tthis.configureSession();\n\t\tsetTimeout(\n\t\t\t() =>\n\t\t\t{\n\t\t\t\tthis.authenticate();\n\t\t\t}, 1500);\n\t}\n}\n\nmodule.exports = ComprehensionLoaderSessionView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Session',\n\tDefaultRenderable: 'ComprehensionLoader-Session',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Section-Session',\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Session',\n\t\t\tTemplate: /*html*/`\n<div class=\"accordion-row\">\n\t<div class=\"accordion-number\">1</div>\n\t<div class=\"accordion-card\" id=\"section1\" data-section=\"1\">\n\t\t<div class=\"accordion-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleSection('section1')\">\n\t\t\t<div class=\"accordion-title\">Remote Session</div>\n\t\t\t<span class=\"accordion-phase\" id=\"phase1\"></span>\n\t\t\t<div class=\"accordion-preview\" id=\"preview1\">Configure remote server URL and credentials</div>\n\t\t\t<div class=\"accordion-actions\">\n\t\t\t\t<span class=\"accordion-go\" onclick=\"event.stopPropagation(); pict.views['ComprehensionLoader-Session'].goAction()\">go</span>\n\t\t\t\t<label class=\"accordion-auto\" onclick=\"event.stopPropagation()\"><input type=\"checkbox\" id=\"auto1\"> <span class=\"auto-label\">auto</span></label>\n\t\t\t</div>\n\t\t\t<div class=\"accordion-toggle\">&#9660;</div>\n\t\t</div>\n\t\t<div class=\"accordion-body\">\n\t\t\t<div class=\"inline-group\">\n\t\t\t\t<div style=\"flex:2\">\n\t\t\t\t\t<label for=\"serverURL\">Remote Server URL</label>\n\t\t\t\t\t<input type=\"text\" id=\"serverURL\" placeholder=\"http://remote-server:8086\" value=\"\">\n\t\t\t\t</div>\n\t\t\t\t<div style=\"flex:1\">\n\t\t\t\t\t<label for=\"authMethod\">Auth Method</label>\n\t\t\t\t\t<input type=\"text\" id=\"authMethod\" placeholder=\"get\" value=\"get\">\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<details style=\"margin-bottom:10px\">\n\t\t\t\t<summary style=\"cursor:pointer; font-size:0.9em; color:#666\">Advanced Session Options</summary>\n\t\t\t\t<div style=\"padding:10px 0\">\n\t\t\t\t\t<label for=\"authURI\">Authentication URI Template (leave blank for default)</label>\n\t\t\t\t\t<input type=\"text\" id=\"authURI\" placeholder=\"Authenticate/{~D:Record.UserName~}/{~D:Record.Password~}\">\n\t\t\t\t\t<label for=\"checkURI\">Check Session URI Template</label>\n\t\t\t\t\t<input type=\"text\" id=\"checkURI\" placeholder=\"CheckSession\">\n\t\t\t\t\t<label for=\"cookieName\">Cookie Name</label>\n\t\t\t\t\t<input type=\"text\" id=\"cookieName\" placeholder=\"SessionID\" value=\"SessionID\">\n\t\t\t\t\t<label for=\"cookieValueAddr\">Cookie Value Address</label>\n\t\t\t\t\t<input type=\"text\" id=\"cookieValueAddr\" placeholder=\"SessionID\" value=\"SessionID\">\n\t\t\t\t\t<label for=\"cookieValueTemplate\">Cookie Value Template (overrides Address if set)</label>\n\t\t\t\t\t<input type=\"text\" id=\"cookieValueTemplate\" placeholder=\"{~D:Record.SessionID~}\">\n\t\t\t\t\t<label for=\"loginMarker\">Login Marker</label>\n\t\t\t\t\t<input type=\"text\" id=\"loginMarker\" placeholder=\"LoggedIn\" value=\"LoggedIn\">\n\t\t\t\t</div>\n\t\t\t</details>\n\n\t\t\t<button class=\"primary\" onclick=\"pict.views['ComprehensionLoader-Session'].configureSession()\">Configure Session</button>\n\t\t\t<div id=\"sessionConfigStatus\"></div>\n\n\t\t\t<hr style=\"margin:16px 0; border:none; border-top:1px solid #eee\">\n\n\t\t\t<div class=\"inline-group\">\n\t\t\t\t<div>\n\t\t\t\t\t<label for=\"userName\">Username</label>\n\t\t\t\t\t<input type=\"text\" id=\"userName\" placeholder=\"username\">\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<label for=\"password\">Password</label>\n\t\t\t\t\t<input type=\"password\" id=\"password\" placeholder=\"password\">\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<button class=\"success\" onclick=\"pict.views['ComprehensionLoader-Session'].authenticate()\">Authenticate</button>\n\t\t\t<button class=\"secondary\" onclick=\"pict.views['ComprehensionLoader-Session'].checkSession()\">Check Session</button>\n\t\t\t<button class=\"danger\" onclick=\"pict.views['ComprehensionLoader-Session'].deauthenticate()\">Deauthenticate</button>\n\t\t\t<div id=\"sessionAuthStatus\"></div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Session',\n\t\t\tTemplateHash: 'ComprehensionLoader-Session',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Section-Session'\n\t\t}\n\t]\n};\n\n},{\"pict-view\":13}],23:[function(require,module,exports){\nconst libPictView = require('pict-view');\n\nclass ComprehensionLoaderSourceView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tonAfterRender()\n\t{\n\t\t// Restore source mode and toggle UI\n\t\tlet tmpSourceMode = localStorage.getItem('comprehensionLoader_comprehensionSourceMode');\n\t\tif (tmpSourceMode === 'file')\n\t\t{\n\t\t\tlet tmpFileRadio = document.getElementById('sourceMode_file');\n\t\t\tif (tmpFileRadio) tmpFileRadio.checked = true;\n\t\t}\n\t\tthis.onSourceModeChange();\n\t}\n\n\tonSourceModeChange()\n\t{\n\t\tlet tmpMode = document.querySelector('input[name=\"comprehensionSourceMode\"]:checked');\n\t\tlet tmpModeName = tmpMode ? tmpMode.value : 'url';\n\n\t\tlet tmpURLSection = document.getElementById('sourceURLSection');\n\t\tlet tmpFileSection = document.getElementById('sourceFileSection');\n\n\t\tif (tmpURLSection) tmpURLSection.style.display = tmpModeName === 'url' ? '' : 'none';\n\t\tif (tmpFileSection) tmpFileSection.style.display = tmpModeName === 'file' ? '' : 'none';\n\n\t\tthis.pict.providers.ComprehensionLoader.updateAllPreviews();\n\t}\n\n\tfetchFromURL()\n\t{\n\t\tlet tmpURL = document.getElementById('comprehensionURL').value.trim();\n\t\tif (!tmpURL)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Comprehension URL is required.', 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(3, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Fetching comprehension...', 'info');\n\n\t\tlet tmpSelf = this;\n\n\t\t// Try browser fetch first, fall back to server proxy on CORS failure\n\t\tfetch(tmpURL)\n\t\t\t.then(function(pResponse)\n\t\t\t{\n\t\t\t\tif (!pResponse.ok) throw new Error('HTTP ' + pResponse.status);\n\t\t\t\treturn pResponse.json();\n\t\t\t})\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.sendComprehensionToServer(pData);\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\t// CORS or network error — try server-side proxy\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Direct fetch failed (' + pError.message + '), trying server proxy...', 'info');\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/comprehension/proxy-fetch', { URL: tmpURL })\n\t\t\t\t\t.then(function(pProxyData)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pProxyData.Success)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus',\n\t\t\t\t\t\t\t\t'Loaded via proxy: ' + pProxyData.EntityCount + ' entities, ' + tmpSelf.pict.providers.ComprehensionLoader.formatNumber(pProxyData.TotalRecords) + ' records.', 'ok');\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'ok');\n\t\t\t\t\t\t\ttmpSelf.renderComprehensionSummary(pProxyData);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Proxy fetch failed: ' + (pProxyData.Error || 'Unknown error'), 'error');\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch(function(pProxyError)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Proxy request failed: ' + pProxyError.message, 'error');\n\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t\t});\n\t\t\t});\n\t}\n\n\tloadFromFiles()\n\t{\n\t\tlet tmpFileInput = document.getElementById('comprehensionFiles');\n\t\tif (!tmpFileInput || tmpFileInput.files.length === 0)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Please select one or more JSON files.', 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(3, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Reading files...', 'info');\n\n\t\tlet tmpSelf = this;\n\t\tlet tmpFiles = tmpFileInput.files;\n\t\tlet tmpMergedData = {};\n\t\tlet tmpFilesRead = 0;\n\n\t\tfor (let i = 0; i < tmpFiles.length; i++)\n\t\t{\n\t\t\t(function(pFile)\n\t\t\t{\n\t\t\t\tlet tmpReader = new FileReader();\n\t\t\t\ttmpReader.onload = function(pEvent)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tlet tmpParsed = JSON.parse(pEvent.target.result);\n\n\t\t\t\t\t\t// Merge entity keys from this file into the merged data\n\t\t\t\t\t\tlet tmpKeys = Object.keys(tmpParsed);\n\t\t\t\t\t\tfor (let k = 0; k < tmpKeys.length; k++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet tmpKey = tmpKeys[k];\n\t\t\t\t\t\t\tif (Array.isArray(tmpParsed[tmpKey]))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (!tmpMergedData[tmpKey])\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttmpMergedData[tmpKey] = [];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttmpMergedData[tmpKey] = tmpMergedData[tmpKey].concat(tmpParsed[tmpKey]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttmpMergedData[tmpKey] = tmpParsed[tmpKey];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (pParseError)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Error parsing ' + pFile.name + ': ' + pParseError.message, 'error');\n\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\ttmpFilesRead++;\n\t\t\t\t\tif (tmpFilesRead === tmpFiles.length)\n\t\t\t\t\t{\n\t\t\t\t\t\t// All files read — send merged comprehension to server\n\t\t\t\t\t\ttmpSelf.sendComprehensionToServer(tmpMergedData);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttmpReader.onerror = function()\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Error reading ' + pFile.name, 'error');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t};\n\t\t\t\ttmpReader.readAsText(pFile);\n\t\t\t})(tmpFiles[i]);\n\t\t}\n\t}\n\n\tsendComprehensionToServer(pData)\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/comprehension/receive', { Comprehension: pData })\n\t\t\t.then(function(pResult)\n\t\t\t{\n\t\t\t\tif (pResult.Success)\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus',\n\t\t\t\t\t\t'Loaded: ' + pResult.EntityCount + ' entities, ' + tmpSelf.pict.providers.ComprehensionLoader.formatNumber(pResult.TotalRecords) + ' records.', 'ok');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'ok');\n\t\t\t\t\ttmpSelf.renderComprehensionSummary(pResult);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Failed: ' + (pResult.Error || 'Unknown error'), 'error');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t});\n\t}\n\n\trenderComprehensionSummary(pResult)\n\t{\n\t\tlet tmpContainer = document.getElementById('comprehensionSummary');\n\t\tif (!tmpContainer) return;\n\n\t\tlet tmpHtml = '<table style=\"width:100%; border-collapse:collapse; margin-top:8px; font-size:0.9em\">';\n\t\ttmpHtml += '<thead><tr><th style=\"text-align:left; padding:6px 12px; border-bottom:2px solid #ddd\">Entity</th>';\n\t\ttmpHtml += '<th style=\"text-align:right; padding:6px 12px; border-bottom:2px solid #ddd\">Records</th></tr></thead>';\n\t\ttmpHtml += '<tbody>';\n\n\t\tlet tmpEntityList = pResult.EntityList || [];\n\t\tlet tmpRecordCounts = pResult.RecordCounts || {};\n\t\tfor (let i = 0; i < tmpEntityList.length; i++)\n\t\t{\n\t\t\tlet tmpName = tmpEntityList[i];\n\t\t\tlet tmpCount = tmpRecordCounts[tmpName] || 0;\n\t\t\ttmpHtml += '<tr>';\n\t\t\ttmpHtml += '<td style=\"padding:4px 12px; border-bottom:1px solid #f0f0f0\">' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpName) + '</td>';\n\t\t\ttmpHtml += '<td style=\"padding:4px 12px; border-bottom:1px solid #f0f0f0; text-align:right; font-variant-numeric:tabular-nums\">' + this.pict.providers.ComprehensionLoader.formatNumber(tmpCount) + '</td>';\n\t\t\ttmpHtml += '</tr>';\n\t\t}\n\n\t\ttmpHtml += '</tbody>';\n\t\ttmpHtml += '<tfoot><tr>';\n\t\ttmpHtml += '<td style=\"padding:6px 12px; font-weight:600\">Total</td>';\n\t\ttmpHtml += '<td style=\"padding:6px 12px; text-align:right; font-weight:600; font-variant-numeric:tabular-nums\">' + this.pict.providers.ComprehensionLoader.formatNumber(pResult.TotalRecords) + '</td>';\n\t\ttmpHtml += '</tr></tfoot>';\n\t\ttmpHtml += '</table>';\n\n\t\ttmpContainer.innerHTML = tmpHtml;\n\t\ttmpContainer.style.display = '';\n\t}\n\n\tclearComprehension()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/comprehension/clear')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\tif (pData.Success)\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Comprehension data cleared.', 'info');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, '');\n\t\t\t\t\tlet tmpContainer = document.getElementById('comprehensionSummary');\n\t\t\t\t\tif (tmpContainer)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmpContainer.innerHTML = '';\n\t\t\t\t\t\ttmpContainer.style.display = 'none';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t});\n\t}\n\n\tgoAction()\n\t{\n\t\tlet tmpMode = document.querySelector('input[name=\"comprehensionSourceMode\"]:checked');\n\t\tlet tmpModeName = tmpMode ? tmpMode.value : 'url';\n\n\t\tif (tmpModeName === 'url')\n\t\t{\n\t\t\tthis.fetchFromURL();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.loadFromFiles();\n\t\t}\n\t}\n}\n\nmodule.exports = ComprehensionLoaderSourceView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Source',\n\tDefaultRenderable: 'ComprehensionLoader-Source',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Section-Source',\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Source',\n\t\t\tTemplate: /*html*/`\n<div class=\"accordion-row\">\n\t<div class=\"accordion-number\">3</div>\n\t<div class=\"accordion-card\" id=\"section3\" data-section=\"3\">\n\t\t<div class=\"accordion-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleSection('section3')\">\n\t\t\t<div class=\"accordion-title\">Comprehension Source</div>\n\t\t\t<span class=\"accordion-phase\" id=\"phase3\"></span>\n\t\t\t<div class=\"accordion-preview\" id=\"preview3\">Provide a comprehension JSON URL or upload files</div>\n\t\t\t<div class=\"accordion-actions\">\n\t\t\t\t<span class=\"accordion-go\" onclick=\"event.stopPropagation(); pict.views['ComprehensionLoader-Source'].goAction()\">go</span>\n\t\t\t\t<label class=\"accordion-auto\" onclick=\"event.stopPropagation()\"><input type=\"checkbox\" id=\"auto3\"> <span class=\"auto-label\">auto</span></label>\n\t\t\t</div>\n\t\t\t<div class=\"accordion-toggle\">&#9660;</div>\n\t\t</div>\n\t\t<div class=\"accordion-body\">\n\t\t\t<div style=\"margin-bottom:12px\">\n\t\t\t\t<label style=\"margin-bottom:6px\">Source Mode</label>\n\t\t\t\t<div style=\"display:flex; gap:16px; align-items:center\">\n\t\t\t\t\t<label style=\"font-weight:normal; margin:0; cursor:pointer\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"comprehensionSourceMode\" id=\"sourceMode_url\" value=\"url\" checked onchange=\"pict.views['ComprehensionLoader-Source'].onSourceModeChange()\"> URL\n\t\t\t\t\t\t<span style=\"color:#888; font-size:0.85em\">(fetch from a URL)</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<label style=\"font-weight:normal; margin:0; cursor:pointer\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"comprehensionSourceMode\" id=\"sourceMode_file\" value=\"file\" onchange=\"pict.views['ComprehensionLoader-Source'].onSourceModeChange()\"> File Upload\n\t\t\t\t\t\t<span style=\"color:#888; font-size:0.85em\">(load JSON from local files)</span>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id=\"sourceURLSection\">\n\t\t\t\t<label for=\"comprehensionURL\">Comprehension JSON URL</label>\n\t\t\t\t<input type=\"text\" id=\"comprehensionURL\" placeholder=\"http://example.com/comprehension.json\">\n\t\t\t\t<button class=\"primary\" onclick=\"pict.views['ComprehensionLoader-Source'].fetchFromURL()\">Fetch Comprehension</button>\n\t\t\t</div>\n\n\t\t\t<div id=\"sourceFileSection\" style=\"display:none\">\n\t\t\t\t<label for=\"comprehensionFiles\">Comprehension JSON File(s)</label>\n\t\t\t\t<input type=\"file\" id=\"comprehensionFiles\" multiple accept=\".json\" style=\"margin-bottom:10px\">\n\t\t\t\t<div style=\"font-size:0.8em; color:#888; margin-bottom:10px\">Multiple files will be merged (entity keys combined).</div>\n\t\t\t\t<button class=\"primary\" onclick=\"pict.views['ComprehensionLoader-Source'].loadFromFiles()\">Load Files</button>\n\t\t\t</div>\n\n\t\t\t<button class=\"secondary\" onclick=\"pict.views['ComprehensionLoader-Source'].clearComprehension()\" style=\"margin-left:0\">Clear Comprehension</button>\n\t\t\t<div id=\"sourceStatus\"></div>\n\n\t\t\t<div id=\"comprehensionSummary\" style=\"display:none\"></div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Source',\n\t\t\tTemplateHash: 'ComprehensionLoader-Source',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Section-Source'\n\t\t}\n\t]\n};\n\n},{\"pict-view\":13}]},{},[17])(17)\n});\n\n","/**\n* Fable Service Base\n* @author <steven@velozo.com>\n*/\n\nconst libPackage = require('../package.json');\n\nclass FableServiceProviderBase\n{\n\t/**\n\t * The constructor can be used in two ways:\n\t * 1) With a fable, options object and service hash (the options object and service hash are optional)a\n\t * 2) With an object or nothing as the first parameter, where it will be treated as the options object\n\t *\n\t * @param {import('fable')|Record<string, any>} [pFable] - (optional) The fable instance, or the options object if there is no fable\n\t * @param {Record<string, any>|string} [pOptions] - (optional) The options object, or the service hash if there is no fable\n\t * @param {string} [pServiceHash] - (optional) The service hash to identify this service instance\n\t */\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\t/** @type {import('fable')} */\n\t\tthis.fable;\n\t\t/** @type {string} */\n\t\tthis.UUID;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.options;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.services;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.servicesMap;\n\n\t\t// Check if a fable was passed in; connect it if so\n\t\tif ((typeof(pFable) === 'object') && pFable.isFable)\n\t\t{\n\t\t\tthis.connectFable(pFable);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.fable = false;\n\t\t}\n\n\t\t// Initialize the services map if it wasn't passed in\n\t\t/** @type {Record<string, any>} */\n\t\tthis._PackageFableServiceProvider = libPackage;\n\n\t\t// initialize options and UUID based on whether the fable was passed in or not.\n\t\tif (this.fable)\n\t\t{\n\t\t\tthis.UUID = pFable.getUUID();\n\t\t\tthis.options = (typeof(pOptions) === 'object') ? pOptions\n\t\t\t\t\t\t\t: {};\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// With no fable, check to see if there was an object passed into either of the first two\n\t\t\t// Parameters, and if so, treat it as the options object\n\t\t\tthis.options = ((typeof(pFable) === 'object') && !pFable.isFable) ? pFable\n\t\t\t\t\t\t\t: (typeof(pOptions) === 'object') ? pOptions\n\t\t\t\t\t\t\t: {};\n\t\t\tthis.UUID = `CORE-SVC-${Math.floor((Math.random() * (99999 - 10000)) + 10000)}`\n\t\t}\n\n\t\t// It's expected that the deriving class will set this\n\t\tthis.serviceType = `Unknown-${this.UUID}`;\n\n\t\t// The service hash is used to identify the specific instantiation of the service in the services map\n\t\tthis.Hash = (typeof(pServiceHash) === 'string') ? pServiceHash \n\t\t\t\t\t: (!this.fable && (typeof(pOptions) === 'string')) ? pOptions\n\t\t\t\t\t: `${this.UUID}`;\n\t}\n\n\t/**\n\t * @param {import('fable')} pFable\n\t */\n\tconnectFable(pFable)\n\t{\n\t\tif ((typeof(pFable) !== 'object') || (!pFable.isFable))\n\t\t{\n\t\t\tlet tmpErrorMessage = `Fable Service Provider Base: Cannot connect to Fable, invalid Fable object passed in. The pFable parameter was a [${typeof(pFable)}].}`;\n\t\t\tconsole.log(tmpErrorMessage);\n\t\t\treturn new Error(tmpErrorMessage);\n\t\t}\n\n\t\tif (!this.fable)\n\t\t{\n\t\t\tthis.fable = pFable;\n\t\t}\n\n\t\tif (!this.log)\n\t\t{\n\t\t\tthis.log = this.fable.Logging;\n\t\t}\n\t\tif (!this.services)\n\t\t{\n\t\t\tthis.services = this.fable.services;\n\t\t}\n\n\t\tif (!this.servicesMap)\n\t\t{\n\t\t\tthis.servicesMap = this.fable.servicesMap;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tstatic isFableService = true;\n}\n\nmodule.exports = FableServiceProviderBase;\n\n// This is left here in case we want to go back to having different code/base class for \"core\" services\nmodule.exports.CoreServiceProviderBase = FableServiceProviderBase;\n","module.exports={\n \"name\": \"pict-application\",\n \"version\": \"1.0.33\",\n \"description\": \"Application base class for a pict view-based application\",\n \"main\": \"source/Pict-Application.js\",\n \"scripts\": {\n \"test\": \"npx quack test\",\n \"start\": \"node source/Pict-Application.js\",\n \"coverage\": \"npx quack coverage\",\n \"build\": \"npx quack build\",\n \"docker-dev-build\": \"docker build ./ -f Dockerfile_LUXURYCode -t pict-application-image:local\",\n \"docker-dev-run\": \"docker run -it -d --name pict-application-dev -p 30001:8080 -p 38086:8086 -v \\\"$PWD/.config:/home/coder/.config\\\" -v \\\"$PWD:/home/coder/pict-application\\\" -u \\\"$(id -u):$(id -g)\\\" -e \\\"DOCKER_USER=$USER\\\" pict-application-image:local\",\n \"docker-dev-shell\": \"docker exec -it pict-application-dev /bin/bash\",\n \"tests\": \"npx quack test -g\",\n \"lint\": \"eslint source/**\",\n \"types\": \"tsc -p .\"\n },\n \"types\": \"types/source/Pict-Application.d.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/stevenvelozo/pict-application.git\"\n },\n \"author\": \"steven velozo <steven@velozo.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/stevenvelozo/pict-application/issues\"\n },\n \"homepage\": \"https://github.com/stevenvelozo/pict-application#readme\",\n \"devDependencies\": {\n \"@eslint/js\": \"^9.28.0\",\n \"browser-env\": \"^3.3.0\",\n \"eslint\": \"^9.28.0\",\n \"pict\": \"^1.0.348\",\n \"pict-provider\": \"^1.0.10\",\n \"pict-view\": \"^1.0.66\",\n \"quackage\": \"^1.0.58\",\n \"typescript\": \"^5.9.3\"\n },\n \"mocha\": {\n \"diff\": true,\n \"extension\": [\n \"js\"\n ],\n \"package\": \"./package.json\",\n \"reporter\": \"spec\",\n \"slow\": \"75\",\n \"timeout\": \"5000\",\n \"ui\": \"tdd\",\n \"watch-files\": [\n \"source/**/*.js\",\n \"test/**/*.js\"\n ],\n \"watch-ignore\": [\n \"lib/vendor\"\n ]\n },\n \"dependencies\": {\n \"fable-serviceproviderbase\": \"^3.0.19\"\n }\n}\n","const libFableServiceBase = require('fable-serviceproviderbase')\n\nconst libPackage = require('../package.json');\n\nconst defaultPictSettings = (\n\t{\n\t\tName: 'DefaultPictApplication',\n\n\t\t// The main \"viewport\" is the view that is used to host our application\n\t\tMainViewportViewIdentifier: 'Default-View',\n\t\tMainViewportRenderableHash: false,\n\t\tMainViewportDestinationAddress: false,\n\t\tMainViewportDefaultDataAddress: false,\n\n\t\t// Whether or not we should automatically render the main viewport and other autorender views after we initialize the pict application\n\t\tAutoSolveAfterInitialize: true,\n\t\tAutoRenderMainViewportViewAfterInitialize: true,\n\t\tAutoRenderViewsAfterInitialize: false,\n\t\tAutoLoginAfterInitialize: false,\n\t\tAutoLoadDataAfterLogin: false,\n\n\t\tConfigurationOnlyViews: [],\n\n\t\tManifests: {},\n\t\t// The prefix to prepend on all template destination hashes\n\t\tIdentifierAddressPrefix: 'PICT-'\n\t});\n\n/**\n * Base class for pict applications.\n */\nclass PictApplication extends libFableServiceBase\n{\n\t/**\n\t * @param {import('fable')} pFable\n\t * @param {Record<string, any>} [pOptions]\n\t * @param {string} [pServiceHash]\n\t */\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tlet tmpCarryOverConfiguration = (typeof(pFable.settings.PictApplicationConfiguration) === 'object') ? pFable.settings.PictApplicationConfiguration : {};\n\t\tlet tmpOptions = Object.assign({}, JSON.parse(JSON.stringify(defaultPictSettings)), tmpCarryOverConfiguration, pOptions);\n\t\tsuper(pFable, tmpOptions, pServiceHash);\n\n\t\t/** @type {any} */\n\t\tthis.options;\n\t\t/** @type {any} */\n\t\tthis.log;\n\t\t/** @type {import('pict') & import('fable')} */\n\t\tthis.fable;\n\t\t/** @type {string} */\n\t\tthis.UUID;\n\t\t/** @type {string} */\n\t\tthis.Hash;\n\t\t/**\n\t\t * @type {{ [key: string]: any }}\n\t\t */\n\t\tthis.servicesMap;\n\n\t\tthis.serviceType = 'PictApplication';\n\t\t/** @type {Record<string, any>} */\n\t\tthis._Package = libPackage;\n\n\t\t// Convenience and consistency naming\n\t\tthis.pict = this.fable;\n\t\t// Wire in the essential Pict state\n\t\t/** @type {Record<string, any>} */\n\t\tthis.AppData = this.fable.AppData;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.Bundle = this.fable.Bundle;\n\n\t\t/** @type {number} */\n\t\tthis.initializeTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastSolvedTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastLoginTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastMarshalFromViewsTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastMarshalToViewsTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastAutoRenderTimestamp;\n\t\t/** @type {number} */\n\t\tthis.lastLoadDataTimestamp;\n\n\t\t// Load all the manifests for the application\n\t\tlet tmpManifestKeys = Object.keys(this.options.Manifests);\n\t\tif (tmpManifestKeys.length > 0)\n\t\t{\n\t\t\tfor (let i = 0; i < tmpManifestKeys.length; i++)\n\t\t\t{\n\t\t\t\t// Load each manifest\n\t\t\t\tlet tmpManifestKey = tmpManifestKeys[i];\n\t\t\t\tthis.fable.instantiateServiceProvider('Manifest', this.options.Manifests[tmpManifestKey], tmpManifestKey);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Solve All Views */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonPreSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onPreSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonPreSolveAsync(fCallback)\n\t{\n\t\tthis.onPreSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeSolveAsync(fCallback)\n\t{\n\t\tthis.onBeforeSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonSolveAsync(fCallback)\n\t{\n\t\tthis.onSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tsolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} executing solve() function...`)\n\t\t}\n\n\t\t// Walk through any loaded providers and solve them as well.\n\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\tlet tmpProvidersToSolve = [];\n\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t{\n\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\tif (tmpProvider.options.AutoSolveWithApp)\n\t\t\t{\n\t\t\t\ttmpProvidersToSolve.push(tmpProvider);\n\t\t\t}\n\t\t}\n\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpProvidersToSolve.sort((a, b) => { return a.options.AutoSolveOrdinal - b.options.AutoSolveOrdinal; });\n\t\tfor (let i = 0; i < tmpProvidersToSolve.length; i++)\n\t\t{\n\t\t\ttmpProvidersToSolve[i].solve(tmpProvidersToSolve[i]);\n\t\t}\n\n\t\tthis.onBeforeSolve();\n\t\t// Now walk through any loaded views and initialize them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToSolve = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\tif (tmpView.options.AutoInitialize)\n\t\t\t{\n\t\t\t\ttmpViewsToSolve.push(tmpView);\n\t\t\t}\n\t\t}\n\t\t// Sort the views by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpViewsToSolve.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\tfor (let i = 0; i < tmpViewsToSolve.length; i++)\n\t\t{\n\t\t\ttmpViewsToSolve[i].solve();\n\t\t}\n\t\tthis.onSolve();\n\t\tthis.onAfterSolve();\n\t\tthis.lastSolvedTimestamp = this.fable.log.getTimeStamp();\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tsolveAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\ttmpAnticipate.anticipate(this.onBeforeSolveAsync.bind(this));\n\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : false;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\t\t// Walk through any loaded providers and solve them as well.\n\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\tlet tmpProvidersToSolve = [];\n\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t{\n\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\tif (tmpProvider.options.AutoSolveWithApp)\n\t\t\t{\n\t\t\t\ttmpProvidersToSolve.push(tmpProvider);\n\t\t\t}\n\t\t}\n\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpProvidersToSolve.sort((a, b) => { return a.options.AutoSolveOrdinal - b.options.AutoSolveOrdinal; });\n\t\tfor (let i = 0; i < tmpProvidersToSolve.length; i++)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvidersToSolve[i].solveAsync.bind(tmpProvidersToSolve[i]));\n\t\t}\n\n\t\t// Walk through any loaded views and solve them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToSolve = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\tif (tmpView.options.AutoSolveWithApp)\n\t\t\t{\n\t\t\t\ttmpViewsToSolve.push(tmpView);\n\t\t\t}\n\t\t}\n\t\t// Sort the views by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpViewsToSolve.sort((a, b) => { return a.options.AutoSolveOrdinal - b.options.AutoSolveOrdinal; });\n\t\tfor (let i = 0; i < tmpViewsToSolve.length; i++)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpViewsToSolve[i].solveAsync.bind(tmpViewsToSolve[i]));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onSolveAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterSolveAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastSolvedTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterSolveAsync(fCallback)\n\t{\n\t\tthis.onAfterSolve();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Application Login */\n\t/* -------------------------------------------------------------------------- */\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeLoginAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeLoginAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonLoginAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onLoginAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tloginAsync(fCallback)\n\t{\n\t\tconst tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\tlet tmpCallback = fCallback;\n\n\t\tif (typeof(tmpCallback) !== 'function')\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loginAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loginAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeLoginAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onLoginAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterLoginAsync.bind(this));\n\n\t\t// check and see if we should automatically trigger a data load\n\t\tif (this.options.AutoLoadDataAfterLogin)\n\t\t{\n\t\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t\t{\n\t\t\t\tif (!this.isLoggedIn())\n\t\t\t\t{\n\t\t\t\t\treturn fNext();\n\t\t\t\t}\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto loading data after login...`);\n\t\t\t\t}\n\t\t\t\t//TODO: should data load errors funnel here? this creates a weird coupling between login and data load callbacks\n\t\t\t\tthis.loadDataAsync((pError) =>\n\t\t\t\t{\n\t\t\t\t\tfNext(pError);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loginAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastLoginTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * Check if the application state is logged in. Defaults to true. Override this method in your application based on login requirements.\n\t *\n\t * @return {boolean}\n\t */\n\tisLoggedIn()\n\t{\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterLoginAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterLoginAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Application LoadData */\n\t/* -------------------------------------------------------------------------- */\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeLoadDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeLoadDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonLoadDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onLoadDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tloadDataAsync(fCallback)\n\t{\n\t\tconst tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\tlet tmpCallback = fCallback;\n\n\t\tif (typeof(tmpCallback) !== 'function')\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loadDataAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loadDataAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeLoadDataAsync.bind(this));\n\n\t\t// Walk through any loaded providers and load their data as well.\n\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\tlet tmpProvidersToLoadData = [];\n\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t{\n\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\tif (tmpProvider.options.AutoLoadDataWithApp)\n\t\t\t{\n\t\t\t\ttmpProvidersToLoadData.push(tmpProvider);\n\t\t\t}\n\t\t}\n\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpProvidersToLoadData.sort((a, b) => { return a.options.AutoLoadDataOrdinal - b.options.AutoLoadDataOrdinal; });\n\n\t\tfor (const tmpProvider of tmpProvidersToLoadData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onBeforeLoadDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onLoadDataAsync.bind(this));\n\n\t\t//TODO: think about ways to parallelize these\n\t\tfor (const tmpProvider of tmpProvidersToLoadData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onLoadDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onAfterLoadDataAsync.bind(this));\n\n\t\tfor (const tmpProvider of tmpProvidersToLoadData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onAfterLoadDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.wait(\n\t\t\t/** @param {Error} [pError] */\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} loadDataAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastLoadDataTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterLoadDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterLoadDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Application SaveData */\n\t/* -------------------------------------------------------------------------- */\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeSaveDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeSaveDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonSaveDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onSaveDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tsaveDataAsync(fCallback)\n\t{\n\t\tconst tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\tlet tmpCallback = fCallback;\n\n\t\tif (typeof(tmpCallback) !== 'function')\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} saveDataAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} saveDataAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeSaveDataAsync.bind(this));\n\n\t\t// Walk through any loaded providers and load their data as well.\n\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\tlet tmpProvidersToSaveData = [];\n\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t{\n\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\tif (tmpProvider.options.AutoSaveDataWithApp)\n\t\t\t{\n\t\t\t\ttmpProvidersToSaveData.push(tmpProvider);\n\t\t\t}\n\t\t}\n\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\ttmpProvidersToSaveData.sort((a, b) => { return a.options.AutoSaveDataOrdinal - b.options.AutoSaveDataOrdinal; });\n\n\t\tfor (const tmpProvider of tmpProvidersToSaveData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onBeforeSaveDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onSaveDataAsync.bind(this));\n\n\t\t//TODO: think about ways to parallelize these\n\t\tfor (const tmpProvider of tmpProvidersToSaveData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onSaveDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onAfterSaveDataAsync.bind(this));\n\n\t\tfor (const tmpProvider of tmpProvidersToSaveData)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpProvider.onAfterSaveDataAsync.bind(tmpProvider));\n\t\t}\n\n\t\ttmpAnticipate.wait(\n\t\t\t/** @param {Error} [pError] */\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} saveDataAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastSaveDataTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterSaveDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterSaveDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Initialize Application */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeInitializeAsync(fCallback)\n\t{\n\t\tthis.onBeforeInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonInitializeAsync(fCallback)\n\t{\n\t\tthis.onInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tinitialize()\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} initialize:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tthis.onBeforeInitialize();\n\n\t\t\tif ('ConfigurationOnlyViews' in this.options)\n\t\t\t{\n\t\t\t\t// Load all the configuration only views\n\t\t\t\tfor (let i = 0; i < this.options.ConfigurationOnlyViews.length; i++)\n\t\t\t\t{\n\t\t\t\t\tlet tmpViewIdentifier = (typeof(this.options.ConfigurationOnlyViews[i].ViewIdentifier) === 'undefined') ? `AutoView-${this.fable.getUUID()}`\n\t\t\t\t\t\t\t\t\t\t\t: this.options.ConfigurationOnlyViews[i].ViewIdentifier;\n\t\t\t\t\tthis.log.info(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} adding configuration only view: ${tmpViewIdentifier}`);\n\t\t\t\t\tthis.pict.addView(tmpViewIdentifier, this.options.ConfigurationOnlyViews[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.onInitialize();\n\n\t\t\t// Walk through any loaded providers and initialize them as well.\n\t\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\t\tlet tmpProvidersToInitialize = [];\n\t\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\t\tif (tmpProvider.options.AutoInitialize)\n\t\t\t\t{\n\t\t\t\t\ttmpProvidersToInitialize.push(tmpProvider);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\t\ttmpProvidersToInitialize.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\t\tfor (let i = 0; i < tmpProvidersToInitialize.length; i++)\n\t\t\t{\n\t\t\t\ttmpProvidersToInitialize[i].initialize();\n\t\t\t}\n\n\t\t\t// Now walk through any loaded views and initialize them as well.\n\t\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\t\tlet tmpViewsToInitialize = [];\n\t\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\t\tif (tmpView.options.AutoInitialize)\n\t\t\t\t{\n\t\t\t\t\ttmpViewsToInitialize.push(tmpView);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Sort the views by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\t\ttmpViewsToInitialize.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\t\tfor (let i = 0; i < tmpViewsToInitialize.length; i++)\n\t\t\t{\n\t\t\t\ttmpViewsToInitialize[i].initialize();\n\t\t\t}\n\n\t\t\tthis.onAfterInitialize();\n\t\t\tif (this.options.AutoSolveAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto solving after initialization...`);\n\t\t\t\t}\n\t\t\t\t// Solve the template synchronously\n\t\t\t\tthis.solve();\n\t\t\t}\n\t\t\t// Now check and see if we should automatically render as well\n\t\t\tif (this.options.AutoRenderMainViewportViewAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto rendering after initialization...`);\n\t\t\t\t}\n\t\t\t\t// Render the template synchronously\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\tthis.initializeTimestamp = this.fable.log.getTimeStamp();\n\t\t\tthis.onCompletionOfInitialize();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initialize called but initialization is already completed. Aborting.`);\n\t\t\treturn false;\n\t\t}\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tinitializeAsync(fCallback)\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} initializeAsync:`);\n\t\t}\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : false;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initializeAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initializeAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t\tif (this.pict.LogNoisiness > 3)\n\t\t\t{\n\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} beginning initialization...`);\n\t\t\t}\n\n\t\t\tif ('ConfigurationOnlyViews' in this.options)\n\t\t\t{\n\t\t\t\t// Load all the configuration only views\n\t\t\t\tfor (let i = 0; i < this.options.ConfigurationOnlyViews.length; i++)\n\t\t\t\t{\n\t\t\t\t\tlet tmpViewIdentifier = (typeof(this.options.ConfigurationOnlyViews[i].ViewIdentifier) === 'undefined') ? `AutoView-${this.fable.getUUID()}`\n\t\t\t\t\t\t\t\t\t\t\t: this.options.ConfigurationOnlyViews[i].ViewIdentifier;\n\t\t\t\t\tthis.log.info(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} adding configuration only view: ${tmpViewIdentifier}`);\n\t\t\t\t\tthis.pict.addView(tmpViewIdentifier, this.options.ConfigurationOnlyViews[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttmpAnticipate.anticipate(this.onBeforeInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onInitializeAsync.bind(this));\n\n\t\t\t// Walk through any loaded providers and solve them as well.\n\t\t\tlet tmpLoadedProviders = Object.keys(this.pict.providers);\n\t\t\tlet tmpProvidersToInitialize = [];\n\t\t\tfor (let i = 0; i < tmpLoadedProviders.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpProvider = this.pict.providers[tmpLoadedProviders[i]];\n\t\t\t\tif (tmpProvider.options.AutoInitialize)\n\t\t\t\t{\n\t\t\t\t\ttmpProvidersToInitialize.push(tmpProvider);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Sort the providers by their priority (if they are all priority 0, it will end up being add order due to JSON Object Property Key order stuff)\n\t\t\ttmpProvidersToInitialize.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\t\tfor (let i = 0; i < tmpProvidersToInitialize.length; i++)\n\t\t\t{\n\t\t\t\ttmpAnticipate.anticipate(tmpProvidersToInitialize[i].initializeAsync.bind(tmpProvidersToInitialize[i]));\n\t\t\t}\n\n\t\t\t// Now walk through any loaded views and initialize them as well.\n\t\t\t// TODO: Some optimization cleverness could be gained by grouping them into a parallelized async operation, by ordinal.\n\t\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\t\tlet tmpViewsToInitialize = [];\n\t\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\t\tif (tmpView.options.AutoInitialize)\n\t\t\t\t{\n\t\t\t\t\ttmpViewsToInitialize.push(tmpView);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Sort the views by their priority\n\t\t\t// If they are all the default priority 0, it will end up being add order due to JSON Object Property Key order stuff\n\t\t\ttmpViewsToInitialize.sort((a, b) => { return a.options.AutoInitializeOrdinal - b.options.AutoInitializeOrdinal; });\n\t\t\tfor (let i = 0; i < tmpViewsToInitialize.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpView = tmpViewsToInitialize[i];\n\t\t\t\ttmpAnticipate.anticipate(tmpView.initializeAsync.bind(tmpView));\n\t\t\t}\n\n\t\t\ttmpAnticipate.anticipate(this.onAfterInitializeAsync.bind(this));\n\n\t\t\tif (this.options.AutoLoginAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto login (asynchronously) after initialization...`);\n\t\t\t\t}\n\t\t\t\ttmpAnticipate.anticipate(this.loginAsync.bind(this));\n\t\t\t}\n\n\t\t\tif (this.options.AutoSolveAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto solving (asynchronously) after initialization...`);\n\t\t\t\t}\n\t\t\t\ttmpAnticipate.anticipate(this.solveAsync.bind(this));\n\t\t\t}\n\n\t\t\tif (this.options.AutoRenderMainViewportViewAfterInitialize)\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 1)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} auto rendering (asynchronously) after initialization...`);\n\t\t\t\t}\n\t\t\t\ttmpAnticipate.anticipate(this.renderMainViewportAsync.bind(this));\n\t\t\t}\n\n\t\t\ttmpAnticipate.wait(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initializeAsync Error: ${pError.message || pError}`, { stack: pError.stack });\n\t\t\t\t\t}\n\t\t\t\t\tthis.initializeTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} initialization complete.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn tmpCallback();\n\t\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} async initialize called but initialization is already completed. Aborting.`);\n\t\t\t// TODO: Should this be an error?\n\t\t\treturn this.onCompletionOfInitializeAsync(tmpCallback);\n\t\t}\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterInitializeAsync(fCallback)\n\t{\n\t\tthis.onAfterInitialize();\n\t\treturn fCallback();\n\t}\n\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonCompletionOfInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onCompletionOfInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonCompletionOfInitializeAsync(fCallback)\n\t{\n\t\tthis.onCompletionOfInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Marshal Data From All Views */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeMarshalFromViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeMarshalFromViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeMarshalFromViewsAsync(fCallback)\n\t{\n\t\tthis.onBeforeMarshalFromViews();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonMarshalFromViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onMarshalFromViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonMarshalFromViewsAsync(fCallback)\n\t{\n\t\tthis.onMarshalFromViews();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tmarshalFromViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} executing marshalFromViews() function...`)\n\t\t}\n\t\tthis.onBeforeMarshalFromViews();\n\t\t// Now walk through any loaded views and initialize them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToMarshalFromViews = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\ttmpViewsToMarshalFromViews.push(tmpView);\n\t\t}\n\t\tfor (let i = 0; i < tmpViewsToMarshalFromViews.length; i++)\n\t\t{\n\t\t\ttmpViewsToMarshalFromViews[i].marshalFromView();\n\t\t}\n\t\tthis.onMarshalFromViews();\n\t\tthis.onAfterMarshalFromViews();\n\t\tthis.lastMarshalFromViewsTimestamp = this.fable.log.getTimeStamp();\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tmarshalFromViewsAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : false;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewsAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewsAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeMarshalFromViewsAsync.bind(this));\n\t\t// Walk through any loaded views and marshalFromViews them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToMarshalFromViews = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\ttmpViewsToMarshalFromViews.push(tmpView);\n\t\t}\n\t\tfor (let i = 0; i < tmpViewsToMarshalFromViews.length; i++)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpViewsToMarshalFromViews[i].marshalFromViewAsync.bind(tmpViewsToMarshalFromViews[i]));\n\t\t}\n\t\ttmpAnticipate.anticipate(this.onMarshalFromViewsAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterMarshalFromViewsAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewsAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastMarshalFromViewsTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterMarshalFromViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterMarshalFromViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterMarshalFromViewsAsync(fCallback)\n\t{\n\t\tthis.onAfterMarshalFromViews();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Marshal Data To All Views */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeMarshalToViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeMarshalToViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeMarshalToViewsAsync(fCallback)\n\t{\n\t\tthis.onBeforeMarshalToViews();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonMarshalToViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onMarshalToViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonMarshalToViewsAsync(fCallback)\n\t{\n\t\tthis.onMarshalToViews();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tmarshalToViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} executing marshalToViews() function...`)\n\t\t}\n\t\tthis.onBeforeMarshalToViews();\n\t\t// Now walk through any loaded views and initialize them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToMarshalToViews = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\ttmpViewsToMarshalToViews.push(tmpView);\n\t\t}\n\t\tfor (let i = 0; i < tmpViewsToMarshalToViews.length; i++)\n\t\t{\n\t\t\ttmpViewsToMarshalToViews[i].marshalToView();\n\t\t}\n\t\tthis.onMarshalToViews();\n\t\tthis.onAfterMarshalToViews();\n\t\tthis.lastMarshalToViewsTimestamp = this.fable.log.getTimeStamp();\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tmarshalToViewsAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : false;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewsAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewsAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeMarshalToViewsAsync.bind(this));\n\t\t// Walk through any loaded views and marshalToViews them as well.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\tlet tmpViewsToMarshalToViews = [];\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\ttmpViewsToMarshalToViews.push(tmpView);\n\t\t}\n\t\tfor (let i = 0; i < tmpViewsToMarshalToViews.length; i++)\n\t\t{\n\t\t\ttmpAnticipate.anticipate(tmpViewsToMarshalToViews[i].marshalToViewAsync.bind(tmpViewsToMarshalToViews[i]));\n\t\t}\n\t\ttmpAnticipate.anticipate(this.onMarshalToViewsAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterMarshalToViewsAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewsAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastMarshalToViewsTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterMarshalToViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterMarshalToViews:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterMarshalToViewsAsync(fCallback)\n\t{\n\t\tthis.onAfterMarshalToViews();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Render View */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * @return {boolean}\n\t */\n\tonBeforeRender()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onBeforeRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonBeforeRenderAsync(fCallback)\n\t{\n\t\tthis.onBeforeRender();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {string} [pViewIdentifier] - The hash of the view to render. By default, the main viewport view is rendered.\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string} [pTemplateDataAddress] - The address where the data for the template is stored.\n\t *\n\t * TODO: Should we support objects for pTemplateDataAddress for parity with pict-view?\n\t */\n\trender(pViewIdentifier, pRenderableHash, pRenderDestinationAddress, pTemplateDataAddress)\n\t{\n\t\tlet tmpViewIdentifier = (typeof(pViewIdentifier) !== 'string') ? this.options.MainViewportViewIdentifier : pViewIdentifier;\n\t\tlet tmpRenderableHash = (typeof(pRenderableHash) !== 'string') ? this.options.MainViewportRenderableHash : pRenderableHash;\n\t\tlet tmpRenderDestinationAddress = (typeof(pRenderDestinationAddress) !== 'string') ? this.options.MainViewportDestinationAddress : pRenderDestinationAddress;\n\t\tlet tmpTemplateDataAddress = (typeof(pTemplateDataAddress) !== 'string') ? this.options.MainViewportDefaultDataAddress : pTemplateDataAddress;\n\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} VIEW Renderable[${tmpRenderableHash}] Destination[${tmpRenderDestinationAddress}] TemplateDataAddress[${tmpTemplateDataAddress}] render:`);\n\t\t}\n\n\t\tthis.onBeforeRender();\n\n\t\t// Now get the view (by hash) from the loaded views\n\t\tlet tmpView = (typeof (tmpViewIdentifier) === 'string') ? this.servicesMap.PictView[tmpViewIdentifier] : false;\n\t\tif (!tmpView)\n\t\t{\n\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} could not render from View ${tmpViewIdentifier} because it is not a valid view.`);\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.onRender();\n\n\t\ttmpView.render(tmpRenderableHash, tmpRenderDestinationAddress, tmpTemplateDataAddress);\n\n\t\tthis.onAfterRender();\n\n\t\treturn true;\n\t}\n\t/**\n\t * @return {boolean}\n\t */\n\tonRender()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonRenderAsync(fCallback)\n\t{\n\t\tthis.onRender();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {string|((error?: Error) => void)} pViewIdentifier - The hash of the view to render. By default, the main viewport view is rendered. (or the callback)\n\t * @param {string|((error?: Error) => void)} [pRenderableHash] - The hash of the renderable to render. (or the callback)\n\t * @param {string|((error?: Error) => void)} [pRenderDestinationAddress] - The address where the renderable will be rendered. (or the callback)\n\t * @param {string|((error?: Error) => void)} [pTemplateDataAddress] - The address where the data for the template is stored. (or the callback)\n\t * @param {(error?: Error) => void} [fCallback] - The callback, if all other parameters are provided.\n\t *\n\t * TODO: Should we support objects for pTemplateDataAddress for parity with pict-view?\n\t */\n\trenderAsync(pViewIdentifier, pRenderableHash, pRenderDestinationAddress, pTemplateDataAddress, fCallback)\n\t{\n\t\tlet tmpViewIdentifier = (typeof(pViewIdentifier) !== 'string') ? this.options.MainViewportViewIdentifier : pViewIdentifier;\n\t\tlet tmpRenderableHash = (typeof(pRenderableHash) !== 'string') ? this.options.MainViewportRenderableHash : pRenderableHash;\n\t\tlet tmpRenderDestinationAddress = (typeof(pRenderDestinationAddress) !== 'string') ? this.options.MainViewportDestinationAddress : pRenderDestinationAddress;\n\t\tlet tmpTemplateDataAddress = (typeof(pTemplateDataAddress) !== 'string') ? this.options.MainViewportDefaultDataAddress : pTemplateDataAddress;\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback :\n\t\t\t\t\t\t\t(typeof(pTemplateDataAddress) === 'function') ? pTemplateDataAddress :\n\t\t\t\t\t\t\t(typeof(pRenderDestinationAddress) === 'function') ? pRenderDestinationAddress :\n\t\t\t\t\t\t\t(typeof(pRenderableHash) === 'function') ? pRenderableHash :\n\t\t\t\t\t\t\t(typeof(pViewIdentifier) === 'function') ? pViewIdentifier :\n\t\t\t\t\t\t\tfalse;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} VIEW Renderable[${tmpRenderableHash}] Destination[${tmpRenderDestinationAddress}] TemplateDataAddress[${tmpTemplateDataAddress}] renderAsync:`);\n\t\t}\n\n\t\tlet tmpRenderAnticipate = this.fable.newAnticipate();\n\n\t\ttmpRenderAnticipate.anticipate(this.onBeforeRenderAsync.bind(this));\n\n\t\tlet tmpView = (typeof (tmpViewIdentifier) === 'string') ? this.servicesMap.PictView[tmpViewIdentifier] : false;\n\t\tif (!tmpView)\n\t\t{\n\t\t\tlet tmpErrorMessage = `PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} could not asynchronously render from View ${tmpViewIdentifier} because it is not a valid view.`;\n\t\t\tif (this.pict.LogNoisiness > 3)\n\t\t\t{\n\t\t\t\tthis.log.error(tmpErrorMessage);\n\t\t\t}\n\t\t\treturn tmpCallback(new Error(tmpErrorMessage));\n\t\t}\n\n\t\ttmpRenderAnticipate.anticipate(this.onRenderAsync.bind(this));\n\n\t\ttmpRenderAnticipate.anticipate(\n\t\t\t(fNext) =>\n\t\t\t{\n\t\t\t\ttmpView.renderAsync.call(tmpView, tmpRenderableHash, tmpRenderDestinationAddress, tmpTemplateDataAddress, fNext);\n\t\t\t});\n\n\t\ttmpRenderAnticipate.anticipate(this.onAfterRenderAsync.bind(this));\n\n\t\treturn tmpRenderAnticipate.wait(tmpCallback);\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tonAfterRender()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} onAfterRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\tonAfterRenderAsync(fCallback)\n\t{\n\t\tthis.onAfterRender();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\trenderMainViewport()\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderMainViewport:`);\n\t\t}\n\n\t\treturn this.render();\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\trenderMainViewportAsync(fCallback)\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow APPLICATION [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderMainViewportAsync:`);\n\t\t}\n\n\t\treturn this.renderAsync(fCallback);\n\t}\n\t/**\n\t * @return {void}\n\t */\n\trenderAutoViews()\n\t{\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} beginning renderAutoViews...`);\n\t\t}\n\t\t// Now walk through any loaded views and sort them by the AutoRender ordinal\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\t// Sort the views by their priority\n\t\t// If they are all the default priority 0, it will end up being add order due to JSON Object Property Key order stuff\n\t\ttmpLoadedViews.sort((a, b) =>\n\t\t{\n\t\t\treturn this.pict.views[a].options.AutoRenderOrdinal - this.pict.views[b].options.AutoRenderOrdinal;\n\t\t});\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\tif (tmpView.options.AutoRender)\n\t\t\t{\n\t\t\t\ttmpView.render();\n\t\t\t}\n\t\t}\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAutoViewsAsync complete.`);\n\t\t}\n\t}\n\t/**\n\t * @param {(error?: Error) => void} fCallback\n\t */\n\trenderAutoViewsAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.fable.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback :\n\t\t\t\t\t\t\tfalse;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAutoViewsAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAutoViewsAsync Auto Callback Error: ${pError}`, pError)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} beginning renderAutoViewsAsync...`);\n\t\t}\n\n\t\t// Now walk through any loaded views and sort them by the AutoRender ordinal\n\t\t// TODO: Some optimization cleverness could be gained by grouping them into a parallelized async operation, by ordinal.\n\t\tlet tmpLoadedViews = Object.keys(this.pict.views);\n\t\t// Sort the views by their priority\n\t\t// If they are all the default priority 0, it will end up being add order due to JSON Object Property Key order stuff\n\t\ttmpLoadedViews.sort((a, b) =>\n\t\t{\n\t\t\treturn this.pict.views[a].options.AutoRenderOrdinal - this.pict.views[b].options.AutoRenderOrdinal;\n\t\t});\n\t\tfor (let i = 0; i < tmpLoadedViews.length; i++)\n\t\t{\n\t\t\tlet tmpView = this.pict.views[tmpLoadedViews[i]];\n\t\t\tif (tmpView.options.AutoRender)\n\t\t\t{\n\t\t\t\ttmpAnticipate.anticipate(tmpView.renderAsync.bind(tmpView));\n\t\t\t}\n\t\t}\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tthis.lastAutoRenderTimestamp = this.fable.log.getTimeStamp();\n\t\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictApp [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAutoViewsAsync complete.`);\n\t\t\t\t}\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * @return {boolean}\n\t */\n\tget isPictApplication()\n\t{\n\t\treturn true;\n\t}\n}\n\nmodule.exports = PictApplication;\n","module.exports={\n \"name\": \"pict-provider\",\n \"version\": \"1.0.12\",\n \"description\": \"Pict Provider Base Class\",\n \"main\": \"source/Pict-Provider.js\",\n \"scripts\": {\n \"start\": \"node source/Pict-Provider.js\",\n \"test\": \"npx quack test\",\n \"tests\": \"npx quack test -g\",\n \"coverage\": \"npx quack coverage\",\n \"build\": \"npx quack build\",\n \"docker-dev-build\": \"docker build ./ -f Dockerfile_LUXURYCode -t pict-provider-image:local\",\n \"docker-dev-run\": \"docker run -it -d --name pict-provider-dev -p 24125:8080 -p 30027:8086 -v \\\"$PWD/.config:/home/coder/.config\\\" -v \\\"$PWD:/home/coder/pict-provider\\\" -u \\\"$(id -u):$(id -g)\\\" -e \\\"DOCKER_USER=$USER\\\" pict-provider-image:local\",\n \"docker-dev-shell\": \"docker exec -it pict-provider-dev /bin/bash\",\n \"lint\": \"eslint source/**\",\n \"types\": \"tsc -p .\"\n },\n \"types\": \"types/source/Pict-Provider.d.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/stevenvelozo/pict-provider.git\"\n },\n \"author\": \"steven velozo <steven@velozo.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/stevenvelozo/pict-provider/issues\"\n },\n \"homepage\": \"https://github.com/stevenvelozo/pict-provider#readme\",\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.1\",\n \"eslint\": \"^9.39.1\",\n \"pict\": \"^1.0.351\",\n \"quackage\": \"^1.0.58\",\n \"typescript\": \"^5.9.3\"\n },\n \"dependencies\": {\n \"fable-serviceproviderbase\": \"^3.0.19\"\n },\n \"mocha\": {\n \"diff\": true,\n \"extension\": [\n \"js\"\n ],\n \"package\": \"./package.json\",\n \"reporter\": \"spec\",\n \"slow\": \"75\",\n \"timeout\": \"5000\",\n \"ui\": \"tdd\",\n \"watch-files\": [\n \"source/**/*.js\",\n \"test/**/*.js\"\n ],\n \"watch-ignore\": [\n \"lib/vendor\"\n ]\n }\n}\n","const libFableServiceBase = require('fable-serviceproviderbase');\n\nconst libPackage = require('../package.json');\n\nconst defaultPictProviderSettings = (\n\t{\n\t\tProviderIdentifier: false,\n\n\t\t// If this is set to true, when the App initializes this will.\n\t\t// After the App initializes, initialize will be called as soon as it's added.\n\t\tAutoInitialize: true,\n\t\tAutoInitializeOrdinal: 0,\n\n\t\tAutoLoadDataWithApp: true,\n\t\tAutoLoadDataOrdinal: 0,\n\n\t\tAutoSolveWithApp: true,\n\t\tAutoSolveOrdinal: 0,\n\n\t\tManifests: {},\n\n\t\tTemplates: []\n\t});\n\nclass PictProvider extends libFableServiceBase\n{\n\t/**\n\t * @param {import('fable')} pFable - The Fable instance.\n\t * @param {Record<string, any>} [pOptions] - The options for the provider.\n\t * @param {string} [pServiceHash] - The service hash for the provider.\n\t */\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\t// Intersect default options, parent constructor, service information\n\t\tlet tmpOptions = Object.assign({}, JSON.parse(JSON.stringify(defaultPictProviderSettings)), pOptions);\n\t\tsuper(pFable, tmpOptions, pServiceHash);\n\n\t\t/** @type {import('fable') & import('pict') & { instantiateServiceProviderWithoutRegistration(pServiceType: string, pOptions?: Record<string, any>, pCustomServiceHash?: string): any }} */\n\t\tthis.fable;\n\t\t/** @type {import('fable') & import('pict') & { instantiateServiceProviderWithoutRegistration(pServiceType: string, pOptions?: Record<string, any>, pCustomServiceHash?: string): any }} */\n\t\tthis.pict;\n\t\t/** @type {any} */\n\t\tthis.log;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.options;\n\t\t/** @type {string} */\n\t\tthis.UUID;\n\t\t/** @type {string} */\n\t\tthis.Hash;\n\n\t\tif (!this.options.ProviderIdentifier)\n\t\t{\n\t\t\tthis.options.ProviderIdentifier = `AutoProviderID-${this.fable.getUUID()}`;\n\t\t}\n\n\t\tthis.serviceType = 'PictProvider';\n\t\t/** @type {Record<string, any>} */\n\t\tthis._Package = libPackage;\n\n\t\t// Convenience and consistency naming\n\t\tthis.pict = this.fable;\n\n\t\t// Wire in the essential Pict application state\n\t\t/** @type {Record<string, any>} */\n\t\tthis.AppData = this.pict.AppData;\n\t\t/** @type {Record<string, any>} */\n\t\tthis.Bundle = this.pict.Bundle;\n\n\t\tthis.initializeTimestamp = false;\n\t\tthis.lastSolvedTimestamp = false;\n\n\t\tfor (let i = 0; i < this.options.Templates.length; i++)\n\t\t{\n\t\t\tlet tmpDefaultTemplate = this.options.Templates[i];\n\n\t\t\tif (!tmpDefaultTemplate.hasOwnProperty('Postfix') || !tmpDefaultTemplate.hasOwnProperty('Template'))\n\t\t\t{\n\t\t\t\tthis.log.error(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} could not load Default Template ${i} in the options array.`, tmpDefaultTemplate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!tmpDefaultTemplate.Source)\n\t\t\t\t{\n\t\t\t\t\ttmpDefaultTemplate.Source = `PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} options object.`;\n\t\t\t\t}\n\t\t\t\tthis.pict.TemplateProvider.addDefaultTemplate(tmpDefaultTemplate.Prefix, tmpDefaultTemplate.Postfix, tmpDefaultTemplate.Template, tmpDefaultTemplate.Source);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Initialization */\n\t/* -------------------------------------------------------------------------- */\n\tonBeforeInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onBeforeInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after pre-pinitialization.\n\t *\n\t * @return {void}\n\t */\n\tonBeforeInitializeAsync(fCallback)\n\t{\n\t\tthis.onBeforeInitialize();\n\t\treturn fCallback();\n\t}\n\n\tonInitialize()\n\t{\n\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after initialization.\n\t *\n\t * @return {void}\n\t */\n\tonInitializeAsync(fCallback)\n\t{\n\t\tthis.onInitialize();\n\t\treturn fCallback();\n\t}\n\n\tinitialize()\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow PROVIDER [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initialize:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tthis.onBeforeInitialize();\n\t\t\tthis.onInitialize();\n\t\t\tthis.onAfterInitialize();\n\t\t\tthis.initializeTimestamp = this.pict.log.getTimeStamp();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initialize called but initialization is already completed. Aborting.`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after initialization.\n\t *\n\t * @return {void}\n\t */\n\tinitializeAsync(fCallback)\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow PROVIDER [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initializeAsync:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t{\n\t\t\t\tthis.log.info(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} beginning initialization...`);\n\t\t\t}\n\n\t\t\ttmpAnticipate.anticipate(this.onBeforeInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onAfterInitializeAsync.bind(this));\n\n\t\t\ttmpAnticipate.wait(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.initializeTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initialization failed: ${pError.message || pError}`, { Stack: pError.stack });\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.pict.LogNoisiness > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.info(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} initialization complete.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn fCallback();\n\t\t\t\t})\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} async initialize called but initialization is already completed. Aborting.`);\n\t\t\t// TODO: Should this be an error?\n\t\t\treturn fCallback();\n\t\t}\n\t}\n\n\tonAfterInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onAfterInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after initialization.\n\t *\n\t * @return {void}\n\t */\n\tonAfterInitializeAsync(fCallback)\n\t{\n\t\tthis.onAfterInitialize();\n\t\treturn fCallback();\n\t}\n\n\tonPreRender()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onPreRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after pre-render.\n\t *\n\t * @return {void}\n\t */\n\tonPreRenderAsync(fCallback)\n\t{\n\t\tthis.onPreRender();\n\t\treturn fCallback();\n\t}\n\n\trender()\n\t{\n\t\treturn this.onPreRender();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after render.\n\t *\n\t * @return {void}\n\t */\n\trenderAsync(fCallback)\n\t{\n\t\tthis.onPreRender();\n\t\treturn fCallback();\n\t}\n\n\tonPreSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onPreSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after pre-solve.\n\t *\n\t * @return {void}\n\t */\n\tonPreSolveAsync(fCallback)\n\t{\n\t\tthis.onPreSolve();\n\t\treturn fCallback();\n\t}\n\n\tsolve()\n\t{\n\t\treturn this.onPreSolve();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after solve.\n\t *\n\t * @return {void}\n\t */\n\tsolveAsync(fCallback)\n\t{\n\t\tthis.onPreSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data pre-load.\n\t */\n\tonBeforeLoadDataAsync(fCallback)\n\t{\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Hook to allow the provider to load data during application data load.\n\t *\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data load.\n\t */\n\tonLoadDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onLoadDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data post-load.\n\t */\n\tonAfterLoadDataAsync(fCallback)\n\t{\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data pre-load.\n\t *\n\t * @return {void}\n\t */\n\tonBeforeSaveDataAsync(fCallback)\n\t{\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Hook to allow the provider to load data during application data load.\n\t *\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data load.\n\t *\n\t * @return {void}\n\t */\n\tonSaveDataAsync(fCallback)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictProvider [${this.UUID}]::[${this.Hash}] ${this.options.ProviderIdentifier} onSaveDataAsync:`);\n\t\t}\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * @param {(pError?: Error) => void} fCallback - The callback to call after the data post-load.\n\t *\n\t * @return {void}\n\t */\n\tonAfterSaveDataAsync(fCallback)\n\t{\n\t\treturn fCallback();\n\t}\n}\n\nmodule.exports = PictProvider;\n","module.exports = (\n{\n\t\"RenderOnLoad\": true,\n\n\t\"DefaultRenderable\": \"Histogram-Wrap\",\n\t\"DefaultDestinationAddress\": \"#Histogram-Container-Div\",\n\n\t\"Templates\":\n\t[\n\t\t{\n\t\t\t\"Hash\": \"Histogram-Container\",\n\t\t\t\"Template\": \"<!-- Histogram Container Rendering Soon -->\"\n\t\t}\n\t],\n\n\t\"Renderables\":\n\t[\n\t\t{\n\t\t\t\"RenderableHash\": \"Histogram-Wrap\",\n\t\t\t\"TemplateHash\": \"Histogram-Container\",\n\t\t\t\"DestinationAddress\": \"#Histogram-Container-Div\"\n\t\t}\n\t],\n\n\t\"TargetElementAddress\": \"#Histogram-Container-Div\",\n\n\t// --- Data Configuration ---\n\n\t// Address in AppData (or other Pict address space) for the histogram bins\n\t// Expected format: Array of objects with at least { Label, Value } properties\n\t// e.g. [{ Label: \"2020\", Value: 15 }, { Label: \"2021\", Value: 42 }]\n\t\"DataAddress\": false,\n\n\t// Alternatively, provide bins directly (used if DataAddress is not set)\n\t\"Bins\": [],\n\n\t// Property names within each bin object\n\t\"LabelProperty\": \"Label\",\n\t\"ValueProperty\": \"Value\",\n\n\t// --- Layout Configuration ---\n\n\t// \"vertical\" = bars grow upward; \"horizontal\" = bars grow rightward\n\t\"Orientation\": \"vertical\",\n\n\t// The rendering mode: \"browser\", \"consoleui\", or \"cli\"\n\t// \"browser\" renders HTML/CSS/SVG; \"consoleui\" renders via blessed widgets;\n\t// \"cli\" renders ANSI text to stdout\n\t\"RenderMode\": \"browser\",\n\n\t// Maximum height in pixels (browser vertical) or characters (cli/consoleui)\n\t\"MaxBarSize\": 200,\n\n\t// Bar thickness in pixels (browser) or characters (cli/consoleui)\n\t\"BarThickness\": 30,\n\n\t// Gap between bars in pixels (browser) or characters (cli/consoleui)\n\t\"BarGap\": 4,\n\n\t// When true, bar groups expand to fill the container width (vertical) or\n\t// height (horizontal) using CSS flex-grow instead of a fixed BarThickness.\n\t// Labels and values overflow their column so they remain readable even when\n\t// bars are very narrow. Best suited for time-series or dense histograms.\n\t\"FillContainer\": false,\n\n\t// Whether to show value labels on/above bars\n\t\"ShowValues\": true,\n\n\t// Whether to show bin labels (x-axis for vertical, y-axis for horizontal)\n\t\"ShowLabels\": true,\n\n\t// In FillContainer mode, controls label density in the separate label row.\n\t// 0 = auto-compute (space labels approximately 80px apart based on container\n\t// width), N > 0 = show a label every N bars starting from index 0.\n\t// Ignored when FillContainer is false (every bar shows its own label).\n\t\"LabelInterval\": 0,\n\n\t// Color of the bars (CSS color for browser, ANSI color name for cli/consoleui)\n\t\"BarColor\": \"#4A90D9\",\n\n\t// Color of selected bars\n\t\"SelectedBarColor\": \"#2ECC71\",\n\n\t// Color of bars in the selection range\n\t\"SelectionRangeColor\": \"#85C1E9\",\n\n\t// --- Selection Configuration ---\n\n\t// Enable selection mode\n\t\"Selectable\": false,\n\n\t// Selection mode: \"single\", \"multiple\", \"range\"\n\t// \"single\" - click to select one bar\n\t// \"multiple\" - click to toggle individual bars\n\t// \"range\" - drag sliders to select a contiguous range of bins\n\t\"SelectionMode\": \"range\",\n\n\t// Address in AppData to write selection state\n\t// Will contain { SelectedIndices: [], RangeStart: N, RangeEnd: N } or similar\n\t\"SelectionDataAddress\": false,\n\n\t// Initial selection (array of indices or { Start, End } for range mode)\n\t\"InitialSelection\": null,\n\n\t// --- CLI/ConsoleUI Configuration ---\n\n\t// Characters used for rendering in text mode\n\t\"BarCharacter\": \"\\u2588\",\n\t\"BarPartialCharacters\": [\" \", \"\\u2581\", \"\\u2582\", \"\\u2583\", \"\\u2584\", \"\\u2585\", \"\\u2586\", \"\\u2587\", \"\\u2588\"],\n\t\"EmptyCharacter\": \" \",\n\t\"SliderCharacter\": \"\\u2502\",\n\t\"SliderHandleCharacter\": \"\\u25C6\",\n\n\t// Width of the histogram in characters (cli/consoleui)\n\t\"TextWidth\": 60,\n\n\t// Height of the histogram in characters (cli/consoleui vertical)\n\t\"TextHeight\": 15,\n\n\t// --- CSS ---\n\t\"CSS\": `.pict-histogram-container\n{\n\tdisplay: inline-block;\n\tposition: relative;\n\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n\tfont-size: 12px;\n\tuser-select: none;\n}\n.pict-histogram-chart\n{\n\tdisplay: flex;\n\talign-items: flex-end;\n\tposition: relative;\n}\n.pict-histogram-container.pict-histogram-horizontal\n{\n\tdisplay: inline-flex;\n\tflex-direction: row;\n\talign-items: stretch;\n}\n.pict-histogram-chart.pict-histogram-horizontal\n{\n\tflex-direction: column;\n\talign-items: flex-start;\n}\n.pict-histogram-bar-group\n{\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tcursor: default;\n\tflex-shrink: 0;\n}\n.pict-histogram-horizontal .pict-histogram-bar-group\n{\n\tflex-direction: row;\n\talign-items: center;\n}\n.pict-histogram-bar\n{\n\ttransition: background-color 0.15s ease, height 0.2s ease, width 0.2s ease;\n\tborder-radius: 2px 2px 0 0;\n\tmin-width: 1px;\n\tmin-height: 1px;\n}\n.pict-histogram-horizontal .pict-histogram-bar\n{\n\tborder-radius: 0 2px 2px 0;\n}\n.pict-histogram-bar.pict-histogram-selectable\n{\n\tcursor: pointer;\n}\n.pict-histogram-bar.pict-histogram-selectable:hover\n{\n\topacity: 0.8;\n}\n.pict-histogram-bar.pict-histogram-selected\n{\n\tbox-shadow: 0 0 0 2px rgba(46, 204, 113, 0.4);\n}\n.pict-histogram-bar.pict-histogram-in-range\n{\n\topacity: 0.9;\n}\n.pict-histogram-value-label\n{\n\ttext-align: center;\n\tcolor: #666;\n\tfont-size: 11px;\n\tpadding: 2px 0;\n\twhite-space: nowrap;\n}\n.pict-histogram-horizontal .pict-histogram-value-label\n{\n\tpadding: 0 4px;\n}\n.pict-histogram-bin-label\n{\n\ttext-align: center;\n\tcolor: #333;\n\tfont-size: 11px;\n\tpadding: 4px 2px 0 2px;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.pict-histogram-horizontal .pict-histogram-bin-label\n{\n\tpadding: 0 4px 0 0;\n\ttext-align: right;\n\tmin-width: 40px;\n}\n.pict-histogram-range-slider-container\n{\n\tposition: relative;\n\twidth: 100%;\n\theight: 24px;\n\tmargin-top: 4px;\n}\n.pict-histogram-horizontal .pict-histogram-range-slider-container\n{\n\twidth: 24px;\n\theight: auto;\n\talign-self: stretch;\n\tmargin-top: 0;\n\tmargin-left: 4px;\n}\n.pict-histogram-range-track\n{\n\tposition: absolute;\n\ttop: 10px;\n\tleft: 0;\n\tright: 0;\n\theight: 4px;\n\tbackground: #E0E0E0;\n\tborder-radius: 2px;\n}\n.pict-histogram-horizontal .pict-histogram-range-track\n{\n\ttop: 0;\n\tleft: 10px;\n\tright: auto;\n\tbottom: 0;\n\twidth: 4px;\n\theight: auto;\n}\n.pict-histogram-range-fill\n{\n\tposition: absolute;\n\ttop: 10px;\n\theight: 4px;\n\tbackground: #4A90D9;\n\tborder-radius: 2px;\n}\n.pict-histogram-horizontal .pict-histogram-range-fill\n{\n\ttop: auto;\n\tleft: 10px;\n\twidth: 4px;\n\theight: auto;\n}\n.pict-histogram-range-handle\n{\n\tposition: absolute;\n\ttop: 4px;\n\twidth: 16px;\n\theight: 16px;\n\tbackground: #fff;\n\tborder: 2px solid #4A90D9;\n\tborder-radius: 50%;\n\tcursor: grab;\n\tz-index: 2;\n\ttransform: translateX(-50%);\n}\n.pict-histogram-horizontal .pict-histogram-range-handle\n{\n\ttop: auto;\n\tleft: 4px;\n\ttransform: translateY(-50%);\n}\n.pict-histogram-range-handle:active\n{\n\tcursor: grabbing;\n\tbackground: #4A90D9;\n}\n.pict-histogram-range-handle:active,\n.pict-histogram-range-handle:focus\n{\n\tbox-shadow: 0 0 0 3px rgba(74, 144, 217, 0.3);\n\toutline: none;\n}\n.pict-histogram-container.pict-histogram-fill\n{\n\tdisplay: block;\n\twidth: 100%;\n}\n.pict-histogram-fill .pict-histogram-chart\n{\n\twidth: 100%;\n}\n.pict-histogram-fill .pict-histogram-bar-group\n{\n\tflex: 1 1 0%;\n\tmin-width: 0;\n}\n.pict-histogram-fill .pict-histogram-bar\n{\n\twidth: 100%;\n}\n.pict-histogram-axis-line\n{\n\twidth: 100%;\n\theight: 1px;\n\tbackground: #ccc;\n}\n.pict-histogram-label-row\n{\n\tdisplay: flex;\n\twidth: 100%;\n}\n.pict-histogram-fill-label\n{\n\tfont-size: 10px;\n\tcolor: #666;\n\ttext-align: center;\n\twhite-space: nowrap;\n\toverflow: visible;\n\tline-height: 16px;\n}\n`\n});\n","/**\n * Pict Section Histogram\n *\n * A histogram visualization section for the Pict MVC framework.\n *\n * Supports:\n * - Vertical and horizontal orientation\n * - Three render modes: browser (HTML/CSS), consoleui (blessed), cli (ANSI)\n * - Interactive selection: single click, multi-select, or range slider\n * - Data binding via Pict AppData addresses\n *\n * @module pict-section-histogram\n */\n\nconst libPictViewClass = require('pict-view');\nconst _DefaultConfiguration = require('./Pict-Section-Histogram-DefaultConfiguration.js');\n\nconst libRendererBrowser = require('./renderers/Pict-Histogram-Renderer-Browser.js');\nconst libRendererConsoleUI = require('./renderers/Pict-Histogram-Renderer-ConsoleUI.js');\nconst libRendererCLI = require('./renderers/Pict-Histogram-Renderer-CLI.js');\n\nclass PictSectionHistogram extends libPictViewClass\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tlet tmpOptions = Object.assign({}, _DefaultConfiguration, pOptions);\n\t\tsuper(pFable, tmpOptions, pServiceHash);\n\n\t\tthis.initialRenderComplete = false;\n\n\t\t// --- Selection State ---\n\n\t\t// Set of selected bin indices (for \"single\" and \"multiple\" modes)\n\t\tthis._selectedIndices = new Set();\n\n\t\t// Range bounds (for \"range\" mode)\n\t\tthis._selectionRangeStart = 0;\n\t\tthis._selectionRangeEnd = 0;\n\n\t\t// Resolve the renderer for the configured mode\n\t\tthis._renderer = this._resolveRenderer();\n\n\t\t// Apply initial selection if provided\n\t\tthis._applyInitialSelection();\n\t}\n\n\t/**\n\t * Set up the initial selection state from options.\n\t */\n\t_applyInitialSelection()\n\t{\n\t\tif (this.options.InitialSelection)\n\t\t{\n\t\t\tthis.setSelection(this.options.InitialSelection);\n\t\t}\n\t\telse if (this.options.Selectable && this.options.SelectionMode === 'range')\n\t\t{\n\t\t\t// Default: select all bins\n\t\t\tlet tmpBins = this.getBins();\n\t\t\tthis._selectionRangeStart = 0;\n\t\t\tthis._selectionRangeEnd = Math.max(0, tmpBins.length - 1);\n\t\t\tthis._syncSelectionFromRange();\n\t\t}\n\t}\n\n\t/**\n\t * Pick the renderer module based on RenderMode option.\n\t *\n\t * @returns {object} The renderer module { render, wireEvents }\n\t */\n\t_resolveRenderer()\n\t{\n\t\tswitch (this.options.RenderMode)\n\t\t{\n\t\t\tcase 'consoleui':\n\t\t\t\treturn libRendererConsoleUI;\n\t\t\tcase 'cli':\n\t\t\t\treturn libRendererCLI;\n\t\t\tcase 'browser':\n\t\t\tdefault:\n\t\t\t\treturn libRendererBrowser;\n\t\t}\n\t}\n\n\t// --- Data Access ---\n\n\t/**\n\t * Get the current bin data array.\n\t *\n\t * Reads from the configured DataAddress in AppData, falling back to\n\t * the static Bins option.\n\t *\n\t * @returns {Array} Array of bin objects\n\t */\n\tgetBins()\n\t{\n\t\tif (this.options.DataAddress)\n\t\t{\n\t\t\tconst tmpAddressSpace =\n\t\t\t{\n\t\t\t\tFable: this.fable,\n\t\t\t\tPict: this.fable,\n\t\t\t\tAppData: this.AppData,\n\t\t\t\tBundle: this.Bundle,\n\t\t\t\tOptions: this.options\n\t\t\t};\n\t\t\tlet tmpData = this.fable.manifest.getValueByHash(tmpAddressSpace, this.options.DataAddress);\n\t\t\tif (Array.isArray(tmpData))\n\t\t\t{\n\t\t\t\treturn tmpData;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.log.warn(`PICT-Histogram DataAddress [${this.options.DataAddress}] did not return an array.`);\n\t\t\t}\n\t\t}\n\n\t\treturn this.options.Bins || [];\n\t}\n\n\t/**\n\t * Set the bins programmatically (updates the Bins option).\n\t *\n\t * @param {Array} pBins - Array of bin objects { Label, Value, ... }\n\t */\n\tsetBins(pBins)\n\t{\n\t\tif (!Array.isArray(pBins))\n\t\t{\n\t\t\tthis.log.warn('PICT-Histogram setBins requires an array.');\n\t\t\treturn;\n\t\t}\n\t\tthis.options.Bins = pBins;\n\n\t\t// If we also have a DataAddress, write through\n\t\tif (this.options.DataAddress)\n\t\t{\n\t\t\tconst tmpAddressSpace =\n\t\t\t{\n\t\t\t\tFable: this.fable,\n\t\t\t\tPict: this.fable,\n\t\t\t\tAppData: this.AppData,\n\t\t\t\tBundle: this.Bundle,\n\t\t\t\tOptions: this.options\n\t\t\t};\n\t\t\tthis.fable.manifest.setValueByHash(tmpAddressSpace, this.options.DataAddress, pBins);\n\t\t}\n\t}\n\n\t// --- Selection Logic ---\n\n\t/**\n\t * Check whether a bin index is currently selected.\n\t *\n\t * @param {number} pIndex\n\t * @returns {boolean}\n\t */\n\tisIndexSelected(pIndex)\n\t{\n\t\tif (!this.options.Selectable)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.options.SelectionMode === 'range')\n\t\t{\n\t\t\treturn (pIndex === this._selectionRangeStart || pIndex === this._selectionRangeEnd);\n\t\t}\n\n\t\treturn this._selectedIndices.has(pIndex);\n\t}\n\n\t/**\n\t * Check whether a bin index falls within the current range selection\n\t * (but is not one of the range endpoints).\n\t *\n\t * @param {number} pIndex\n\t * @returns {boolean}\n\t */\n\tisIndexInRange(pIndex)\n\t{\n\t\tif (!this.options.Selectable || this.options.SelectionMode !== 'range')\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn (pIndex > this._selectionRangeStart && pIndex < this._selectionRangeEnd);\n\t}\n\n\t/**\n\t * Get the current selection state.\n\t *\n\t * @returns {object} Selection descriptor\n\t */\n\tgetSelection()\n\t{\n\t\tif (this.options.SelectionMode === 'range')\n\t\t{\n\t\t\tlet tmpBins = this.getBins();\n\t\t\tlet tmpIndices = [];\n\t\t\tfor (let i = this._selectionRangeStart; i <= this._selectionRangeEnd; i++)\n\t\t\t{\n\t\t\t\ttmpIndices.push(i);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tMode: 'range',\n\t\t\t\tRangeStart: this._selectionRangeStart,\n\t\t\t\tRangeEnd: this._selectionRangeEnd,\n\t\t\t\tSelectedIndices: tmpIndices,\n\t\t\t\tStartLabel: (tmpBins[this._selectionRangeStart] || {})[this.options.LabelProperty],\n\t\t\t\tEndLabel: (tmpBins[this._selectionRangeEnd] || {})[this.options.LabelProperty]\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn {\n\t\t\t\tMode: this.options.SelectionMode,\n\t\t\t\tSelectedIndices: Array.from(this._selectedIndices).sort((a, b) => a - b)\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Programmatically set the selection.\n\t *\n\t * @param {object|Array} pSelection - For range: { Start, End }; for single/multiple: array of indices\n\t */\n\tsetSelection(pSelection)\n\t{\n\t\tif (this.options.SelectionMode === 'range')\n\t\t{\n\t\t\tif (pSelection && typeof (pSelection.Start) === 'number' && typeof (pSelection.End) === 'number')\n\t\t\t{\n\t\t\t\tthis._selectionRangeStart = pSelection.Start;\n\t\t\t\tthis._selectionRangeEnd = pSelection.End;\n\t\t\t\tthis._syncSelectionFromRange();\n\t\t\t}\n\t\t}\n\t\telse if (Array.isArray(pSelection))\n\t\t{\n\t\t\tthis._selectedIndices = new Set(pSelection);\n\t\t}\n\n\t\tthis._writeSelectionToAddress();\n\t}\n\n\t/**\n\t * Handle a bar click in single or multiple selection mode.\n\t *\n\t * @param {number} pIndex - The clicked bin index\n\t */\n\thandleBarClick(pIndex)\n\t{\n\t\tif (this.options.SelectionMode === 'single')\n\t\t{\n\t\t\tthis._selectedIndices.clear();\n\t\t\tthis._selectedIndices.add(pIndex);\n\t\t}\n\t\telse if (this.options.SelectionMode === 'multiple')\n\t\t{\n\t\t\tif (this._selectedIndices.has(pIndex))\n\t\t\t{\n\t\t\t\tthis._selectedIndices.delete(pIndex);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis._selectedIndices.add(pIndex);\n\t\t\t}\n\t\t}\n\n\t\tthis._writeSelectionToAddress();\n\t\tthis.onSelectionChange(this.getSelection());\n\t\tthis.renderHistogram();\n\t}\n\n\t/**\n\t * Handle a bar click in range mode — moves the nearest handle.\n\t *\n\t * @param {number} pIndex - The clicked bin index\n\t */\n\thandleRangeBarClick(pIndex)\n\t{\n\t\tlet tmpDistStart = Math.abs(pIndex - this._selectionRangeStart);\n\t\tlet tmpDistEnd = Math.abs(pIndex - this._selectionRangeEnd);\n\n\t\tif (tmpDistStart <= tmpDistEnd)\n\t\t{\n\t\t\tthis._selectionRangeStart = Math.min(pIndex, this._selectionRangeEnd);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._selectionRangeEnd = Math.max(pIndex, this._selectionRangeStart);\n\t\t}\n\n\t\tthis._syncSelectionFromRange();\n\t\tthis._writeSelectionToAddress();\n\t\tthis.onSelectionChange(this.getSelection());\n\t\tthis.renderHistogram();\n\t}\n\n\t/**\n\t * Sync _selectedIndices from the range bounds (so getSelection is consistent).\n\t */\n\t_syncSelectionFromRange()\n\t{\n\t\tthis._selectedIndices.clear();\n\t\tfor (let i = this._selectionRangeStart; i <= this._selectionRangeEnd; i++)\n\t\t{\n\t\t\tthis._selectedIndices.add(i);\n\t\t}\n\t}\n\n\t/**\n\t * Write the current selection state to the configured SelectionDataAddress.\n\t */\n\t_writeSelectionToAddress()\n\t{\n\t\tif (!this.options.SelectionDataAddress)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst tmpAddressSpace =\n\t\t{\n\t\t\tFable: this.fable,\n\t\t\tPict: this.fable,\n\t\t\tAppData: this.AppData,\n\t\t\tBundle: this.Bundle,\n\t\t\tOptions: this.options\n\t\t};\n\n\t\tthis.fable.manifest.setValueByHash(tmpAddressSpace, this.options.SelectionDataAddress, this.getSelection());\n\t}\n\n\t/**\n\t * Hook for subclasses or consumers to react to selection changes.\n\t *\n\t * @param {object} pSelection - The new selection state\n\t */\n\tonSelectionChange(pSelection)\n\t{\n\t\t// Override in subclass or assign externally\n\t}\n\n\t// --- Lifecycle Hooks ---\n\n\tonBeforeInitialize()\n\t{\n\t\tsuper.onBeforeInitialize();\n\t\treturn super.onBeforeInitialize();\n\t}\n\n\tonAfterRender(pRenderable)\n\t{\n\t\t// Inject CSS\n\t\tthis.pict.CSSMap.injectCSS();\n\n\t\tif (!this.initialRenderComplete)\n\t\t{\n\t\t\tthis.onAfterInitialRender();\n\t\t\tthis.initialRenderComplete = true;\n\t\t}\n\n\t\treturn super.onAfterRender(pRenderable);\n\t}\n\n\tonAfterInitialRender()\n\t{\n\t\tthis.renderHistogram();\n\t}\n\n\t/**\n\t * Render the histogram using the active renderer and wire events.\n\t */\n\trenderHistogram()\n\t{\n\t\t// Ensure CSS is injected (covers both lifecycle and direct calls)\n\t\tif (this.pict.CSSMap)\n\t\t{\n\t\t\tthis.pict.CSSMap.injectCSS();\n\t\t}\n\t\tthis._renderer.render(this);\n\t\tthis._renderer.wireEvents(this);\n\t\tthis.initialRenderComplete = true;\n\t}\n\n\t// --- Data Marshaling ---\n\n\tmarshalToView()\n\t{\n\t\tsuper.marshalToView();\n\t\tif (this.initialRenderComplete)\n\t\t{\n\t\t\tthis.renderHistogram();\n\t\t}\n\t}\n\n\tmarshalFromView()\n\t{\n\t\tsuper.marshalFromView();\n\t\tthis._writeSelectionToAddress();\n\t}\n\n\t// --- Public API ---\n\n\t/**\n\t * Change the orientation and re-render.\n\t *\n\t * @param {string} pOrientation - \"vertical\" or \"horizontal\"\n\t */\n\tsetOrientation(pOrientation)\n\t{\n\t\tif (pOrientation !== 'vertical' && pOrientation !== 'horizontal')\n\t\t{\n\t\t\tthis.log.warn(`PICT-Histogram invalid orientation: ${pOrientation}`);\n\t\t\treturn;\n\t\t}\n\t\tthis.options.Orientation = pOrientation;\n\t\tif (this.initialRenderComplete)\n\t\t{\n\t\t\tthis.renderHistogram();\n\t\t}\n\t}\n\n\t/**\n\t * Change the render mode and re-render.\n\t *\n\t * @param {string} pRenderMode - \"browser\", \"consoleui\", or \"cli\"\n\t */\n\tsetRenderMode(pRenderMode)\n\t{\n\t\tthis.options.RenderMode = pRenderMode;\n\t\tthis._renderer = this._resolveRenderer();\n\t\tif (this.initialRenderComplete)\n\t\t{\n\t\t\tthis.renderHistogram();\n\t\t}\n\t}\n\n\t/**\n\t * Convenience: get the text representation (useful for CLI/consoleui).\n\t *\n\t * @returns {string}\n\t */\n\ttoText()\n\t{\n\t\tif (this.options.Orientation === 'vertical')\n\t\t{\n\t\t\treturn libRendererConsoleUI.renderVertical(this);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn libRendererConsoleUI.renderHorizontal(this);\n\t\t}\n\t}\n}\n\nmodule.exports = PictSectionHistogram;\n\nmodule.exports.default_configuration = _DefaultConfiguration;\nmodule.exports.renderers = {\n\tbrowser: libRendererBrowser,\n\tconsoleui: libRendererConsoleUI,\n\tcli: libRendererCLI\n};\n","/**\n * Browser renderer for pict-section-histogram.\n *\n * Renders the histogram as HTML/CSS elements using the Pict ContentAssignment\n * pipeline. Also wires up interactive selection (click, drag-slider) via\n * DOM event listeners.\n *\n * @module Pict-Histogram-Renderer-Browser\n */\n\n/**\n * Build the HTML string for a single bar group (bar + optional labels).\n *\n * @param {object} pBin - The bin data { Label, Value, ... }\n * @param {number} pIndex - Index of the bin\n * @param {number} pBarSize - Computed bar size in pixels\n * @param {object} pOptions - View options\n * @param {boolean} pIsSelected - Whether this bin is selected\n * @param {boolean} pInRange - Whether this bin is inside the range selection\n * @param {number} pLabelWidth - Fixed label width in pixels (horizontal mode)\n * @returns {string} HTML fragment\n */\nfunction buildBarGroupHTML(pBin, pIndex, pBarSize, pOptions, pIsSelected, pInRange, pLabelWidth)\n{\n\tlet tmpLabel = pBin[pOptions.LabelProperty] || '';\n\tlet tmpValue = pBin[pOptions.ValueProperty] || 0;\n\tlet tmpVertical = (pOptions.Orientation === 'vertical');\n\tlet tmpBarColor = pIsSelected ? pOptions.SelectedBarColor\n\t\t: pInRange ? pOptions.SelectionRangeColor\n\t\t: pOptions.BarColor;\n\n\tlet tmpSelectableClass = pOptions.Selectable ? ' pict-histogram-selectable' : '';\n\tlet tmpSelectedClass = pIsSelected ? ' pict-histogram-selected' : '';\n\tlet tmpInRangeClass = pInRange ? ' pict-histogram-in-range' : '';\n\n\tlet tmpFillMode = pOptions.FillContainer;\n\n\tlet tmpBarStyle = '';\n\tif (tmpVertical)\n\t{\n\t\tif (tmpFillMode)\n\t\t{\n\t\t\ttmpBarStyle = `height:${pBarSize}px;background-color:${tmpBarColor};`;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpBarStyle = `height:${pBarSize}px;width:${pOptions.BarThickness}px;background-color:${tmpBarColor};`;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (tmpFillMode)\n\t\t{\n\t\t\ttmpBarStyle = `width:${pBarSize}px;background-color:${tmpBarColor};`;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpBarStyle = `width:${pBarSize}px;height:${pOptions.BarThickness}px;background-color:${tmpBarColor};`;\n\t\t}\n\t}\n\n\tlet tmpGroupWidth = pOptions.BarThickness + pOptions.BarGap;\n\tlet tmpGroupStyle = '';\n\tif (tmpFillMode)\n\t{\n\t\t// No fixed dimensions — CSS flex:1 handles sizing\n\t\ttmpGroupStyle = '';\n\t}\n\telse if (tmpVertical)\n\t{\n\t\ttmpGroupStyle = `margin:0 ${pOptions.BarGap / 2}px;width:${tmpGroupWidth}px;`;\n\t}\n\telse\n\t{\n\t\ttmpGroupStyle = `margin:${pOptions.BarGap / 2}px 0;`;\n\t}\n\n\tlet tmpHTML = `<div class=\"pict-histogram-bar-group\" style=\"${tmpGroupStyle}\" data-histogram-index=\"${pIndex}\">`;\n\n\tif (tmpVertical)\n\t{\n\t\t// Value label above bar (skipped in fill mode — values don't fit in narrow columns)\n\t\tif (pOptions.ShowValues && !tmpFillMode)\n\t\t{\n\t\t\ttmpHTML += `<div class=\"pict-histogram-value-label\" style=\"width:${tmpGroupWidth}px;\">${tmpValue}</div>`;\n\t\t}\n\t\t// Bar\n\t\ttmpHTML += `<div class=\"pict-histogram-bar${tmpSelectableClass}${tmpSelectedClass}${tmpInRangeClass}\" style=\"${tmpBarStyle}\" data-histogram-index=\"${pIndex}\"></div>`;\n\t\t// Bin label below bar (skipped in fill mode — labels rendered in a separate row)\n\t\tif (pOptions.ShowLabels && !tmpFillMode)\n\t\t{\n\t\t\ttmpHTML += `<div class=\"pict-histogram-bin-label\" style=\"width:${tmpGroupWidth}px;\">${tmpLabel}</div>`;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Bin label to the left (fixed width so bars align)\n\t\tif (pOptions.ShowLabels)\n\t\t{\n\t\t\tlet tmpLabelStyle = pLabelWidth ? `width:${pLabelWidth}px;min-width:${pLabelWidth}px;` : '';\n\t\t\ttmpHTML += `<div class=\"pict-histogram-bin-label\" style=\"${tmpLabelStyle}\">${tmpLabel}</div>`;\n\t\t}\n\t\t// Bar\n\t\ttmpHTML += `<div class=\"pict-histogram-bar${tmpSelectableClass}${tmpSelectedClass}${tmpInRangeClass}\" style=\"${tmpBarStyle}\" data-histogram-index=\"${pIndex}\"></div>`;\n\t\t// Value label to the right\n\t\tif (pOptions.ShowValues)\n\t\t{\n\t\t\ttmpHTML += `<div class=\"pict-histogram-value-label\">${tmpValue}</div>`;\n\t\t}\n\t}\n\n\ttmpHTML += '</div>';\n\treturn tmpHTML;\n}\n\n/**\n * Build the HTML for the range-slider overlay (used in \"range\" selection mode).\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} HTML fragment\n */\nfunction buildRangeSliderHTML(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '';\n\t}\n\n\tlet tmpRangeStart = pView._selectionRangeStart;\n\tlet tmpRangeEnd = pView._selectionRangeEnd;\n\tlet tmpMax = tmpBins.length - 1;\n\n\t// Calculate percentage positions for the handles\n\tlet tmpStartPct = (tmpMax > 0) ? ((tmpRangeStart / tmpMax) * 100) : 0;\n\tlet tmpEndPct = (tmpMax > 0) ? ((tmpRangeEnd / tmpMax) * 100) : 100;\n\n\tlet tmpVertical = (pView.options.Orientation === 'vertical');\n\n\tlet tmpHTML = '<div class=\"pict-histogram-range-slider-container\">';\n\ttmpHTML += '<div class=\"pict-histogram-range-track\"></div>';\n\n\tif (tmpVertical)\n\t{\n\t\ttmpHTML += `<div class=\"pict-histogram-range-fill\" style=\"left:${tmpStartPct}%;right:${100 - tmpEndPct}%;\"></div>`;\n\t\ttmpHTML += `<div class=\"pict-histogram-range-handle pict-histogram-range-handle-start\" tabindex=\"0\" style=\"left:${tmpStartPct}%;\" data-handle=\"start\"></div>`;\n\t\ttmpHTML += `<div class=\"pict-histogram-range-handle pict-histogram-range-handle-end\" tabindex=\"0\" style=\"left:${tmpEndPct}%;\" data-handle=\"end\"></div>`;\n\t}\n\telse\n\t{\n\t\ttmpHTML += `<div class=\"pict-histogram-range-fill\" style=\"top:${tmpStartPct}%;bottom:${100 - tmpEndPct}%;\"></div>`;\n\t\ttmpHTML += `<div class=\"pict-histogram-range-handle pict-histogram-range-handle-start\" tabindex=\"0\" style=\"top:${tmpStartPct}%;\" data-handle=\"start\"></div>`;\n\t\ttmpHTML += `<div class=\"pict-histogram-range-handle pict-histogram-range-handle-end\" tabindex=\"0\" style=\"top:${tmpEndPct}%;\" data-handle=\"end\"></div>`;\n\t}\n\n\ttmpHTML += '</div>';\n\treturn tmpHTML;\n}\n\n/**\n * Build the label row for FillContainer vertical mode.\n *\n * Labels are rendered in a separate flex row below the axis line, with\n * automatic interval calculation to avoid overlap when there are many bins.\n *\n * @param {object} pView - The histogram view instance\n * @param {Array} pBins - The bin data array\n * @returns {string} HTML fragment\n */\nfunction buildFillLabelRow(pView, pBins)\n{\n\tif (!pBins || pBins.length === 0)\n\t{\n\t\treturn '';\n\t}\n\n\t// Determine label interval: explicit setting or auto-compute\n\tlet tmpLabelInterval = pView.options.LabelInterval || 0;\n\tif (tmpLabelInterval <= 0)\n\t{\n\t\t// Auto-compute: space labels approximately 80px apart\n\t\tlet tmpTargetElementSet = pView.services.ContentAssignment.getElement(pView.options.TargetElementAddress);\n\t\tlet tmpContainerWidth = 800;\n\t\tif (tmpTargetElementSet && tmpTargetElementSet.length > 0 && tmpTargetElementSet[0])\n\t\t{\n\t\t\ttmpContainerWidth = tmpTargetElementSet[0].clientWidth || 800;\n\t\t}\n\t\tif (pBins.length > 0)\n\t\t{\n\t\t\tlet tmpBarWidth = tmpContainerWidth / pBins.length;\n\t\t\ttmpLabelInterval = Math.max(1, Math.ceil(80 / tmpBarWidth));\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpLabelInterval = 1;\n\t\t}\n\t}\n\n\tlet tmpHTML = '<div class=\"pict-histogram-label-row\">';\n\n\tfor (let i = 0; i < pBins.length; i++)\n\t{\n\t\tlet tmpIsLabeled = (i % tmpLabelInterval === 0);\n\t\tif (tmpIsLabeled)\n\t\t{\n\t\t\tlet tmpLabel = pBins[i][pView.options.LabelProperty] || '';\n\t\t\t// Span covers this label and the unlabeled bars until the next label\n\t\t\tlet tmpSpan = Math.min(tmpLabelInterval, pBins.length - i);\n\t\t\ttmpHTML += `<div class=\"pict-histogram-fill-label\" style=\"flex:${tmpSpan};\">${tmpLabel}</div>`;\n\t\t\ti += tmpSpan - 1;\n\t\t}\n\t}\n\n\ttmpHTML += '</div>';\n\treturn tmpHTML;\n}\n\n/**\n * Render the full histogram into the target element.\n *\n * @param {object} pView - The histogram view instance\n */\nfunction render(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\tpView.services.ContentAssignment.assignContent(\n\t\t\tpView.options.TargetElementAddress,\n\t\t\t'<div class=\"pict-histogram-container\"><em>No histogram data</em></div>'\n\t\t);\n\t\treturn;\n\t}\n\n\tlet tmpMaxValue = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][pView.options.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\tlet tmpVertical = (pView.options.Orientation === 'vertical');\n\tlet tmpOrientationClass = tmpVertical ? 'pict-histogram-vertical' : 'pict-histogram-horizontal';\n\tlet tmpFillClass = pView.options.FillContainer ? ' pict-histogram-fill' : '';\n\n\t// For horizontal mode (non-fill), measure the longest label so all labels share the same width\n\tlet tmpLabelWidth = 0;\n\tif (!tmpVertical && pView.options.ShowLabels && !pView.options.FillContainer)\n\t{\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpLabel = String(tmpBins[i][pView.options.LabelProperty] || '');\n\t\t\t// Approximate character width at 11px font: ~6.5px per character\n\t\t\tlet tmpEstWidth = tmpLabel.length * 6.5 + 8;\n\t\t\tif (tmpEstWidth > tmpLabelWidth)\n\t\t\t{\n\t\t\t\ttmpLabelWidth = tmpEstWidth;\n\t\t\t}\n\t\t}\n\t\ttmpLabelWidth = Math.max(tmpLabelWidth, 40);\n\t}\n\n\tlet tmpHTML = `<div class=\"pict-histogram-container ${tmpOrientationClass}${tmpFillClass}\">`;\n\ttmpHTML += `<div class=\"pict-histogram-chart ${tmpOrientationClass}${tmpFillClass}\">`;\n\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][pView.options.ValueProperty] || 0;\n\t\tlet tmpBarSize = Math.round((tmpVal / tmpMaxValue) * pView.options.MaxBarSize);\n\t\tif (tmpVal > 0 && tmpBarSize < 1)\n\t\t{\n\t\t\ttmpBarSize = 1;\n\t\t}\n\n\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\n\t\ttmpHTML += buildBarGroupHTML(tmpBins[i], i, tmpBarSize, pView.options, tmpIsSelected, tmpInRange, tmpLabelWidth);\n\t}\n\n\ttmpHTML += '</div>';\n\n\t// In FillContainer vertical mode, render axis line and label row separately\n\tif (pView.options.FillContainer && tmpVertical && pView.options.ShowLabels)\n\t{\n\t\ttmpHTML += '<div class=\"pict-histogram-axis-line\"></div>';\n\t\ttmpHTML += buildFillLabelRow(pView, tmpBins);\n\t}\n\n\t// Range slider for \"range\" selection mode\n\tif (pView.options.Selectable && pView.options.SelectionMode === 'range')\n\t{\n\t\ttmpHTML += buildRangeSliderHTML(pView);\n\t}\n\n\ttmpHTML += '</div>';\n\n\tpView.services.ContentAssignment.assignContent(pView.options.TargetElementAddress, tmpHTML);\n}\n\n/**\n * Wire up DOM event listeners for interactivity (click selection, range drag).\n *\n * @param {object} pView - The histogram view instance\n */\nfunction wireEvents(pView)\n{\n\tif (!pView.options.Selectable)\n\t{\n\t\treturn;\n\t}\n\n\tlet tmpTargetElementSet = pView.services.ContentAssignment.getElement(pView.options.TargetElementAddress);\n\tif (!tmpTargetElementSet || tmpTargetElementSet.length < 1)\n\t{\n\t\treturn;\n\t}\n\tlet tmpContainer = tmpTargetElementSet[0];\n\tif (!tmpContainer)\n\t{\n\t\treturn;\n\t}\n\n\t// --- Bar click selection (single / multiple modes) ---\n\tif (pView.options.SelectionMode === 'single' || pView.options.SelectionMode === 'multiple')\n\t{\n\t\tlet tmpBars = tmpContainer.querySelectorAll('.pict-histogram-bar[data-histogram-index]');\n\t\tfor (let i = 0; i < tmpBars.length; i++)\n\t\t{\n\t\t\ttmpBars[i].addEventListener('click', (pEvent) =>\n\t\t\t{\n\t\t\t\tlet tmpIndex = parseInt(pEvent.currentTarget.getAttribute('data-histogram-index'), 10);\n\t\t\t\tif (isNaN(tmpIndex))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpView.handleBarClick(tmpIndex);\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Range slider drag ---\n\tif (pView.options.SelectionMode === 'range')\n\t{\n\t\t// Also allow clicking bars to move nearest handle\n\t\tlet tmpBars = tmpContainer.querySelectorAll('.pict-histogram-bar[data-histogram-index]');\n\t\tfor (let i = 0; i < tmpBars.length; i++)\n\t\t{\n\t\t\ttmpBars[i].addEventListener('click', (pEvent) =>\n\t\t\t{\n\t\t\t\tlet tmpIndex = parseInt(pEvent.currentTarget.getAttribute('data-histogram-index'), 10);\n\t\t\t\tif (isNaN(tmpIndex))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpView.handleRangeBarClick(tmpIndex);\n\t\t\t});\n\t\t}\n\n\t\tlet tmpHandles = tmpContainer.querySelectorAll('.pict-histogram-range-handle');\n\t\tfor (let i = 0; i < tmpHandles.length; i++)\n\t\t{\n\t\t\twireRangeHandle(pView, tmpHandles[i], tmpContainer);\n\t\t}\n\t}\n}\n\n/**\n * Wire drag behavior on a single range handle element.\n *\n * @param {object} pView - The histogram view instance\n * @param {Element} pHandle - The handle DOM element\n * @param {Element} pContainer - The histogram container element\n */\nfunction wireRangeHandle(pView, pHandle, pContainer)\n{\n\tlet tmpHandleType = pHandle.getAttribute('data-handle'); // \"start\" or \"end\"\n\tlet tmpVertical = (pView.options.Orientation === 'vertical');\n\n\tlet tmpDragging = false;\n\n\tfunction getSliderBounds()\n\t{\n\t\t// Re-query from pContainer every time because renderHistogram() replaces\n\t\t// the inner HTML, detaching any previously-captured slider element.\n\t\tlet tmpSlider = pContainer.querySelector('.pict-histogram-range-slider-container');\n\t\tif (!tmpSlider)\n\t\t{\n\t\t\treturn { start: 0, size: 1 };\n\t\t}\n\t\tlet tmpRect = tmpSlider.getBoundingClientRect();\n\t\tif (tmpVertical)\n\t\t{\n\t\t\treturn { start: tmpRect.left, size: tmpRect.width || 1 };\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn { start: tmpRect.top, size: tmpRect.height || 1 };\n\t\t}\n\t}\n\n\tfunction onPointerMove(pEvent)\n\t{\n\t\tif (!tmpDragging)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpBins = pView.getBins();\n\t\tif (!tmpBins || tmpBins.length === 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpBounds = getSliderBounds();\n\t\tlet tmpPos = tmpVertical ? pEvent.clientX : pEvent.clientY;\n\t\tlet tmpPct = (tmpPos - tmpBounds.start) / tmpBounds.size;\n\t\ttmpPct = Math.max(0, Math.min(1, tmpPct));\n\n\t\tlet tmpIndex = Math.round(tmpPct * (tmpBins.length - 1));\n\n\t\tif (tmpHandleType === 'start')\n\t\t{\n\t\t\tif (tmpIndex > pView._selectionRangeEnd)\n\t\t\t{\n\t\t\t\ttmpIndex = pView._selectionRangeEnd;\n\t\t\t}\n\t\t\tpView._selectionRangeStart = tmpIndex;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (tmpIndex < pView._selectionRangeStart)\n\t\t\t{\n\t\t\t\ttmpIndex = pView._selectionRangeStart;\n\t\t\t}\n\t\t\tpView._selectionRangeEnd = tmpIndex;\n\t\t}\n\n\t\tpView._syncSelectionFromRange();\n\t\tpView.renderHistogram();\n\t}\n\n\tfunction onPointerUp()\n\t{\n\t\tif (!tmpDragging)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\ttmpDragging = false;\n\t\tif (typeof (document) !== 'undefined')\n\t\t{\n\t\t\tdocument.removeEventListener('mousemove', onPointerMove);\n\t\t\tdocument.removeEventListener('mouseup', onPointerUp);\n\t\t}\n\t}\n\n\tpHandle.addEventListener('mousedown', (pEvent) =>\n\t{\n\t\tpEvent.preventDefault();\n\t\ttmpDragging = true;\n\t\tif (typeof (document) !== 'undefined')\n\t\t{\n\t\t\tdocument.addEventListener('mousemove', onPointerMove);\n\t\t\tdocument.addEventListener('mouseup', onPointerUp);\n\t\t}\n\t});\n}\n\nmodule.exports = { render, wireEvents };\n","/**\n * CLI renderer for pict-section-histogram.\n *\n * Renders the histogram as ANSI-colored text written directly to stdout\n * (or through the Pict ContentAssignment pipeline if available).\n *\n * This mode is intended for command-line tools that print histogram output\n * without a full terminal UI framework.\n *\n * @module Pict-Histogram-Renderer-CLI\n */\n\n// ANSI color codes (basic 16-color)\nconst ANSI_COLORS = {\n\t'black': '\\x1b[30m',\n\t'red': '\\x1b[31m',\n\t'green': '\\x1b[32m',\n\t'yellow': '\\x1b[33m',\n\t'blue': '\\x1b[34m',\n\t'magenta': '\\x1b[35m',\n\t'cyan': '\\x1b[36m',\n\t'white': '\\x1b[37m',\n\t'reset': '\\x1b[0m',\n\t'bold': '\\x1b[1m',\n\t'dim': '\\x1b[2m'\n};\n\n/**\n * Map a CSS-ish color string to the nearest ANSI color.\n *\n * @param {string} pColor - A color string (name or hex)\n * @returns {string} ANSI escape code\n */\nfunction colorToAnsi(pColor)\n{\n\tif (!pColor)\n\t{\n\t\treturn ANSI_COLORS.blue;\n\t}\n\n\tlet tmpLower = pColor.toLowerCase();\n\n\t// Direct name match\n\tif (ANSI_COLORS[tmpLower])\n\t{\n\t\treturn ANSI_COLORS[tmpLower];\n\t}\n\n\t// Simple hex-to-nearest mapping\n\tif (tmpLower.charAt(0) === '#' && tmpLower.length >= 7)\n\t{\n\t\tlet tmpR = parseInt(tmpLower.substring(1, 3), 16);\n\t\tlet tmpG = parseInt(tmpLower.substring(3, 5), 16);\n\t\tlet tmpB = parseInt(tmpLower.substring(5, 7), 16);\n\n\t\t// Pick nearest basic color\n\t\tif (tmpG > tmpR && tmpG > tmpB)\n\t\t{\n\t\t\treturn ANSI_COLORS.green;\n\t\t}\n\t\tif (tmpR > tmpG && tmpR > tmpB)\n\t\t{\n\t\t\treturn ANSI_COLORS.red;\n\t\t}\n\t\tif (tmpB > tmpR && tmpB > tmpG)\n\t\t{\n\t\t\treturn ANSI_COLORS.blue;\n\t\t}\n\t\tif (tmpR > 200 && tmpG > 200)\n\t\t{\n\t\t\treturn ANSI_COLORS.yellow;\n\t\t}\n\t\tif (tmpR > 200 && tmpB > 200)\n\t\t{\n\t\t\treturn ANSI_COLORS.magenta;\n\t\t}\n\t\tif (tmpG > 200 && tmpB > 200)\n\t\t{\n\t\t\treturn ANSI_COLORS.cyan;\n\t\t}\n\t}\n\n\treturn ANSI_COLORS.blue;\n}\n\n/**\n * Render a vertical CLI histogram.\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} The ANSI text output\n */\nfunction renderVertical(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tlet tmpOptions = pView.options;\n\tlet tmpHeight = tmpOptions.TextHeight || 15;\n\tlet tmpBarChar = tmpOptions.BarCharacter;\n\tlet tmpPartials = tmpOptions.BarPartialCharacters;\n\tlet tmpBarColor = colorToAnsi(tmpOptions.BarColor);\n\tlet tmpSelectedColor = colorToAnsi(tmpOptions.SelectedBarColor);\n\tlet tmpRangeColor = colorToAnsi(tmpOptions.SelectionRangeColor);\n\tlet tmpReset = ANSI_COLORS.reset;\n\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '(no data)\\n';\n\t}\n\n\tlet tmpMaxValue = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\tlet tmpValueAxisWidth = String(tmpMaxValue).length + 1;\n\tlet tmpLines = [];\n\n\tfor (let tmpRow = tmpHeight; tmpRow >= 1; tmpRow--)\n\t{\n\t\tlet tmpLine = '';\n\n\t\t// Axis labels\n\t\tif (tmpRow === tmpHeight)\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + padLeft(String(tmpMaxValue), tmpValueAxisWidth) + '|' + tmpReset;\n\t\t}\n\t\telse if (tmpRow === 1)\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + padLeft('0', tmpValueAxisWidth) + '|' + tmpReset;\n\t\t}\n\t\telse if (tmpRow === Math.ceil(tmpHeight / 2))\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + padLeft(String(Math.round(tmpMaxValue / 2)), tmpValueAxisWidth) + '|' + tmpReset;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + padLeft('', tmpValueAxisWidth) + '|' + tmpReset;\n\t\t}\n\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\t\tlet tmpBarHeight = (tmpVal / tmpMaxValue) * tmpHeight;\n\t\t\tlet tmpFullRows = Math.floor(tmpBarHeight);\n\t\t\tlet tmpFraction = tmpBarHeight - tmpFullRows;\n\n\t\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\t\t\tlet tmpColor = tmpIsSelected ? tmpSelectedColor : (tmpInRange ? tmpRangeColor : tmpBarColor);\n\n\t\t\tlet tmpChar = ' ';\n\t\t\tif (tmpRow <= tmpFullRows)\n\t\t\t{\n\t\t\t\ttmpChar = tmpBarChar;\n\t\t\t}\n\t\t\telse if (tmpRow === tmpFullRows + 1 && tmpFraction > 0)\n\t\t\t{\n\t\t\t\tlet tmpPartialIndex = Math.round(tmpFraction * (tmpPartials.length - 1));\n\t\t\t\ttmpChar = tmpPartials[tmpPartialIndex];\n\t\t\t}\n\n\t\t\tif (tmpChar !== ' ')\n\t\t\t{\n\t\t\t\ttmpLine += ' ' + tmpColor + tmpChar + tmpChar + tmpChar + tmpReset;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmpLine += ' ';\n\t\t\t}\n\t\t}\n\n\t\ttmpLines.push(tmpLine);\n\t}\n\n\t// Bottom axis\n\tlet tmpAxisLine = ANSI_COLORS.dim + padLeft('', tmpValueAxisWidth) + '+';\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\ttmpAxisLine += '----';\n\t}\n\ttmpAxisLine += tmpReset;\n\ttmpLines.push(tmpAxisLine);\n\n\t// Labels\n\tif (tmpOptions.ShowLabels)\n\t{\n\t\tlet tmpLabelLine = padLeft('', tmpValueAxisWidth) + ' ';\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\t\ttmpLabelLine += padCenter(tmpLabel.substring(0, 4), 4);\n\t\t}\n\t\ttmpLines.push(tmpLabelLine);\n\t}\n\n\t// Range selection info\n\tif (tmpOptions.Selectable && tmpOptions.SelectionMode === 'range')\n\t{\n\t\tlet tmpStart = pView._selectionRangeStart;\n\t\tlet tmpEnd = pView._selectionRangeEnd;\n\t\tlet tmpStartLabel = tmpBins[tmpStart] ? tmpBins[tmpStart][tmpOptions.LabelProperty] : tmpStart;\n\t\tlet tmpEndLabel = tmpBins[tmpEnd] ? tmpBins[tmpEnd][tmpOptions.LabelProperty] : tmpEnd;\n\t\ttmpLines.push('');\n\t\ttmpLines.push(ANSI_COLORS.bold + ' Selection: ' + tmpStartLabel + ' - ' + tmpEndLabel + tmpReset);\n\t}\n\n\treturn tmpLines.join('\\n') + '\\n';\n}\n\n/**\n * Render a horizontal CLI histogram.\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} The ANSI text output\n */\nfunction renderHorizontal(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tlet tmpOptions = pView.options;\n\tlet tmpWidth = tmpOptions.TextWidth || 60;\n\tlet tmpBarChar = tmpOptions.BarCharacter;\n\tlet tmpBarColor = colorToAnsi(tmpOptions.BarColor);\n\tlet tmpSelectedColor = colorToAnsi(tmpOptions.SelectedBarColor);\n\tlet tmpRangeColor = colorToAnsi(tmpOptions.SelectionRangeColor);\n\tlet tmpReset = ANSI_COLORS.reset;\n\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '(no data)\\n';\n\t}\n\n\tlet tmpMaxValue = 0;\n\tlet tmpMaxLabelLen = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\tif (tmpLabel.length > tmpMaxLabelLen)\n\t\t{\n\t\t\ttmpMaxLabelLen = tmpLabel.length;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\tlet tmpLabelWidth = Math.min(tmpMaxLabelLen, 12);\n\tlet tmpValueWidth = String(tmpMaxValue).length;\n\tlet tmpBarWidth = tmpWidth - tmpLabelWidth - tmpValueWidth - 4;\n\tif (tmpBarWidth < 10)\n\t{\n\t\ttmpBarWidth = 10;\n\t}\n\n\tlet tmpLines = [];\n\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\tlet tmpBarLen = Math.round((tmpVal / tmpMaxValue) * tmpBarWidth);\n\n\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\t\tlet tmpColor = tmpIsSelected ? tmpSelectedColor : (tmpInRange ? tmpRangeColor : tmpBarColor);\n\n\t\tlet tmpBar = '';\n\t\tfor (let j = 0; j < tmpBarLen; j++)\n\t\t{\n\t\t\ttmpBar += tmpBarChar;\n\t\t}\n\n\t\tlet tmpLine = ANSI_COLORS.dim + padRight(tmpLabel.substring(0, tmpLabelWidth), tmpLabelWidth) + ' |' + tmpReset;\n\t\ttmpLine += tmpColor + tmpBar + tmpReset;\n\t\ttmpLine += ' ' + tmpVal;\n\n\t\tif (tmpIsSelected)\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.bold + ' *' + tmpReset;\n\t\t}\n\t\telse if (tmpInRange)\n\t\t{\n\t\t\ttmpLine += ANSI_COLORS.dim + ' ~' + tmpReset;\n\t\t}\n\n\t\ttmpLines.push(tmpLine);\n\t}\n\n\t// Range info\n\tif (tmpOptions.Selectable && tmpOptions.SelectionMode === 'range')\n\t{\n\t\tlet tmpStart = pView._selectionRangeStart;\n\t\tlet tmpEnd = pView._selectionRangeEnd;\n\t\tlet tmpStartLabel = tmpBins[tmpStart] ? tmpBins[tmpStart][tmpOptions.LabelProperty] : tmpStart;\n\t\tlet tmpEndLabel = tmpBins[tmpEnd] ? tmpBins[tmpEnd][tmpOptions.LabelProperty] : tmpEnd;\n\t\ttmpLines.push('');\n\t\ttmpLines.push(ANSI_COLORS.bold + ' Selection: ' + tmpStartLabel + ' - ' + tmpEndLabel + tmpReset);\n\t}\n\n\treturn tmpLines.join('\\n') + '\\n';\n}\n\n/**\n * Render in CLI mode. Writes to ContentAssignment if available, otherwise\n * falls back to process.stdout.\n *\n * @param {object} pView - The histogram view instance\n */\nfunction render(pView)\n{\n\tlet tmpText;\n\tif (pView.options.Orientation === 'vertical')\n\t{\n\t\ttmpText = renderVertical(pView);\n\t}\n\telse\n\t{\n\t\ttmpText = renderHorizontal(pView);\n\t}\n\n\t// Try ContentAssignment first (might be mocked in tests or bridged)\n\tif (pView.services && pView.services.ContentAssignment)\n\t{\n\t\tpView.services.ContentAssignment.assignContent(pView.options.TargetElementAddress, tmpText);\n\t}\n\telse if (typeof (process) !== 'undefined' && process.stdout)\n\t{\n\t\tprocess.stdout.write(tmpText);\n\t}\n}\n\n// No interactive events in CLI mode\nfunction wireEvents()\n{\n\t// No-op for CLI\n}\n\n// --- Utility ---\n\nfunction padLeft(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = ' ' + tmpStr;\n\t}\n\treturn tmpStr;\n}\n\nfunction padRight(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = tmpStr + ' ';\n\t}\n\treturn tmpStr;\n}\n\nfunction padCenter(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = (tmpStr.length % 2 === 0) ? (tmpStr + ' ') : (' ' + tmpStr);\n\t}\n\treturn tmpStr;\n}\n\nmodule.exports = { render, wireEvents, renderVertical, renderHorizontal, colorToAnsi, ANSI_COLORS };\n","/**\n * Console UI (blessed) renderer for pict-section-histogram.\n *\n * Renders the histogram as text art through the Pict ContentAssignment\n * pipeline, suitable for blessed/ncurses terminal UI widgets.\n *\n * The output is assigned via ContentAssignment so the pict-terminalui\n * bridge (customAssignFunction) can project it into blessed boxes.\n *\n * @module Pict-Histogram-Renderer-ConsoleUI\n */\n\n/**\n * Build a vertical text histogram.\n *\n * Each column is one bar. Rows go from top (max value) to bottom (0).\n * Uses block characters for fractional rows.\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} The rendered text block\n */\nfunction renderVertical(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tlet tmpOptions = pView.options;\n\tlet tmpHeight = tmpOptions.TextHeight || 15;\n\tlet tmpBarChar = tmpOptions.BarCharacter;\n\tlet tmpPartials = tmpOptions.BarPartialCharacters;\n\tlet tmpEmptyChar = tmpOptions.EmptyCharacter;\n\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '(no data)';\n\t}\n\n\tlet tmpMaxValue = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\t// Determine label width for the value axis\n\tlet tmpValueAxisWidth = String(tmpMaxValue).length + 1;\n\n\t// Build the grid top-down\n\tlet tmpLines = [];\n\n\tfor (let tmpRow = tmpHeight; tmpRow >= 1; tmpRow--)\n\t{\n\t\tlet tmpLine = '';\n\n\t\t// Value axis label (only on a few rows)\n\t\tif (tmpRow === tmpHeight)\n\t\t{\n\t\t\ttmpLine += padLeft(String(tmpMaxValue), tmpValueAxisWidth) + '|';\n\t\t}\n\t\telse if (tmpRow === 1)\n\t\t{\n\t\t\ttmpLine += padLeft('0', tmpValueAxisWidth) + '|';\n\t\t}\n\t\telse if (tmpRow === Math.ceil(tmpHeight / 2))\n\t\t{\n\t\t\ttmpLine += padLeft(String(Math.round(tmpMaxValue / 2)), tmpValueAxisWidth) + '|';\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpLine += padLeft('', tmpValueAxisWidth) + '|';\n\t\t}\n\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\t\tlet tmpBarHeight = (tmpVal / tmpMaxValue) * tmpHeight;\n\t\t\tlet tmpFullRows = Math.floor(tmpBarHeight);\n\t\t\tlet tmpFraction = tmpBarHeight - tmpFullRows;\n\n\t\t\tlet tmpChar = tmpEmptyChar;\n\t\t\tif (tmpRow <= tmpFullRows)\n\t\t\t{\n\t\t\t\ttmpChar = tmpBarChar;\n\t\t\t}\n\t\t\telse if (tmpRow === tmpFullRows + 1 && tmpFraction > 0)\n\t\t\t{\n\t\t\t\tlet tmpPartialIndex = Math.round(tmpFraction * (tmpPartials.length - 1));\n\t\t\t\ttmpChar = tmpPartials[tmpPartialIndex];\n\t\t\t}\n\n\t\t\t// Mark selected bins\n\t\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\n\t\t\tif (tmpIsSelected && tmpChar !== tmpEmptyChar)\n\t\t\t{\n\t\t\t\ttmpChar = '*';\n\t\t\t}\n\t\t\telse if (tmpInRange && tmpChar !== tmpEmptyChar)\n\t\t\t{\n\t\t\t\ttmpChar = '#';\n\t\t\t}\n\n\t\t\t// Each bar is 3 chars wide with 1 char gap\n\t\t\ttmpLine += ' ' + tmpChar + tmpChar + tmpChar;\n\t\t}\n\n\t\ttmpLines.push(tmpLine);\n\t}\n\n\t// Bottom axis\n\tlet tmpAxisLine = padLeft('', tmpValueAxisWidth) + '+';\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\ttmpAxisLine += '----';\n\t}\n\ttmpLines.push(tmpAxisLine);\n\n\t// Labels row\n\tif (tmpOptions.ShowLabels)\n\t{\n\t\tlet tmpLabelLine = padLeft('', tmpValueAxisWidth) + ' ';\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\t\ttmpLabelLine += padCenter(tmpLabel.substring(0, 4), 4);\n\t\t}\n\t\ttmpLines.push(tmpLabelLine);\n\t}\n\n\t// Selection range indicator\n\tif (tmpOptions.Selectable && tmpOptions.SelectionMode === 'range')\n\t{\n\t\tlet tmpRangeLine = padLeft('', tmpValueAxisWidth) + ' ';\n\t\tfor (let i = 0; i < tmpBins.length; i++)\n\t\t{\n\t\t\tif (i === pView._selectionRangeStart)\n\t\t\t{\n\t\t\t\ttmpRangeLine += ' [ ';\n\t\t\t}\n\t\t\telse if (i === pView._selectionRangeEnd)\n\t\t\t{\n\t\t\t\ttmpRangeLine += ' ] ';\n\t\t\t}\n\t\t\telse if (i > pView._selectionRangeStart && i < pView._selectionRangeEnd)\n\t\t\t{\n\t\t\t\ttmpRangeLine += ' - ';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmpRangeLine += ' ';\n\t\t\t}\n\t\t}\n\t\ttmpLines.push(tmpRangeLine);\n\t}\n\n\treturn tmpLines.join('\\n');\n}\n\n/**\n * Build a horizontal text histogram.\n *\n * Each row is one bar growing rightward.\n *\n * @param {object} pView - The histogram view instance\n * @returns {string} The rendered text block\n */\nfunction renderHorizontal(pView)\n{\n\tlet tmpBins = pView.getBins();\n\tlet tmpOptions = pView.options;\n\tlet tmpWidth = tmpOptions.TextWidth || 60;\n\tlet tmpBarChar = tmpOptions.BarCharacter;\n\tlet tmpPartials = tmpOptions.BarPartialCharacters;\n\n\tif (!tmpBins || tmpBins.length === 0)\n\t{\n\t\treturn '(no data)';\n\t}\n\n\tlet tmpMaxValue = 0;\n\tlet tmpMaxLabelLen = 0;\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tif (tmpVal > tmpMaxValue)\n\t\t{\n\t\t\ttmpMaxValue = tmpVal;\n\t\t}\n\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\tif (tmpLabel.length > tmpMaxLabelLen)\n\t\t{\n\t\t\ttmpMaxLabelLen = tmpLabel.length;\n\t\t}\n\t}\n\tif (tmpMaxValue === 0)\n\t{\n\t\ttmpMaxValue = 1;\n\t}\n\n\tlet tmpLabelWidth = Math.min(tmpMaxLabelLen, 12);\n\tlet tmpBarWidth = tmpWidth - tmpLabelWidth - 2; // space for \" |\"\n\tif (tmpBarWidth < 10)\n\t{\n\t\ttmpBarWidth = 10;\n\t}\n\n\tlet tmpLines = [];\n\n\tfor (let i = 0; i < tmpBins.length; i++)\n\t{\n\t\tlet tmpVal = tmpBins[i][tmpOptions.ValueProperty] || 0;\n\t\tlet tmpLabel = String(tmpBins[i][tmpOptions.LabelProperty] || '');\n\t\tlet tmpBarLen = (tmpVal / tmpMaxValue) * tmpBarWidth;\n\t\tlet tmpFullChars = Math.floor(tmpBarLen);\n\t\tlet tmpFraction = tmpBarLen - tmpFullChars;\n\n\t\tlet tmpBar = '';\n\t\tfor (let j = 0; j < tmpFullChars; j++)\n\t\t{\n\t\t\ttmpBar += tmpBarChar;\n\t\t}\n\t\tif (tmpFraction > 0 && tmpFullChars < tmpBarWidth)\n\t\t{\n\t\t\tlet tmpPartialIndex = Math.round(tmpFraction * (tmpPartials.length - 1));\n\t\t\ttmpBar += tmpPartials[tmpPartialIndex];\n\t\t}\n\n\t\t// Mark selected\n\t\tlet tmpIsSelected = pView.isIndexSelected(i);\n\t\tlet tmpInRange = !tmpIsSelected && pView.isIndexInRange(i);\n\t\tlet tmpMarker = tmpIsSelected ? '*' : (tmpInRange ? '~' : '');\n\n\t\tlet tmpValueStr = tmpOptions.ShowValues ? (' ' + tmpVal) : '';\n\t\tlet tmpLine = padRight(tmpLabel.substring(0, tmpLabelWidth), tmpLabelWidth) + ' |' + tmpBar + tmpValueStr + tmpMarker;\n\t\ttmpLines.push(tmpLine);\n\t}\n\n\t// Range indicator for range selection\n\tif (tmpOptions.Selectable && tmpOptions.SelectionMode === 'range')\n\t{\n\t\ttmpLines.push('');\n\t\ttmpLines.push(padRight('', tmpLabelWidth) + ' Range: [' + pView._selectionRangeStart + ' - ' + pView._selectionRangeEnd + ']');\n\t}\n\n\treturn tmpLines.join('\\n');\n}\n\n/**\n * Render via ContentAssignment for consoleui mode.\n *\n * @param {object} pView - The histogram view instance\n */\nfunction render(pView)\n{\n\tlet tmpText;\n\tif (pView.options.Orientation === 'vertical')\n\t{\n\t\ttmpText = renderVertical(pView);\n\t}\n\telse\n\t{\n\t\ttmpText = renderHorizontal(pView);\n\t}\n\n\tpView.services.ContentAssignment.assignContent(pView.options.TargetElementAddress, tmpText);\n}\n\n// No interactive events for consoleui — input is handled by the blessed widget layer\nfunction wireEvents()\n{\n\t// No-op for consoleui\n}\n\n// --- Utility ---\n\nfunction padLeft(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = ' ' + tmpStr;\n\t}\n\treturn tmpStr;\n}\n\nfunction padRight(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = tmpStr + ' ';\n\t}\n\treturn tmpStr;\n}\n\nfunction padCenter(pStr, pLen)\n{\n\tlet tmpStr = String(pStr);\n\twhile (tmpStr.length < pLen)\n\t{\n\t\ttmpStr = (tmpStr.length % 2 === 0) ? (tmpStr + ' ') : (' ' + tmpStr);\n\t}\n\treturn tmpStr;\n}\n\nmodule.exports = { render, wireEvents, renderVertical, renderHorizontal };\n","module.exports={\n \"name\": \"pict-view\",\n \"version\": \"1.0.67\",\n \"description\": \"Pict View Base Class\",\n \"main\": \"source/Pict-View.js\",\n \"scripts\": {\n \"test\": \"npx quack test\",\n \"tests\": \"npx quack test -g\",\n \"start\": \"node source/Pict-View.js\",\n \"coverage\": \"npx quack coverage\",\n \"build\": \"npx quack build\",\n \"docker-dev-build\": \"docker build ./ -f Dockerfile_LUXURYCode -t pict-view-image:local\",\n \"docker-dev-run\": \"docker run -it -d --name pict-view-dev -p 30001:8080 -p 38086:8086 -v \\\"$PWD/.config:/home/coder/.config\\\" -v \\\"$PWD:/home/coder/pict-view\\\" -u \\\"$(id -u):$(id -g)\\\" -e \\\"DOCKER_USER=$USER\\\" pict-view-image:local\",\n \"docker-dev-shell\": \"docker exec -it pict-view-dev /bin/bash\",\n \"types\": \"tsc -p .\",\n \"lint\": \"eslint source/**\"\n },\n \"types\": \"types/source/Pict-View.d.ts\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/stevenvelozo/pict-view.git\"\n },\n \"author\": \"steven velozo <steven@velozo.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/stevenvelozo/pict-view/issues\"\n },\n \"homepage\": \"https://github.com/stevenvelozo/pict-view#readme\",\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.1\",\n \"browser-env\": \"^3.3.0\",\n \"eslint\": \"^9.39.1\",\n \"pict\": \"^1.0.348\",\n \"quackage\": \"^1.0.58\",\n \"typescript\": \"^5.9.3\"\n },\n \"mocha\": {\n \"diff\": true,\n \"extension\": [\n \"js\"\n ],\n \"package\": \"./package.json\",\n \"reporter\": \"spec\",\n \"slow\": \"75\",\n \"timeout\": \"5000\",\n \"ui\": \"tdd\",\n \"watch-files\": [\n \"source/**/*.js\",\n \"test/**/*.js\"\n ],\n \"watch-ignore\": [\n \"lib/vendor\"\n ]\n },\n \"dependencies\": {\n \"fable\": \"^3.1.63\",\n \"fable-serviceproviderbase\": \"^3.0.19\"\n }\n}\n","\nconst libFableServiceBase = require('fable-serviceproviderbase');\n\nconst libPackage = require('../package.json');\n\nconst defaultPictViewSettings = (\n\t{\n\t\tDefaultRenderable: false,\n\t\tDefaultDestinationAddress: false,\n\t\tDefaultTemplateRecordAddress: false,\n\n\t\tViewIdentifier: false,\n\n\t\t// If this is set to true, when the App initializes this will.\n\t\t// After the App initializes, initialize will be called as soon as it's added.\n\t\tAutoInitialize: true,\n\t\tAutoInitializeOrdinal: 0,\n\n\t\t// If this is set to true, when the App autorenders (on load) this will.\n\t\t// After the App initializes, render will be called as soon as it's added.\n\t\tAutoRender: true,\n\t\tAutoRenderOrdinal: 0,\n\n\t\tAutoSolveWithApp: true,\n\t\tAutoSolveOrdinal: 0,\n\n\t\tCSSHash: false,\n\t\tCSS: false,\n\t\tCSSProvider: false,\n\t\tCSSPriority: 500,\n\n\t\tTemplates: [],\n\n\t\tDefaultTemplates: [],\n\n\t\tRenderables: [],\n\n\t\tManifests: {}\n\t});\n\n/** @typedef {(error?: Error) => void} ErrorCallback */\n/** @typedef {number | boolean} PictTimestamp */\n\n/**\n * @typedef {'replace' | 'append' | 'prepend' | 'append_once' | 'virtual-assignment'} RenderMethod\n */\n/**\n * @typedef {Object} Renderable\n *\n * @property {string} RenderableHash - A unique hash for the renderable.\n * @property {string} TemplateHash - The hash of the template to use for rendering this renderable.\n * @property {string} [DefaultTemplateRecordAddress] - The default address for resolving the data record for this renderable.\n * @property {string} [ContentDestinationAddress] - The default address (DOM CSS selector) for rendering the content of this renderable.\n * @property {RenderMethod} [RenderMethod=replace] - The method to use when projecting the renderable to the DOM ('replace', 'append', 'prepend', 'append_once', 'virtual-assignment').\n * @property {string} [TestAddress] - The address to use for testing the renderable.\n * @property {string} [TransactionHash] - The transaction hash for the root renderable.\n * @property {string} [RootRenderableViewHash] - The hash of the root renderable.\n * @property {string} [Content] - The rendered content for this renderable, if applicable.\n */\n\n/**\n * Represents a view in the Pict ecosystem.\n */\nclass PictView extends libFableServiceBase\n{\n\t/**\n\t * @param {any} pFable - The Fable object that this service is attached to.\n\t * @param {any} [pOptions] - (optional) The options for this service.\n\t * @param {string} [pServiceHash] - (optional) The hash of the service.\n\t */\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\t// Intersect default options, parent constructor, service information\n\t\tlet tmpOptions = Object.assign({}, JSON.parse(JSON.stringify(defaultPictViewSettings)), pOptions);\n\t\tsuper(pFable, tmpOptions, pServiceHash);\n\t\t//FIXME: add types to fable and ancillaries\n\t\t/** @type {any} */\n\t\tthis.fable;\n\t\t/** @type {any} */\n\t\tthis.options;\n\t\t/** @type {String} */\n\t\tthis.UUID;\n\t\t/** @type {String} */\n\t\tthis.Hash;\n\t\t/** @type {any} */\n\t\tthis.log;\n\n\t\tconst tmpHashIsUUID = this.Hash === this.UUID;\n\t\t//NOTE: since many places are using the view UUID as the HTML element ID, we prefix it to avoid starting with a number\n\t\tthis.UUID = `V-${this.UUID}`;\n\t\tif (tmpHashIsUUID)\n\t\t{\n\t\t\tthis.Hash = this.UUID;\n\t\t}\n\n\t\tif (!this.options.ViewIdentifier)\n\t\t{\n\t\t\tthis.options.ViewIdentifier = `AutoViewID-${this.fable.getUUID()}`;\n\t\t}\n\t\tthis.serviceType = 'PictView';\n\t\t/** @type {Record<string, any>} */\n\t\tthis._Package = libPackage;\n\t\t// Convenience and consistency naming\n\t\t/** @type {import('pict') & { log: any, instantiateServiceProviderWithoutRegistration: (hash: String) => any, instantiateServiceProviderIfNotExists: (hash: string) => any, TransactionTracking: import('pict/types/source/services/Fable-Service-TransactionTracking') }} */\n\t\tthis.pict = this.fable;\n\t\t// Wire in the essential Pict application state\n\t\tthis.AppData = this.pict.AppData;\n\t\tthis.Bundle = this.pict.Bundle;\n\n\t\t/** @type {PictTimestamp} */\n\t\tthis.initializeTimestamp = false;\n\t\t/** @type {PictTimestamp} */\n\t\tthis.lastSolvedTimestamp = false;\n\t\t/** @type {PictTimestamp} */\n\t\tthis.lastRenderedTimestamp = false;\n\t\t/** @type {PictTimestamp} */\n\t\tthis.lastMarshalFromViewTimestamp = false;\n\t\t/** @type {PictTimestamp} */\n\t\tthis.lastMarshalToViewTimestamp = false;\n\n\t\tthis.pict.instantiateServiceProviderIfNotExists('TransactionTracking');\n\n\t\t// Load all templates from the array in the options\n\t\t// Templates are in the form of {Hash:'Some-Template-Hash',Template:'Template content',Source:'TemplateSource'}\n\t\tfor (let i = 0; i < this.options.Templates.length; i++)\n\t\t{\n\t\t\tlet tmpTemplate = this.options.Templates[i];\n\n\t\t\tif (!('Hash' in tmpTemplate) || !('Template' in tmpTemplate))\n\t\t\t{\n\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not load Template ${i} in the options array.`, tmpTemplate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!tmpTemplate.Source)\n\t\t\t\t{\n\t\t\t\t\ttmpTemplate.Source = `PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} options object.`;\n\t\t\t\t}\n\t\t\t\tthis.pict.TemplateProvider.addTemplate(tmpTemplate.Hash, tmpTemplate.Template, tmpTemplate.Source);\n\t\t\t}\n\t\t}\n\n\t\t// Load all default templates from the array in the options\n\t\t// Templates are in the form of {Prefix:'',Postfix:'-List-Row',Template:'Template content',Source:'TemplateSourceString'}\n\t\tfor (let i = 0; i < this.options.DefaultTemplates.length; i++)\n\t\t{\n\t\t\tlet tmpDefaultTemplate = this.options.DefaultTemplates[i];\n\n\t\t\tif (!('Postfix' in tmpDefaultTemplate) || !('Template' in tmpDefaultTemplate))\n\t\t\t{\n\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not load Default Template ${i} in the options array.`, tmpDefaultTemplate);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!tmpDefaultTemplate.Source)\n\t\t\t\t{\n\t\t\t\t\ttmpDefaultTemplate.Source = `PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} options object.`;\n\t\t\t\t}\n\t\t\t\tthis.pict.TemplateProvider.addDefaultTemplate(tmpDefaultTemplate.Prefix, tmpDefaultTemplate.Postfix, tmpDefaultTemplate.Template, tmpDefaultTemplate.Source);\n\t\t\t}\n\t\t}\n\n\t\t// Load the CSS if it's available\n\t\tif (this.options.CSS)\n\t\t{\n\t\t\tlet tmpCSSHash = this.options.CSSHash ? this.options.CSSHash : `View-${this.options.ViewIdentifier}`;\n\t\t\tlet tmpCSSProvider = this.options.CSSProvider ? this.options.CSSProvider : tmpCSSHash;\n\t\t\tthis.pict.CSSMap.addCSS(tmpCSSHash, this.options.CSS, tmpCSSProvider, this.options.CSSPriority);\n\t\t}\n\n\t\t// Load all renderables\n\t\t// Renderables are launchable renderable instructions with templates\n\t\t// They look as such: {Identifier:'ContentEntry', TemplateHash:'Content-Entry-Section-Main', ContentDestinationAddress:'#ContentSection', RecordAddress:'AppData.Content.DefaultText', ManifestTransformation:'ManyfestHash', ManifestDestinationAddress:'AppData.Content.DataToTransformContent'}\n\t\t// The only parts that are necessary are Identifier and Template\n\t\t// A developer can then do render('ContentEntry') and it just kinda works. Or they can override the ContentDestinationAddress\n\t\t/** @type {Record<String, Renderable>} */\n\t\tthis.renderables = {};\n\t\tfor (let i = 0; i < this.options.Renderables.length; i++)\n\t\t{\n\t\t\t/** @type {Renderable} */\n\t\t\tlet tmpRenderable = this.options.Renderables[i];\n\t\t\tthis.addRenderable(tmpRenderable);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a renderable to the view.\n\t *\n\t * @param {string | Renderable} pRenderableHash - The hash of the renderable, or a renderable object.\n\t * @param {string} [pTemplateHash] - (optional) The hash of the template for the renderable.\n\t * @param {string} [pDefaultTemplateRecordAddress] - (optional) The default data address for the template.\n\t * @param {string} [pDefaultDestinationAddress] - (optional) The default destination address for the renderable.\n\t * @param {RenderMethod} [pRenderMethod=replace] - (optional) The method to use when rendering the renderable (ex. 'replace').\n\t */\n\taddRenderable(pRenderableHash, pTemplateHash, pDefaultTemplateRecordAddress, pDefaultDestinationAddress, pRenderMethod)\n\t{\n\t\t/** @type {Renderable} */\n\t\tlet tmpRenderable;\n\n\t\tif (typeof(pRenderableHash) == 'object')\n\t\t{\n\t\t\t// The developer passed in the renderable as an object.\n\t\t\t// Use theirs instead!\n\t\t\ttmpRenderable = pRenderableHash;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/** @type {RenderMethod} */\n\t\t\tlet tmpRenderMethod = (typeof(pRenderMethod) !== 'string') ? pRenderMethod : 'replace';\n\t\t\ttmpRenderable = (\n\t\t\t\t{\n\t\t\t\t\tRenderableHash: pRenderableHash,\n\t\t\t\t\tTemplateHash: pTemplateHash,\n\t\t\t\t\tDefaultTemplateRecordAddress: pDefaultTemplateRecordAddress,\n\t\t\t\t\tContentDestinationAddress: pDefaultDestinationAddress,\n\t\t\t\t\tRenderMethod: tmpRenderMethod\n\t\t\t\t});\n\t\t}\n\n\t\tif ((typeof(tmpRenderable.RenderableHash) != 'string') || (typeof(tmpRenderable.TemplateHash) != 'string'))\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not load Renderable; RenderableHash or TemplateHash are invalid.`, tmpRenderable);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t{\n\t\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} adding renderable [${tmpRenderable.RenderableHash}] pointed to template ${tmpRenderable.TemplateHash}.`);\n\t\t\t}\n\n\t\t\tthis.renderables[tmpRenderable.RenderableHash] = tmpRenderable;\n\t\t}\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Initialization */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before the view is initialized.\n\t */\n\tonBeforeInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is initialized (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonBeforeInitializeAsync(fCallback)\n\t{\n\t\tthis.onBeforeInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when the view is initialized.\n\t */\n\tonInitialize()\n\t{\n\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when the view is initialized (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonInitializeAsync(fCallback)\n\t{\n\t\tthis.onInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Performs view initialization.\n\t */\n\tinitialize()\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow VIEW [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initialize:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tthis.onBeforeInitialize();\n\t\t\tthis.onInitialize();\n\t\t\tthis.onAfterInitialize();\n\t\t\tthis.initializeTimestamp = this.pict.log.getTimeStamp();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initialize called but initialization is already completed. Aborting.`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Performs view initialization (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tinitializeAsync(fCallback)\n\t{\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow VIEW [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initializeAsync:`);\n\t\t}\n\n\t\tif (!this.initializeTimestamp)\n\t\t{\n\t\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t{\n\t\t\t\tthis.log.info(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} beginning initialization...`);\n\t\t\t}\n\n\t\t\ttmpAnticipate.anticipate(this.onBeforeInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onInitializeAsync.bind(this));\n\t\t\ttmpAnticipate.anticipate(this.onAfterInitializeAsync.bind(this));\n\n\t\t\ttmpAnticipate.wait(\n\t\t\t\t/** @param {Error} pError */\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initialization failed: ${pError.message || pError}`, { stack: pError.stack });\n\t\t\t\t\t}\n\t\t\t\t\tthis.initializeTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\t\tif (this.pict.LogNoisiness > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.info(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} initialization complete.`);\n\t\t\t\t\t}\n\t\t\t\t\treturn fCallback();\n\t\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} async initialize called but initialization is already completed. Aborting.`);\n\t\t\t// TODO: Should this be an error?\n\t\t\treturn fCallback();\n\t\t}\n\t}\n\n\tonAfterInitialize()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterInitialize:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is initialized (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonAfterInitializeAsync(fCallback)\n\t{\n\t\tthis.onAfterInitialize();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Render */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before the view is rendered.\n\t *\n\t * @param {Renderable} pRenderable - The renderable that will be rendered.\n\t */\n\tonBeforeRender(pRenderable)\n\t{\n\t\t// Overload this to mess with stuff before the content gets generated from the template\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeRender:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is rendered (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that will be rendered.\n\t */\n\tonBeforeRenderAsync(fCallback, pRenderable)\n\t{\n\t\tthis.onBeforeRender(pRenderable);\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is projected into the DOM.\n\t *\n\t * @param {Renderable} pRenderable - The renderable that will be projected.\n\t */\n\tonBeforeProject(pRenderable)\n\t{\n\t\t// Overload this to mess with stuff before the content gets generated from the template\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeProject:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is projected into the DOM (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that will be projected.\n\t */\n\tonBeforeProjectAsync(fCallback, pRenderable)\n\t{\n\t\tthis.onBeforeProject(pRenderable);\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Builds the render options for a renderable.\n\t *\n\t * For DRY purposes on the three flavors of render.\n\t *\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object|ErrorCallback} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t */\n\tbuildRenderOptions(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress)\n\t{\n\t\tlet tmpRenderOptions = {Valid: true};\n\t\ttmpRenderOptions.RenderableHash = (typeof (pRenderableHash) === 'string') ? pRenderableHash :\n\t\t\t\t\t\t\t\t(typeof (this.options.DefaultRenderable) == 'string') ?\n\t\t\t\t\t\t\t\tthis.options.DefaultRenderable : false;\n\t\tif (!tmpRenderOptions.RenderableHash)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not find a suitable RenderableHash ${tmpRenderOptions.RenderableHash} (param ${pRenderableHash}because it is not a valid renderable.`);\n\t\t\ttmpRenderOptions.Valid = false;\n\t\t}\n\n\t\ttmpRenderOptions.Renderable = this.renderables[tmpRenderOptions.RenderableHash];\n\t\tif (!tmpRenderOptions.Renderable)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderOptions.RenderableHash} (param ${pRenderableHash}) because it does not exist.`);\n\t\t\ttmpRenderOptions.Valid = false;\n\t\t}\n\n\t\ttmpRenderOptions.DestinationAddress = (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress :\n\t\t\t(typeof (tmpRenderOptions.Renderable.ContentDestinationAddress) === 'string') ? tmpRenderOptions.Renderable.ContentDestinationAddress :\n\t\t\t\t(typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : false;\n\t\tif (!tmpRenderOptions.DestinationAddress)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderOptions.RenderableHash} (param ${pRenderableHash}) because it does not have a valid destination address (param ${pRenderDestinationAddress}).`);\n\t\t\ttmpRenderOptions.Valid = false;\n\t\t}\n\n\t\tif (typeof(pTemplateRecordAddress) === 'object')\n\t\t{\n\t\t\ttmpRenderOptions.RecordAddress = 'Passed in as object';\n\t\t\ttmpRenderOptions.Record = pTemplateRecordAddress;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRenderOptions.RecordAddress = (typeof (pTemplateRecordAddress) === 'string') ? pTemplateRecordAddress :\n\t\t\t\t(typeof (tmpRenderOptions.Renderable.DefaultTemplateRecordAddress) === 'string') ? tmpRenderOptions.Renderable.DefaultTemplateRecordAddress :\n\t\t\t\t(typeof (this.options.DefaultTemplateRecordAddress) === 'string') ? this.options.DefaultTemplateRecordAddress : false;\n\t\t\ttmpRenderOptions.Record = (typeof (tmpRenderOptions.RecordAddress) === 'string') ? this.pict.DataProvider.getDataByAddress(tmpRenderOptions.RecordAddress) : undefined;\n\t\t}\n\n\t\treturn tmpRenderOptions;\n\t}\n\n\t/**\n\t * Assigns the content to the destination address.\n\t *\n\t * For DRY purposes on the three flavors of render.\n\t *\n\t * @param {Renderable} pRenderable - The renderable to render.\n\t * @param {string} pRenderDestinationAddress - The address where the renderable will be rendered.\n\t * @param {string} pContent - The content to render.\n\t * @returns {boolean} - Returns true if the content was assigned successfully.\n\t * @memberof PictView\n\t */\n\tassignRenderContent(pRenderable, pRenderDestinationAddress, pContent)\n\t{\n\t\treturn this.pict.ContentAssignment.projectContent(pRenderable.RenderMethod, pRenderDestinationAddress, pContent, pRenderable.TestAddress);\n\t}\n\n\t/**\n\t * Render a renderable from this view.\n\t *\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object} [pTemplateRecordAddress] - The address where the data for the template is stored.\n\t * @param {Renderable} [pRootRenderable] - The root renderable for the render operation, if applicable.\n\t * @return {boolean}\n\t */\n\trender(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable)\n\t{\n\t\treturn this.renderWithScope(this, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable);\n\t}\n\n\t/**\n\t * Render a renderable from this view, providing a specifici scope for the template.\n\t *\n\t * @param {any} pScope - The scope to use for the template rendering.\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object} [pTemplateRecordAddress] - The address where the data for the template is stored.\n\t * @param {Renderable} [pRootRenderable] - The root renderable for the render operation, if applicable.\n\t * @return {boolean}\n\t */\n\trenderWithScope(pScope, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable)\n\t{\n\t\tlet tmpRenderableHash = (typeof (pRenderableHash) === 'string') ? pRenderableHash :\n\t\t\t(typeof (this.options.DefaultRenderable) == 'string') ? this.options.DefaultRenderable : false;\n\t\tif (!tmpRenderableHash)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it is not a valid renderable.`);\n\t\t\treturn false;\n\t\t}\n\n\t\t/** @type {Renderable} */\n\t\tlet tmpRenderable;\n\t\tif (tmpRenderableHash == '__Virtual')\n\t\t{\n\t\t\ttmpRenderable = {\n\t\t\t\tRenderableHash: '__Virtual',\n\t\t\t\tTemplateHash: this.renderables[this.options.DefaultRenderable].TemplateHash,\n\t\t\t\tContentDestinationAddress: (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress :\n\t\t\t\t\t(typeof (tmpRenderable.ContentDestinationAddress) === 'string') ? tmpRenderable.ContentDestinationAddress :\n\t\t\t\t\t(typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : null,\n\t\t\t\tRenderMethod: 'virtual-assignment',\n\t\t\t\tTransactionHash: pRootRenderable && pRootRenderable.TransactionHash,\n\t\t\t\tRootRenderableViewHash: pRootRenderable && pRootRenderable.RootRenderableViewHash,\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRenderable = Object.assign({}, this.renderables[tmpRenderableHash]);\n\t\t\ttmpRenderable.ContentDestinationAddress = (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress :\n\t\t\t\t(typeof (tmpRenderable.ContentDestinationAddress) === 'string') ? tmpRenderable.ContentDestinationAddress :\n\t\t\t\t(typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : null;\n\t\t}\n\n\t\tif (!tmpRenderable.TransactionHash)\n\t\t{\n\t\t\ttmpRenderable.TransactionHash = `ViewRender-V-${this.options.ViewIdentifier}-R-${tmpRenderableHash}-U-${this.pict.getUUID()}`;\n\t\t\ttmpRenderable.RootRenderableViewHash = this.Hash;\n\t\t\tthis.pict.TransactionTracking.registerTransaction(tmpRenderable.TransactionHash);\n\t\t}\n\n\t\tif (!tmpRenderable)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not exist.`);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!tmpRenderable.ContentDestinationAddress)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not have a valid destination address.`);\n\t\t\treturn false;\n\t\t}\n\n\t\tlet tmpRecordAddress;\n\t\tlet tmpRecord;\n\n\t\tif (typeof(pTemplateRecordAddress) === 'object')\n\t\t{\n\t\t\ttmpRecord = pTemplateRecordAddress;\n\t\t\ttmpRecordAddress = 'Passed in as object';\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRecordAddress = (typeof (pTemplateRecordAddress) === 'string') ? pTemplateRecordAddress :\n\t\t\t\t(typeof (tmpRenderable.DefaultTemplateRecordAddress) === 'string') ? tmpRenderable.DefaultTemplateRecordAddress :\n\t\t\t\t\t(typeof (this.options.DefaultTemplateRecordAddress) === 'string') ? this.options.DefaultTemplateRecordAddress : false;\n\n\t\t\ttmpRecord = (typeof (tmpRecordAddress) === 'string') ? this.pict.DataProvider.getDataByAddress(tmpRecordAddress) : undefined;\n\t\t}\n\n\t\t// Execute the developer-overridable pre-render behavior\n\t\tthis.onBeforeRender(tmpRenderable);\n\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow VIEW [${this.UUID}]::[${this.Hash}] Renderable[${tmpRenderableHash}] Destination[${tmpRenderable.ContentDestinationAddress}] TemplateRecordAddress[${tmpRecordAddress}] render:`);\n\t\t}\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} Beginning Render of Renderable[${tmpRenderableHash}] to Destination [${tmpRenderable.ContentDestinationAddress}]...`);\n\t\t}\n\t\t// Generate the content output from the template and data\n\t\ttmpRenderable.Content = this.pict.parseTemplateByHash(tmpRenderable.TemplateHash, tmpRecord, null, [this], pScope, { RootRenderable: typeof pRootRenderable === 'object' ? pRootRenderable : tmpRenderable });\n\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} Assigning Renderable[${tmpRenderableHash}] content length ${tmpRenderable.Content.length} to Destination [${tmpRenderable.ContentDestinationAddress}] using render method [${tmpRenderable.RenderMethod}].`);\n\t\t}\n\n\t\tthis.onBeforeProject(tmpRenderable);\n\t\tthis.onProject(tmpRenderable);\n\n\t\tif (tmpRenderable.RenderMethod !== 'virtual-assignment')\n\t\t{\n\t\t\tthis.onAfterProject(tmpRenderable);\n\n\t\t\t// Execute the developer-overridable post-render behavior\n\t\t\tthis.onAfterRender(tmpRenderable);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Render a renderable from this view.\n\t *\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object|ErrorCallback} [pTemplateRecordAddress] - The address where the data for the template is stored.\n\t * @param {Renderable|ErrorCallback} [pRootRenderable] - The root renderable for the render operation, if applicable.\n\t * @param {ErrorCallback} [fCallback] - The callback to call when the async operation is complete.\n\t *\n\t * @return {void}\n\t */\n\trenderAsync(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable, fCallback)\n\t{\n\t\treturn this.renderWithScopeAsync(this, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable, fCallback);\n\t}\n\n\t/**\n\t * Render a renderable from this view.\n\t *\n\t * @param {any} pScope - The scope to use for the template rendering.\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object|ErrorCallback} [pTemplateRecordAddress] - The address where the data for the template is stored.\n\t * @param {Renderable|ErrorCallback} [pRootRenderable] - The root renderable for the render operation, if applicable.\n\t * @param {ErrorCallback} [fCallback] - The callback to call when the async operation is complete.\n\t *\n\t * @return {void}\n\t */\n\trenderWithScopeAsync(pScope, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, pRootRenderable, fCallback)\n\t{\n\t\tlet tmpRenderableHash = (typeof (pRenderableHash) === 'string') ? pRenderableHash :\n\t\t\t(typeof (this.options.DefaultRenderable) == 'string') ? this.options.DefaultRenderable : false;\n\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback :\n\t\t\t\t\t\t\t(typeof(pTemplateRecordAddress) === 'function') ? pTemplateRecordAddress :\n\t\t\t\t\t\t\t(typeof(pRenderDestinationAddress) === 'function') ? pRenderDestinationAddress :\n\t\t\t\t\t\t\t(typeof(pRenderableHash) === 'function') ? pRenderableHash :\n\t\t\t\t\t\t\t(typeof(pRootRenderable) === 'function') ? pRootRenderable :\n\t\t\t\t\t\t\tnull;\n\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} renderAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tif (!tmpRenderableHash)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not asynchronously render ${tmpRenderableHash} (param ${pRenderableHash}because it is not a valid renderable.`);\n\t\t\treturn tmpCallback(new Error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not asynchronously render ${tmpRenderableHash} (param ${pRenderableHash}because it is not a valid renderable.`));\n\t\t}\n\n\t\t/** @type {Renderable} */\n\t\tlet tmpRenderable;\n\t\tif (tmpRenderableHash == '__Virtual')\n\t\t{\n\t\t\ttmpRenderable = {\n\t\t\t\tRenderableHash: '__Virtual',\n\t\t\t\tTemplateHash: this.renderables[this.options.DefaultRenderable].TemplateHash,\n\t\t\t\tContentDestinationAddress: (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress : (typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : null,\n\t\t\t\tRenderMethod: 'virtual-assignment',\n\t\t\t\tTransactionHash: pRootRenderable && typeof pRootRenderable !== 'function' && pRootRenderable.TransactionHash,\n\t\t\t\tRootRenderableViewHash: pRootRenderable && typeof pRootRenderable !== 'function' && pRootRenderable.RootRenderableViewHash,\n\t\t\t};\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRenderable = Object.assign({}, this.renderables[tmpRenderableHash]);\n\t\t\ttmpRenderable.ContentDestinationAddress = (typeof (pRenderDestinationAddress) === 'string') ? pRenderDestinationAddress :\n\t\t\t\t(typeof (tmpRenderable.ContentDestinationAddress) === 'string') ? tmpRenderable.ContentDestinationAddress :\n\t\t\t\t(typeof (this.options.DefaultDestinationAddress) === 'string') ? this.options.DefaultDestinationAddress : null;\n\t\t}\n\n\t\tif (!tmpRenderable.TransactionHash)\n\t\t{\n\t\t\ttmpRenderable.TransactionHash = `ViewRender-V-${this.options.ViewIdentifier}-R-${tmpRenderableHash}-U-${this.pict.getUUID()}`;\n\t\t\ttmpRenderable.RootRenderableViewHash = this.Hash;\n\t\t\tthis.pict.TransactionTracking.registerTransaction(tmpRenderable.TransactionHash);\n\t\t}\n\n\t\tif (!tmpRenderable)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not exist.`);\n\t\t\treturn tmpCallback(new Error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not exist.`));\n\t\t}\n\n\t\tif (!tmpRenderable.ContentDestinationAddress)\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render ${tmpRenderableHash} (param ${pRenderableHash}) because it does not have a valid destination address.`);\n\t\t\treturn tmpCallback(new Error(`Could not render ${tmpRenderableHash}`));\n\t\t}\n\n\t\tlet tmpRecordAddress;\n\t\tlet tmpRecord;\n\n\t\tif (typeof(pTemplateRecordAddress) === 'object')\n\t\t{\n\t\t\ttmpRecord = pTemplateRecordAddress;\n\t\t\ttmpRecordAddress = 'Passed in as object';\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpRecordAddress = (typeof (pTemplateRecordAddress) === 'string') ? pTemplateRecordAddress :\n\t\t\t\t(typeof (tmpRenderable.DefaultTemplateRecordAddress) === 'string') ? tmpRenderable.DefaultTemplateRecordAddress :\n\t\t\t\t\t(typeof (this.options.DefaultTemplateRecordAddress) === 'string') ? this.options.DefaultTemplateRecordAddress : false;\n\n\t\t\ttmpRecord = (typeof (tmpRecordAddress) === 'string') ? this.pict.DataProvider.getDataByAddress(tmpRecordAddress) : undefined;\n\t\t}\n\n\t\tif (this.pict.LogControlFlow)\n\t\t{\n\t\t\tthis.log.trace(`PICT-ControlFlow VIEW [${this.UUID}]::[${this.Hash}] Renderable[${tmpRenderableHash}] Destination[${tmpRenderable.ContentDestinationAddress}] TemplateRecordAddress[${tmpRecordAddress}] renderAsync:`);\n\t\t}\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} Beginning Asynchronous Render (callback-style)...`);\n\t\t}\n\n\t\tlet tmpAnticipate = this.fable.newAnticipate();\n\n\t\ttmpAnticipate.anticipate(\n\t\t\t(fOnBeforeRenderCallback) =>\n\t\t\t{\n\t\t\t\tthis.onBeforeRenderAsync(fOnBeforeRenderCallback, tmpRenderable);\n\t\t\t});\n\n\t\ttmpAnticipate.anticipate(\n\t\t\t(fAsyncTemplateCallback) =>\n\t\t\t{\n\t\t\t\t// Render the template (asynchronously)\n\t\t\t\tthis.pict.parseTemplateByHash(tmpRenderable.TemplateHash, tmpRecord,\n\t\t\t\t\t(pError, pContent) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pError)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render (asynchronously) ${tmpRenderableHash} (param ${pRenderableHash}) because it did not parse the template.`, pError);\n\t\t\t\t\t\t\treturn fAsyncTemplateCallback(pError);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttmpRenderable.Content = pContent;\n\n\t\t\t\t\t\treturn fAsyncTemplateCallback();\n\t\t\t\t\t}, [this], pScope, { RootRenderable: typeof pRootRenderable === 'object' ? pRootRenderable : tmpRenderable });\n\t\t\t});\n\n\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t{\n\t\t\tthis.onBeforeProjectAsync(fNext, tmpRenderable);\n\t\t});\n\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t{\n\t\t\tthis.onProjectAsync(fNext, tmpRenderable);\n\t\t});\n\n\t\tif (tmpRenderable.RenderMethod !== 'virtual-assignment')\n\t\t{\n\t\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t\t{\n\t\t\t\tthis.onAfterProjectAsync(fNext, tmpRenderable);\n\t\t\t});\n\n\t\t\t// Execute the developer-overridable post-render behavior\n\t\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t\t{\n\t\t\t\tthis.onAfterRenderAsync(fNext, tmpRenderable);\n\t\t\t});\n\t\t}\n\n\t\ttmpAnticipate.wait(tmpCallback);\n\t}\n\n\t/**\n\t * Renders the default renderable.\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\trenderDefaultAsync(fCallback)\n\t{\n\t\t// Render the default renderable\n\t\tthis.renderAsync(fCallback);\n\t}\n\n\t/**\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t */\n\tbasicRender(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress)\n\t{\n\t\treturn this.basicRenderWithScope(this, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress);\n\t}\n\n\t/**\n\t * @param {any} pScope - The scope to use for the template rendering.\n\t * @param {string} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|object} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t */\n\tbasicRenderWithScope(pScope, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress)\n\t{\n\t\tlet tmpRenderOptions = this.buildRenderOptions(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress);\n\t\tif (tmpRenderOptions.Valid)\n\t\t{\n\t\t\tthis.assignRenderContent(tmpRenderOptions.Renderable, tmpRenderOptions.DestinationAddress, this.pict.parseTemplateByHash(tmpRenderOptions.Renderable.TemplateHash, tmpRenderOptions.Record, null, [this], pScope, { RootRenderable: tmpRenderOptions.Renderable }));\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not perform a basic render of ${tmpRenderOptions.RenderableHash} because it is not valid.`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|Object|ErrorCallback} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t * @param {ErrorCallback} [fCallback] - The callback to call when the async operation is complete.\n\t */\n\tbasicRenderAsync(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, fCallback)\n\t{\n\t\treturn this.basicRenderWithScopeAsync(this, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, fCallback);\n\t}\n\n\t/**\n\t * @param {any} pScope - The scope to use for the template rendering.\n\t * @param {string|ErrorCallback} [pRenderableHash] - The hash of the renderable to render.\n\t * @param {string|ErrorCallback} [pRenderDestinationAddress] - The address where the renderable will be rendered.\n\t * @param {string|Object|ErrorCallback} [pTemplateRecordAddress] - The address of (or actual obejct) where the data for the template is stored.\n\t * @param {ErrorCallback} [fCallback] - The callback to call when the async operation is complete.\n\t */\n\tbasicRenderWithScopeAsync(pScope, pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress, fCallback)\n\t{\n\t\t// Allow the callback to be passed in as the last parameter no matter what\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback :\n\t\t\t\t\t\t\t(typeof(pTemplateRecordAddress) === 'function') ? pTemplateRecordAddress :\n\t\t\t\t\t\t\t(typeof(pRenderDestinationAddress) === 'function') ? pRenderDestinationAddress :\n\t\t\t\t\t\t\t(typeof(pRenderableHash) === 'function') ? pRenderableHash :\n\t\t\t\t\t\t\tnull;\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} basicRenderAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} basicRenderAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\tconst tmpRenderOptions = this.buildRenderOptions(pRenderableHash, pRenderDestinationAddress, pTemplateRecordAddress);\n\t\tif (tmpRenderOptions.Valid)\n\t\t{\n\t\t\tthis.pict.parseTemplateByHash(tmpRenderOptions.Renderable.TemplateHash, tmpRenderOptions.Record,\n\t\t\t\t/**\n\t\t\t\t * @param {Error} [pError] - The error that occurred during template parsing.\n\t\t\t\t * @param {string} [pContent] - The content that was rendered from the template.\n\t\t\t\t */\n\t\t\t\t(pError, pContent) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not render (asynchronously) ${tmpRenderOptions.RenderableHash} because it did not parse the template.`, pError);\n\t\t\t\t\t\treturn tmpCallback(pError);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.assignRenderContent(tmpRenderOptions.Renderable, tmpRenderOptions.DestinationAddress, pContent);\n\t\t\t\t\treturn tmpCallback();\n\t\t\t\t}, [this], pScope, { RootRenderable: tmpRenderOptions.Renderable });\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet tmpErrorMessage = `PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} could not perform a basic render of ${tmpRenderOptions.RenderableHash} because it is not valid.`;\n\t\t\tthis.log.error(tmpErrorMessage);\n\t\t\treturn tmpCallback(new Error(tmpErrorMessage));\n\t\t}\n\t}\n\n\t/**\n\t * @param {Renderable} pRenderable - The renderable that was rendered.\n\t */\n\tonProject(pRenderable)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onProject:`);\n\t\t}\n\t\tif (pRenderable.RenderMethod === 'virtual-assignment')\n\t\t{\n\t\t\tthis.pict.TransactionTracking.pushToTransactionQueue(pRenderable.TransactionHash, { ViewHash: this.Hash, Renderable: pRenderable }, 'Deferred-Post-Content-Assignment');\n\t\t}\n\n\t\tif (this.pict.LogNoisiness > 0)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} Assigning Renderable[${pRenderable.RenderableHash}] content length ${pRenderable.Content.length} to Destination [${pRenderable.ContentDestinationAddress}] using Async render method ${pRenderable.RenderMethod}.`);\n\t\t}\n\n\t\t// Assign the content to the destination address\n\t\tthis.pict.ContentAssignment.projectContent(pRenderable.RenderMethod, pRenderable.ContentDestinationAddress, pRenderable.Content, pRenderable.TestAddress);\n\n\t\tthis.lastRenderedTimestamp = this.pict.log.getTimeStamp();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is projected into the DOM (async flow).\n\t *\n\t * @param {(error?: Error, content?: string) => void} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that is being projected.\n\t */\n\tonProjectAsync(fCallback, pRenderable)\n\t{\n\t\tthis.onProject(pRenderable);\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is rendered.\n\t *\n\t * @param {Renderable} pRenderable - The renderable that was rendered.\n\t */\n\tonAfterRender(pRenderable)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterRender:`);\n\t\t}\n\t\tif (pRenderable && pRenderable.RootRenderableViewHash === this.Hash)\n\t\t{\n\t\t\tconst tmpTransactionQueue = this.pict.TransactionTracking.clearTransactionQueue(pRenderable.TransactionHash) || [];\n\t\t\tfor (const tmpEvent of tmpTransactionQueue)\n\t\t\t{\n\t\t\t\tconst tmpView = this.pict.views[tmpEvent.Data.ViewHash];\n\t\t\t\tif (!tmpView)\n\t\t\t\t{\n\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterRender: Could not find view for transaction hash ${pRenderable.TransactionHash} and ViewHash ${tmpEvent.Data.ViewHash}.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttmpView.onAfterProject();\n\n\t\t\t\t// Execute the developer-overridable post-render behavior\n\t\t\t\ttmpView.onAfterRender(tmpEvent.Data.Renderable);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is rendered (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that was rendered.\n\t */\n\tonAfterRenderAsync(fCallback, pRenderable)\n\t{\n\t\tthis.onAfterRender(pRenderable);\n\t\tconst tmpAnticipate = this.fable.newAnticipate();\n\t\tif (pRenderable && pRenderable.RootRenderableViewHash === this.Hash)\n\t\t{\n\t\t\tconst queue = this.pict.TransactionTracking.clearTransactionQueue(pRenderable.TransactionHash) || [];\n\t\t\tfor (const event of queue)\n\t\t\t{\n\t\t\t\t/** @type {PictView} */\n\t\t\t\tconst tmpView = this.pict.views[event.Data.ViewHash];\n\t\t\t\tif (!tmpView)\n\t\t\t\t{\n\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterRenderAsync: Could not find view for transaction hash ${pRenderable.TransactionHash} and ViewHash ${event.Data.ViewHash}.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttmpAnticipate.anticipate(tmpView.onAfterProjectAsync.bind(tmpView));\n\t\t\t\ttmpAnticipate.anticipate((fNext) =>\n\t\t\t\t{\n\t\t\t\t\ttmpView.onAfterRenderAsync(fNext, event.Data.Renderable);\n\t\t\t\t});\n\n\t\t\t\t// Execute the developer-overridable post-render behavior\n\t\t\t}\n\t\t}\n\t\treturn tmpAnticipate.wait(fCallback);\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is projected into the DOM.\n\t *\n\t * @param {Renderable} pRenderable - The renderable that was projected.\n\t */\n\tonAfterProject(pRenderable)\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterProject:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is projected into the DOM (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t * @param {Renderable} pRenderable - The renderable that was projected.\n\t */\n\tonAfterProjectAsync(fCallback, pRenderable)\n\t{\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Solver */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before the view is solved.\n\t */\n\tonBeforeSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before the view is solved (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonBeforeSolveAsync(fCallback)\n\t{\n\t\tthis.onBeforeSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when the view is solved.\n\t */\n\tonSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when the view is solved (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonSolveAsync(fCallback)\n\t{\n\t\tthis.onSolve();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Performs view solving and triggers lifecycle hooks.\n\t *\n\t * @return {boolean} - True if the view was solved successfully, false otherwise.\n\t */\n\tsolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} executing solve() function...`);\n\t\t}\n\t\tthis.onBeforeSolve();\n\t\tthis.onSolve();\n\t\tthis.onAfterSolve();\n\t\tthis.lastSolvedTimestamp = this.pict.log.getTimeStamp();\n\t\treturn true;\n\t}\n\n\t/**\n\t * Performs view solving and triggers lifecycle hooks (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tsolveAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : null;\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} solveAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeSolveAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onSolveAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterSolveAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} solveAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastSolvedTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is solved.\n\t */\n\tonAfterSolve()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterSolve:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after the view is solved (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonAfterSolveAsync(fCallback)\n\t{\n\t\tthis.onAfterSolve();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Marshal From View */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before data is marshaled from the view.\n\t *\n\t * @return {boolean} - True if the operation was successful, false otherwise.\n\t */\n\tonBeforeMarshalFromView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeMarshalFromView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before data is marshaled from the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonBeforeMarshalFromViewAsync(fCallback)\n\t{\n\t\tthis.onBeforeMarshalFromView();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when data is marshaled from the view.\n\t */\n\tonMarshalFromView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onMarshalFromView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when data is marshaled from the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonMarshalFromViewAsync(fCallback)\n\t{\n\n\t\tthis.onMarshalFromView();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Marshals data from the view.\n\t *\n\t * @return {boolean} - True if the operation was successful, false otherwise.\n\t */\n\tmarshalFromView()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} executing solve() function...`);\n\t\t}\n\t\tthis.onBeforeMarshalFromView();\n\t\tthis.onMarshalFromView();\n\t\tthis.onAfterMarshalFromView();\n\t\tthis.lastMarshalFromViewTimestamp = this.pict.log.getTimeStamp();\n\t\treturn true;\n\t}\n\n\t/**\n\t * Marshals data from the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tmarshalFromViewAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : null;\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalFromViewAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\n\t\ttmpAnticipate.anticipate(this.onBeforeMarshalFromViewAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onMarshalFromViewAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterMarshalFromViewAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} marshalFromViewAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastMarshalFromViewTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after data is marshaled from the view.\n\t */\n\tonAfterMarshalFromView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterMarshalFromView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after data is marshaled from the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonAfterMarshalFromViewAsync(fCallback)\n\t{\n\t\tthis.onAfterMarshalFromView();\n\t\treturn fCallback();\n\t}\n\n\t/* -------------------------------------------------------------------------- */\n\t/* Code Section: Marshal To View */\n\t/* -------------------------------------------------------------------------- */\n\t/**\n\t * Lifecycle hook that triggers before data is marshaled into the view.\n\t */\n\tonBeforeMarshalToView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onBeforeMarshalToView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers before data is marshaled into the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonBeforeMarshalToViewAsync(fCallback)\n\t{\n\t\tthis.onBeforeMarshalToView();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when data is marshaled into the view.\n\t */\n\tonMarshalToView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onMarshalToView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers when data is marshaled into the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonMarshalToViewAsync(fCallback)\n\t{\n\t\tthis.onMarshalToView();\n\t\treturn fCallback();\n\t}\n\n\t/**\n\t * Marshals data into the view.\n\t *\n\t * @return {boolean} - True if the operation was successful, false otherwise.\n\t */\n\tmarshalToView()\n\t{\n\t\tif (this.pict.LogNoisiness > 2)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} executing solve() function...`);\n\t\t}\n\t\tthis.onBeforeMarshalToView();\n\t\tthis.onMarshalToView();\n\t\tthis.onAfterMarshalToView();\n\t\tthis.lastMarshalToViewTimestamp = this.pict.log.getTimeStamp();\n\t\treturn true;\n\t}\n\n\t/**\n\t * Marshals data into the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tmarshalToViewAsync(fCallback)\n\t{\n\t\tlet tmpAnticipate = this.pict.instantiateServiceProviderWithoutRegistration('Anticipate');\n\n\n\t\t/** @type {ErrorCallback} */\n\t\tlet tmpCallback = (typeof(fCallback) === 'function') ? fCallback : null;\n\t\tif (!tmpCallback)\n\t\t{\n\t\t\tthis.log.warn(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewAsync was called without a valid callback. A callback will be generated but this could lead to race conditions.`);\n\t\t\ttmpCallback = (pError) =>\n\t\t\t\t{\n\t\t\t\t\tif (pError)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.log.error(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.Name} marshalToViewAsync Auto Callback Error: ${pError}`, pError);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t}\n\t\ttmpAnticipate.anticipate(this.onBeforeMarshalToViewAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onMarshalToViewAsync.bind(this));\n\t\ttmpAnticipate.anticipate(this.onAfterMarshalToViewAsync.bind(this));\n\n\t\ttmpAnticipate.wait(\n\t\t\t(pError) =>\n\t\t\t{\n\t\t\t\tif (this.pict.LogNoisiness > 2)\n\t\t\t\t{\n\t\t\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} marshalToViewAsync() complete.`);\n\t\t\t\t}\n\t\t\t\tthis.lastMarshalToViewTimestamp = this.pict.log.getTimeStamp();\n\t\t\t\treturn tmpCallback(pError);\n\t\t\t});\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after data is marshaled into the view.\n\t */\n\tonAfterMarshalToView()\n\t{\n\t\tif (this.pict.LogNoisiness > 3)\n\t\t{\n\t\t\tthis.log.trace(`PictView [${this.UUID}]::[${this.Hash}] ${this.options.ViewIdentifier} onAfterMarshalToView:`);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Lifecycle hook that triggers after data is marshaled into the view (async flow).\n\t *\n\t * @param {ErrorCallback} fCallback - The callback to call when the async operation is complete.\n\t */\n\tonAfterMarshalToViewAsync(fCallback)\n\t{\n\t\tthis.onAfterMarshalToView();\n\t\treturn fCallback();\n\t}\n\n\t/** @return {boolean} - True if the object is a PictView. */\n\tget isPictView()\n\t{\n\t\treturn true;\n\t}\n}\n\nmodule.exports = PictView;\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","module.exports={\n\t\"Name\": \"Retold Comprehension Loader\",\n\t\"Hash\": \"ComprehensionLoader\",\n\t\"MainViewportViewIdentifier\": \"ComprehensionLoader-Layout\",\n\t\"MainViewportDestinationAddress\": \"#ComprehensionLoader-Application-Container\",\n\t\"MainViewportDefaultDataAddress\": \"AppData.ComprehensionLoader\",\n\t\"pict_configuration\": { \"Product\": \"ComprehensionLoader\" },\n\t\"AutoRenderMainViewportViewAfterInitialize\": false\n}\n","const libPictApplication = require('pict-application');\n\nconst libProvider = require('./providers/Pict-Provider-ComprehensionLoader.js');\n\nconst libViewLayout = require('./views/PictView-ComprehensionLoader-Layout.js');\nconst libViewSession = require('./views/PictView-ComprehensionLoader-Session.js');\nconst libViewSchema = require('./views/PictView-ComprehensionLoader-Schema.js');\nconst libViewSource = require('./views/PictView-ComprehensionLoader-Source.js');\nconst libViewLoad = require('./views/PictView-ComprehensionLoader-Load.js');\nconst libViewHistogram = require('pict-section-histogram');\n\nclass ComprehensionLoaderApplication extends libPictApplication\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\n\t\t// Register provider\n\t\tthis.pict.addProvider('ComprehensionLoader', libProvider.default_configuration, libProvider);\n\n\t\t// Register views\n\t\tthis.pict.addView('ComprehensionLoader-Layout', libViewLayout.default_configuration, libViewLayout);\n\t\tthis.pict.addView('ComprehensionLoader-Session', libViewSession.default_configuration, libViewSession);\n\t\tthis.pict.addView('ComprehensionLoader-Schema', libViewSchema.default_configuration, libViewSchema);\n\t\tthis.pict.addView('ComprehensionLoader-Source', libViewSource.default_configuration, libViewSource);\n\t\tthis.pict.addView('ComprehensionLoader-Load', libViewLoad.default_configuration, libViewLoad);\n\t\tthis.pict.addView('ComprehensionLoader-StatusHistogram',\n\t\t\t{\n\t\t\t\tViewIdentifier: 'ComprehensionLoader-StatusHistogram',\n\t\t\t\tTargetElementAddress: '#ComprehensionLoader-Throughput-Histogram',\n\t\t\t\tDefaultDestinationAddress: '#ComprehensionLoader-Throughput-Histogram',\n\t\t\t\tRenderOnLoad: false,\n\t\t\t\tSelectable: false,\n\t\t\t\tOrientation: 'vertical',\n\t\t\t\tFillContainer: true,\n\t\t\t\tShowValues: false,\n\t\t\t\tShowLabels: true,\n\t\t\t\tMaxBarSize: 80,\n\t\t\t\tBarColor: '#4a90d9',\n\t\t\t\tBins: []\n\t\t\t}, libViewHistogram);\n\t}\n\n\tonAfterInitializeAsync(fCallback)\n\t{\n\t\t// Centralized state\n\t\tthis.pict.AppData.ComprehensionLoader =\n\t\t{\n\t\t\tFetchedEntities: [],\n\t\t\tLastReport: null,\n\t\t\tServerBusyAtLoad: false,\n\t\t\tLoadPollTimer: null,\n\t\t\tLiveStatusTimer: null,\n\t\t\tStatusDetailExpanded: false,\n\t\t\tStatusDetailTimer: null,\n\t\t\tStatusDetailData: null,\n\t\t\tLastLiveStatus: null,\n\t\t\tPersistFields: [\n\t\t\t\t'serverURL', 'authMethod', 'authURI', 'checkURI',\n\t\t\t\t'cookieName', 'cookieValueAddr', 'cookieValueTemplate', 'loginMarker',\n\t\t\t\t'userName', 'password', 'schemaURL',\n\t\t\t\t'comprehensionSourceMode', 'comprehensionURL'\n\t\t\t]\n\t\t};\n\n\t\t// Make pict available for inline onclick handlers\n\t\twindow.pict = this.pict;\n\n\t\t// Render layout (which chains child view renders via onAfterRender)\n\t\tthis.pict.views['ComprehensionLoader-Layout'].render();\n\n\t\t// Post-render initialization\n\t\tthis.pict.providers.ComprehensionLoader.initPersistence();\n\t\tthis.pict.providers.ComprehensionLoader.startLiveStatusPolling();\n\t\tthis.pict.providers.ComprehensionLoader.initAccordionPreviews();\n\t\tthis.pict.providers.ComprehensionLoader.updateAllPreviews();\n\t\tthis.pict.views['ComprehensionLoader-Layout'].collapseAllSections();\n\t\tthis.pict.providers.ComprehensionLoader.initAutoProcess();\n\n\t\treturn fCallback();\n\t}\n}\n\nmodule.exports = ComprehensionLoaderApplication;\n\nmodule.exports.default_configuration = require('./Pict-Application-ComprehensionLoader-Configuration.json');\n","module.exports = { ComprehensionLoaderApplication: require('./Pict-Application-ComprehensionLoader.js') };\n\nif (typeof(window) !== 'undefined')\n{\n\twindow.ComprehensionLoaderApplication = module.exports.ComprehensionLoaderApplication;\n}\n","const libPictProvider = require('pict-provider');\n\nclass ComprehensionLoaderProvider extends libPictProvider\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\t// ================================================================\n\t// API Helper\n\t// ================================================================\n\n\tapi(pMethod, pPath, pBody)\n\t{\n\t\tlet tmpOpts = { method: pMethod, headers: {} };\n\t\tif (pBody)\n\t\t{\n\t\t\ttmpOpts.headers['Content-Type'] = 'application/json';\n\t\t\ttmpOpts.body = JSON.stringify(pBody);\n\t\t}\n\t\treturn fetch(pPath, tmpOpts).then(function(pResponse) { return pResponse.json(); });\n\t}\n\n\tsetStatus(pElementId, pMessage, pType)\n\t{\n\t\tlet tmpEl = document.getElementById(pElementId);\n\t\tif (!tmpEl) return;\n\t\ttmpEl.className = 'status ' + (pType || 'info');\n\t\ttmpEl.textContent = pMessage;\n\t\ttmpEl.style.display = 'block';\n\t}\n\n\tescapeHtml(pStr)\n\t{\n\t\tlet tmpDiv = document.createElement('div');\n\t\ttmpDiv.appendChild(document.createTextNode(pStr));\n\t\treturn tmpDiv.innerHTML;\n\t}\n\n\t// ================================================================\n\t// Phase status indicators\n\t// ================================================================\n\n\tsetSectionPhase(pSection, pState)\n\t{\n\t\tlet tmpEl = document.getElementById('phase' + pSection);\n\t\tif (!tmpEl) return;\n\n\t\ttmpEl.className = 'accordion-phase';\n\n\t\tif (pState === 'ok')\n\t\t{\n\t\t\ttmpEl.innerHTML = '&#10003;';\n\t\t\ttmpEl.classList.add('visible', 'accordion-phase-ok');\n\t\t}\n\t\telse if (pState === 'error')\n\t\t{\n\t\t\ttmpEl.innerHTML = '&#10007;';\n\t\t\ttmpEl.classList.add('visible', 'accordion-phase-error');\n\t\t}\n\t\telse if (pState === 'busy')\n\t\t{\n\t\t\ttmpEl.innerHTML = '<span class=\"phase-spinner\"></span>';\n\t\t\ttmpEl.classList.add('visible', 'accordion-phase-busy');\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpEl.innerHTML = '';\n\t\t}\n\t}\n\n\t// ================================================================\n\t// Accordion Previews\n\t// ================================================================\n\n\tupdateAllPreviews()\n\t{\n\t\t// Section 1 — Remote Session\n\t\tlet tmpServerURL = document.getElementById('serverURL');\n\t\tif (!tmpServerURL) return;\n\t\ttmpServerURL = tmpServerURL.value;\n\t\tlet tmpUserName = document.getElementById('userName').value;\n\t\tif (tmpServerURL)\n\t\t{\n\t\t\tlet tmpPreview1 = tmpServerURL;\n\t\t\tif (tmpUserName) tmpPreview1 += ' as ' + tmpUserName;\n\t\t\tdocument.getElementById('preview1').textContent = tmpPreview1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdocument.getElementById('preview1').textContent = 'Configure remote server URL and credentials';\n\t\t}\n\n\t\t// Section 2 — Remote Schema\n\t\tlet tmpEntities = this.pict.AppData.ComprehensionLoader.FetchedEntities || [];\n\t\tif (tmpEntities.length > 0)\n\t\t{\n\t\t\tdocument.getElementById('preview2').textContent = tmpEntities.length + ' entit' + (tmpEntities.length === 1 ? 'y' : 'ies') + ' discovered';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet tmpSchemaURL = document.getElementById('schemaURL').value;\n\t\t\tif (tmpSchemaURL)\n\t\t\t{\n\t\t\t\tdocument.getElementById('preview2').textContent = 'Schema from ' + tmpSchemaURL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdocument.getElementById('preview2').textContent = 'Fetch entity schema from the remote server';\n\t\t\t}\n\t\t}\n\n\t\t// Section 3 — Comprehension Source\n\t\tlet tmpSourceMode = document.querySelector('input[name=\"comprehensionSourceMode\"]:checked');\n\t\tlet tmpModeName = tmpSourceMode ? tmpSourceMode.value : 'url';\n\t\tif (tmpModeName === 'url')\n\t\t{\n\t\t\tlet tmpURL = document.getElementById('comprehensionURL').value;\n\t\t\tif (tmpURL)\n\t\t\t{\n\t\t\t\tdocument.getElementById('preview3').textContent = 'URL: ' + tmpURL;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdocument.getElementById('preview3').textContent = 'Provide a comprehension JSON URL or upload files';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdocument.getElementById('preview3').textContent = 'File upload mode';\n\t\t}\n\n\t\t// Section 4 — Load\n\t\tlet tmpPreview4El = document.getElementById('preview4');\n\t\tif (tmpPreview4El)\n\t\t{\n\t\t\ttmpPreview4El.textContent = 'Push comprehension data to the remote server';\n\t\t}\n\t}\n\n\tinitAccordionPreviews()\n\t{\n\t\tlet tmpSelf = this;\n\n\t\tlet tmpPreviewFields = [\n\t\t\t'serverURL', 'userName',\n\t\t\t'schemaURL',\n\t\t\t'comprehensionURL'\n\t\t];\n\n\t\tlet tmpHandler = function() { tmpSelf.updateAllPreviews(); };\n\n\t\tfor (let i = 0; i < tmpPreviewFields.length; i++)\n\t\t{\n\t\t\tlet tmpEl = document.getElementById(tmpPreviewFields[i]);\n\t\t\tif (tmpEl)\n\t\t\t{\n\t\t\t\ttmpEl.addEventListener('input', tmpHandler);\n\t\t\t\ttmpEl.addEventListener('change', tmpHandler);\n\t\t\t}\n\t\t}\n\n\t\tdocument.querySelectorAll('input[name=\"comprehensionSourceMode\"]').forEach(function(pEl)\n\t\t{\n\t\t\tpEl.addEventListener('change', tmpHandler);\n\t\t});\n\t}\n\n\t// ================================================================\n\t// LocalStorage Persistence\n\t// ================================================================\n\n\tsaveField(pFieldId)\n\t{\n\t\tlet tmpEl = document.getElementById(pFieldId);\n\t\tif (tmpEl)\n\t\t{\n\t\t\tlocalStorage.setItem('comprehensionLoader_' + pFieldId, tmpEl.value);\n\t\t}\n\t}\n\n\trestoreFields()\n\t{\n\t\tlet tmpPersistFields = this.pict.AppData.ComprehensionLoader.PersistFields;\n\t\tfor (let i = 0; i < tmpPersistFields.length; i++)\n\t\t{\n\t\t\tlet tmpId = tmpPersistFields[i];\n\t\t\tlet tmpSaved = localStorage.getItem('comprehensionLoader_' + tmpId);\n\t\t\tif (tmpSaved !== null)\n\t\t\t{\n\t\t\t\tlet tmpEl = document.getElementById(tmpId);\n\t\t\t\tif (tmpEl) tmpEl.value = tmpSaved;\n\t\t\t}\n\t\t}\n\n\t\t// Restore source mode radio\n\t\tlet tmpSourceMode = localStorage.getItem('comprehensionLoader_comprehensionSourceMode');\n\t\tif (tmpSourceMode === 'file')\n\t\t{\n\t\t\tlet tmpFileRadio = document.getElementById('sourceMode_file');\n\t\t\tif (tmpFileRadio) tmpFileRadio.checked = true;\n\t\t}\n\t}\n\n\tinitPersistence()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.restoreFields();\n\n\t\tlet tmpPersistFields = this.pict.AppData.ComprehensionLoader.PersistFields;\n\t\tfor (let i = 0; i < tmpPersistFields.length; i++)\n\t\t{\n\t\t\t(function(pId)\n\t\t\t{\n\t\t\t\tlet tmpEl = document.getElementById(pId);\n\t\t\t\tif (tmpEl)\n\t\t\t\t{\n\t\t\t\t\ttmpEl.addEventListener('input', function() { tmpSelf.saveField(pId); });\n\t\t\t\t\ttmpEl.addEventListener('change', function() { tmpSelf.saveField(pId); });\n\t\t\t\t}\n\t\t\t})(tmpPersistFields[i]);\n\t\t}\n\n\t\t// Persist source mode radio\n\t\tdocument.querySelectorAll('input[name=\"comprehensionSourceMode\"]').forEach(function(pEl)\n\t\t{\n\t\t\tpEl.addEventListener('change', function()\n\t\t\t{\n\t\t\t\tlocalStorage.setItem('comprehensionLoader_comprehensionSourceMode', this.value);\n\t\t\t});\n\t\t});\n\n\t\t// Persist auto-process checkboxes\n\t\tlet tmpAutoIds = ['auto1', 'auto2', 'auto3', 'auto4'];\n\t\tfor (let a = 0; a < tmpAutoIds.length; a++)\n\t\t{\n\t\t\t(function(pId)\n\t\t\t{\n\t\t\t\tlet tmpEl = document.getElementById(pId);\n\t\t\t\tif (tmpEl)\n\t\t\t\t{\n\t\t\t\t\tlet tmpSaved = localStorage.getItem('comprehensionLoader_' + pId);\n\t\t\t\t\tif (tmpSaved !== null) tmpEl.checked = tmpSaved === 'true';\n\t\t\t\t\ttmpEl.addEventListener('change', function()\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalStorage.setItem('comprehensionLoader_' + pId, this.checked);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})(tmpAutoIds[a]);\n\t\t}\n\t}\n\n\t// ================================================================\n\t// Live Status Indicator\n\t// ================================================================\n\n\tstartLiveStatusPolling()\n\t{\n\t\tlet tmpAppData = this.pict.AppData.ComprehensionLoader;\n\t\tif (tmpAppData.LiveStatusTimer) clearInterval(tmpAppData.LiveStatusTimer);\n\t\tthis.pollLiveStatus();\n\t\tlet tmpSelf = this;\n\t\ttmpAppData.LiveStatusTimer = setInterval(function() { tmpSelf.pollLiveStatus(); }, 1500);\n\t}\n\n\tpollLiveStatus()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.api('GET', '/comprehension_load/load/live-status')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.renderLiveStatus(pData);\n\t\t\t})\n\t\t\t.catch(function()\n\t\t\t{\n\t\t\t\ttmpSelf.renderLiveStatus({ Phase: 'disconnected', Message: 'Cannot reach server', TotalPushed: 0, TotalRecords: 0 });\n\t\t\t});\n\t}\n\n\trenderLiveStatus(pData)\n\t{\n\t\t// Cache the live status data for the detail view\n\t\tthis.pict.AppData.ComprehensionLoader.LastLiveStatus = pData;\n\n\t\tlet tmpBar = document.getElementById('liveStatusBar');\n\t\tlet tmpMsg = document.getElementById('liveStatusMessage');\n\t\tlet tmpMeta = document.getElementById('liveStatusMeta');\n\t\tlet tmpProgressFill = document.getElementById('liveStatusProgressFill');\n\t\tif (!tmpBar) return;\n\n\t\t// Update phase class (preserve expanded class if present)\n\t\tlet tmpWasExpanded = tmpBar.classList.contains('expanded');\n\t\ttmpBar.className = 'live-status-bar phase-' + (pData.Phase || 'idle');\n\t\tif (tmpWasExpanded) tmpBar.classList.add('expanded');\n\n\t\t// Update message\n\t\ttmpMsg.textContent = pData.Message || 'Idle';\n\n\t\t// Update meta info\n\t\tlet tmpMetaParts = [];\n\t\tif (pData.Phase === 'loading' || pData.Phase === 'stopping')\n\t\t{\n\t\t\tif (pData.Elapsed)\n\t\t\t{\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\">\\u23F1 ' + pData.Elapsed + '</span>');\n\t\t\t}\n\t\t\tif (pData.ETA)\n\t\t\t{\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\">~' + pData.ETA + ' remaining</span>');\n\t\t\t}\n\t\t\tif (pData.TotalEntities > 0)\n\t\t\t{\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\"><strong>' + pData.Completed + '</strong> / ' + pData.TotalEntities + ' entities</span>');\n\t\t\t}\n\t\t\tif (pData.TotalPushed > 0)\n\t\t\t{\n\t\t\t\tlet tmpPushed = pData.TotalPushed.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\t\t\t\tif (pData.TotalRecords > 0)\n\t\t\t\t{\n\t\t\t\t\tlet tmpTotal = pData.TotalRecords.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\t\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\"><strong>' + tmpPushed + '</strong> / ' + tmpTotal + ' records</span>');\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\"><strong>' + tmpPushed + '</strong> records</span>');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pData.Errors > 0)\n\t\t\t{\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\" style=\"color:#dc3545\"><strong>' + pData.Errors + '</strong> error' + (pData.Errors === 1 ? '' : 's') + '</span>');\n\t\t\t}\n\t\t}\n\t\telse if (pData.Phase === 'complete')\n\t\t{\n\t\t\tif (pData.TotalPushed > 0)\n\t\t\t{\n\t\t\t\tlet tmpPushed = pData.TotalPushed.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\t\t\t\ttmpMetaParts.push('<span class=\"live-status-meta-item\"><strong>' + tmpPushed + '</strong> records pushed</span>');\n\t\t\t}\n\t\t}\n\t\ttmpMeta.innerHTML = tmpMetaParts.join('');\n\n\t\t// Update progress bar\n\t\tlet tmpPct = 0;\n\t\tif (pData.Phase === 'loading' && pData.TotalRecords > 0 && pData.TotalPushed > 0)\n\t\t{\n\t\t\ttmpPct = Math.min((pData.TotalPushed / pData.TotalRecords) * 100, 99.9);\n\t\t}\n\t\telse if (pData.Phase === 'loading' && pData.TotalEntities > 0)\n\t\t{\n\t\t\ttmpPct = (pData.Completed / pData.TotalEntities) * 100;\n\t\t}\n\t\telse if (pData.Phase === 'complete')\n\t\t{\n\t\t\ttmpPct = 100;\n\t\t}\n\t\ttmpProgressFill.style.width = Math.min(100, Math.round(tmpPct)) + '%';\n\n\t\t// Auto-expand the detail view when load starts\n\t\tif ((pData.Phase === 'loading' || pData.Phase === 'stopping') && !this.pict.AppData.ComprehensionLoader.StatusDetailExpanded)\n\t\t{\n\t\t\tlet tmpLayoutView = this.pict.views['ComprehensionLoader-Layout'];\n\t\t\tif (tmpLayoutView && typeof tmpLayoutView.toggleStatusDetail === 'function')\n\t\t\t{\n\t\t\t\ttmpLayoutView.toggleStatusDetail();\n\t\t\t}\n\t\t}\n\n\t\t// If the detail view is expanded, re-render it with fresh data\n\t\tif (this.pict.AppData.ComprehensionLoader.StatusDetailExpanded)\n\t\t{\n\t\t\tthis.renderStatusDetail();\n\t\t}\n\n\t\t// Auto-fetch the load report when we detect a completed load but haven't loaded the report yet\n\t\tif (pData.Phase === 'complete' && !this.pict.AppData.ComprehensionLoader.LastReport)\n\t\t{\n\t\t\tlet tmpSelf = this;\n\t\t\tthis.api('GET', '/comprehension_load/load/report')\n\t\t\t\t.then(function(pReportData)\n\t\t\t\t{\n\t\t\t\t\tif (pReportData && pReportData.ReportVersion)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmpSelf.pict.AppData.ComprehensionLoader.LastReport = pReportData;\n\t\t\t\t\t\tif (tmpSelf.pict.AppData.ComprehensionLoader.StatusDetailExpanded)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.renderStatusDetail();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(function() { /* ignore fetch errors */ });\n\t\t}\n\t}\n\n\t// ================================================================\n\t// Status Detail Expansion\n\t// ================================================================\n\n\tonStatusDetailExpanded()\n\t{\n\t\tlet tmpAppData = this.pict.AppData.ComprehensionLoader;\n\t\ttmpAppData.StatusDetailExpanded = true;\n\n\t\t// Immediate render from whatever data we have\n\t\tthis.renderStatusDetail();\n\n\t\t// Start detail polling (poll /load/status for per-entity data)\n\t\tif (tmpAppData.StatusDetailTimer) clearInterval(tmpAppData.StatusDetailTimer);\n\t\tlet tmpSelf = this;\n\t\ttmpAppData.StatusDetailTimer = setInterval(function() { tmpSelf.pollStatusDetail(); }, 2000);\n\t\tthis.pollStatusDetail();\n\t}\n\n\tonStatusDetailCollapsed()\n\t{\n\t\tlet tmpAppData = this.pict.AppData.ComprehensionLoader;\n\t\ttmpAppData.StatusDetailExpanded = false;\n\n\t\tif (tmpAppData.StatusDetailTimer)\n\t\t{\n\t\t\tclearInterval(tmpAppData.StatusDetailTimer);\n\t\t\ttmpAppData.StatusDetailTimer = null;\n\t\t}\n\t}\n\n\tpollStatusDetail()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.api('GET', '/comprehension_load/load/status')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.AppData.ComprehensionLoader.StatusDetailData = pData;\n\t\t\t\ttmpSelf.renderStatusDetail();\n\t\t\t})\n\t\t\t.catch(function() { /* ignore poll errors */ });\n\t}\n\n\trenderStatusDetail()\n\t{\n\t\tlet tmpContainer = document.getElementById('ComprehensionLoader-StatusDetail-Container');\n\t\tif (!tmpContainer) return;\n\n\t\tlet tmpAppData = this.pict.AppData.ComprehensionLoader;\n\t\tlet tmpLiveStatus = tmpAppData.LastLiveStatus;\n\t\tlet tmpStatusData = tmpAppData.StatusDetailData;\n\t\tlet tmpReport = tmpAppData.LastReport;\n\n\t\t// Determine data source: live during load, report after load\n\t\tlet tmpEntities = {};\n\t\tlet tmpThroughputSamples = [];\n\t\tlet tmpIsLive = false;\n\n\t\tif (tmpLiveStatus && (tmpLiveStatus.Phase === 'loading' || tmpLiveStatus.Phase === 'stopping'))\n\t\t{\n\t\t\ttmpIsLive = true;\n\t\t\tif (tmpStatusData && tmpStatusData.Entities) tmpEntities = tmpStatusData.Entities;\n\t\t\tif (tmpLiveStatus.ThroughputSamples) tmpThroughputSamples = tmpLiveStatus.ThroughputSamples;\n\t\t}\n\t\telse if (tmpReport && tmpReport.ReportVersion)\n\t\t{\n\t\t\t// Build entities object from report\n\t\t\tfor (let i = 0; i < tmpReport.Entities.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpE = tmpReport.Entities[i];\n\t\t\t\ttmpEntities[tmpE.Name] = tmpE;\n\t\t\t}\n\t\t\ttmpThroughputSamples = tmpReport.ThroughputSamples || [];\n\t\t}\n\t\telse if (tmpStatusData && tmpStatusData.Entities)\n\t\t{\n\t\t\ttmpEntities = tmpStatusData.Entities;\n\t\t\tif (tmpLiveStatus && tmpLiveStatus.ThroughputSamples)\n\t\t\t{\n\t\t\t\ttmpThroughputSamples = tmpLiveStatus.ThroughputSamples;\n\t\t\t}\n\t\t}\n\n\t\t// Categorize entities\n\t\tlet tmpRunning = [];\n\t\tlet tmpPending = [];\n\t\tlet tmpCompleted = [];\n\t\tlet tmpErrors = [];\n\t\tlet tmpEntityNames = Object.keys(tmpEntities);\n\n\t\tfor (let i = 0; i < tmpEntityNames.length; i++)\n\t\t{\n\t\t\tlet tmpName = tmpEntityNames[i];\n\t\t\tlet tmpE = tmpEntities[tmpName];\n\t\t\tif (tmpE.Status === 'Pushing')\n\t\t\t{\n\t\t\t\ttmpRunning.push({ Name: tmpName, Data: tmpE });\n\t\t\t}\n\t\t\telse if (tmpE.Status === 'Pending')\n\t\t\t{\n\t\t\t\ttmpPending.push(tmpName);\n\t\t\t}\n\t\t\telse if (tmpE.Status === 'Complete')\n\t\t\t{\n\t\t\t\ttmpCompleted.push({ Name: tmpName, Data: tmpE });\n\t\t\t}\n\t\t\telse if (tmpE.Status === 'Error')\n\t\t\t{\n\t\t\t\ttmpErrors.push({ Name: tmpName, Data: tmpE });\n\t\t\t}\n\t\t}\n\n\t\tlet tmpHtml = '';\n\n\t\t// === Section 1: Running Operations ===\n\t\tif (tmpRunning.length > 0 || tmpPending.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"status-detail-section\">';\n\t\t\ttmpHtml += '<div class=\"status-detail-section-title\">Running</div>';\n\t\t\tfor (let i = 0; i < tmpRunning.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpOp = tmpRunning[i];\n\t\t\t\tlet tmpPct = tmpOp.Data.Total > 0 ? Math.round((tmpOp.Data.Pushed / tmpOp.Data.Total) * 100) : 0;\n\t\t\t\tlet tmpPushedFmt = this.formatNumber(tmpOp.Data.Pushed || 0);\n\t\t\t\tlet tmpTotalFmt = this.formatNumber(tmpOp.Data.Total || 0);\n\t\t\t\ttmpHtml += '<div class=\"running-op-row\">';\n\t\t\t\ttmpHtml += ' <div class=\"running-op-name\">' + this.escapeHtml(tmpOp.Name) + '</div>';\n\t\t\t\ttmpHtml += ' <div class=\"running-op-bar\"><div class=\"running-op-bar-fill\" style=\"width:' + tmpPct + '%\"></div></div>';\n\t\t\t\ttmpHtml += ' <div class=\"running-op-count\">' + tmpPushedFmt + ' / ' + tmpTotalFmt + ' (' + tmpPct + '%)</div>';\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t}\n\t\t\tif (tmpPending.length > 0)\n\t\t\t{\n\t\t\t\ttmpHtml += '<div class=\"running-op-pending\">' + tmpPending.length + ' entit' + (tmpPending.length === 1 ? 'y' : 'ies') + ' waiting</div>';\n\t\t\t}\n\t\t\ttmpHtml += '</div>';\n\t\t}\n\n\t\t// === Section 2: Completed Operations ===\n\t\tif (tmpCompleted.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"status-detail-section\">';\n\t\t\ttmpHtml += '<div class=\"status-detail-section-title\">Completed (' + tmpCompleted.length + ')</div>';\n\t\t\tfor (let i = 0; i < tmpCompleted.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpOp = tmpCompleted[i];\n\t\t\t\tlet tmpPushedFmt = this.formatNumber(tmpOp.Data.Pushed || tmpOp.Data.Total || 0);\n\t\t\t\ttmpHtml += '<div class=\"completed-op-row\">';\n\t\t\t\ttmpHtml += '<div class=\"completed-op-header\">';\n\t\t\t\ttmpHtml += ' <span class=\"completed-op-checkmark\">\\u2713</span>';\n\t\t\t\ttmpHtml += ' <span class=\"completed-op-name\">' + this.escapeHtml(tmpOp.Name) + '</span>';\n\t\t\t\ttmpHtml += ' <span class=\"completed-op-stats\">' + tmpPushedFmt + ' records</span>';\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t}\n\t\t\ttmpHtml += '</div>';\n\t\t}\n\n\t\t// === Section 3: Errors ===\n\t\tif (tmpErrors.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"status-detail-section\">';\n\t\t\ttmpHtml += '<div class=\"status-detail-section-title\">Errors (' + tmpErrors.length + ')</div>';\n\t\t\tfor (let i = 0; i < tmpErrors.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpOp = tmpErrors[i];\n\t\t\t\tlet tmpPushedFmt = this.formatNumber(tmpOp.Data.Pushed || 0);\n\t\t\t\tlet tmpTotalFmt = this.formatNumber(tmpOp.Data.Total || 0);\n\t\t\t\ttmpHtml += '<div class=\"error-op-row\">';\n\t\t\t\ttmpHtml += '<div class=\"error-op-header\">';\n\t\t\t\ttmpHtml += ' <span style=\"color:#dc3545\">\\u2717</span>';\n\t\t\t\ttmpHtml += ' <span class=\"error-op-name\">' + this.escapeHtml(tmpOp.Name) + '</span>';\n\t\t\t\ttmpHtml += ' <span class=\"error-op-status\">' + tmpPushedFmt + ' / ' + tmpTotalFmt + '</span>';\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t\tif (tmpOp.Data.ErrorMessage)\n\t\t\t\t{\n\t\t\t\t\ttmpHtml += '<div class=\"error-op-message\">' + this.escapeHtml(tmpOp.Data.ErrorMessage) + '</div>';\n\t\t\t\t}\n\t\t\t\ttmpHtml += '</div>';\n\t\t\t}\n\t\t\ttmpHtml += '</div>';\n\t\t}\n\n\t\tif (tmpHtml === '')\n\t\t{\n\t\t\tif (tmpIsLive)\n\t\t\t{\n\t\t\t\ttmpHtml = '<div style=\"font-size:0.9em; color:#888; padding:8px 0\">Load in progress, waiting for entity data\\u2026</div>';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmpHtml = '<div style=\"font-size:0.9em; color:#888; padding:8px 0\">No load data available. Run a load to see operation details here.</div>';\n\t\t\t}\n\t\t}\n\n\t\ttmpContainer.innerHTML = tmpHtml;\n\n\t\t// Update the throughput histogram\n\t\tthis.updateThroughputHistogram(tmpThroughputSamples);\n\t}\n\n\tupdateThroughputHistogram(pSamples)\n\t{\n\t\tlet tmpHistContainer = document.getElementById('ComprehensionLoader-Throughput-Histogram');\n\t\tif (!tmpHistContainer) return;\n\n\t\tif (!pSamples || pSamples.length < 2)\n\t\t{\n\t\t\ttmpHistContainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\t// Compute raw deltas per interval\n\t\tlet tmpRawDeltas = [];\n\t\tfor (let i = 1; i < pSamples.length; i++)\n\t\t{\n\t\t\tlet tmpDelta = pSamples[i].pushed - pSamples[i - 1].pushed;\n\t\t\tif (tmpDelta < 0) tmpDelta = 0;\n\t\t\ttmpRawDeltas.push({ delta: tmpDelta, t: pSamples[i].t });\n\t\t}\n\n\t\t// Downsample if too many bars\n\t\tlet tmpContainerWidth = tmpHistContainer.clientWidth || 800;\n\t\tlet tmpMaxBars = Math.max(20, Math.floor(tmpContainerWidth / 6));\n\t\tlet tmpAggregated = tmpRawDeltas;\n\n\t\tif (tmpRawDeltas.length > tmpMaxBars)\n\t\t{\n\t\t\tlet tmpBucketSize = Math.ceil(tmpRawDeltas.length / tmpMaxBars);\n\t\t\ttmpAggregated = [];\n\t\t\tfor (let i = 0; i < tmpRawDeltas.length; i += tmpBucketSize)\n\t\t\t{\n\t\t\t\tlet tmpSum = 0;\n\t\t\t\tlet tmpLastT = 0;\n\t\t\t\tfor (let j = i; j < Math.min(i + tmpBucketSize, tmpRawDeltas.length); j++)\n\t\t\t\t{\n\t\t\t\t\ttmpSum += tmpRawDeltas[j].delta;\n\t\t\t\t\ttmpLastT = tmpRawDeltas[j].t;\n\t\t\t\t}\n\t\t\t\ttmpAggregated.push({ delta: tmpSum, t: tmpLastT });\n\t\t\t}\n\t\t}\n\n\t\t// Check for data\n\t\tlet tmpHasData = false;\n\t\tfor (let i = 0; i < tmpAggregated.length; i++)\n\t\t{\n\t\t\tif (tmpAggregated[i].delta > 0) { tmpHasData = true; break; }\n\t\t}\n\t\tif (!tmpHasData)\n\t\t{\n\t\t\ttmpHistContainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\t// Build bins\n\t\tlet tmpStartT = pSamples[0].t;\n\t\tlet tmpBins = [];\n\t\tfor (let i = 0; i < tmpAggregated.length; i++)\n\t\t{\n\t\t\tlet tmpElapsedSec = Math.round((tmpAggregated[i].t - tmpStartT) / 1000);\n\t\t\ttmpBins.push({\n\t\t\t\tLabel: this.formatElapsed(tmpElapsedSec),\n\t\t\t\tValue: tmpAggregated[i].delta\n\t\t\t});\n\t\t}\n\n\t\t// Update the histogram view\n\t\ttmpHistContainer.style.display = '';\n\t\tlet tmpHistView = this.pict.views['ComprehensionLoader-StatusHistogram'];\n\t\tif (tmpHistView)\n\t\t{\n\t\t\ttmpHistView.setBins(tmpBins);\n\t\t\ttmpHistView.renderHistogram();\n\t\t}\n\t}\n\n\tformatElapsed(pSec)\n\t{\n\t\tif (pSec < 60) return pSec + 's';\n\t\tif (pSec < 3600)\n\t\t{\n\t\t\tlet tmpM = Math.floor(pSec / 60);\n\t\t\tlet tmpS = pSec % 60;\n\t\t\treturn tmpM + ':' + (tmpS < 10 ? '0' : '') + tmpS;\n\t\t}\n\t\tlet tmpH = Math.floor(pSec / 3600);\n\t\tlet tmpM = Math.floor((pSec % 3600) / 60);\n\t\treturn tmpH + 'h' + (tmpM < 10 ? '0' : '') + tmpM;\n\t}\n\n\tformatCompact(pNum)\n\t{\n\t\tif (pNum >= 1000000) return (pNum / 1000000).toFixed(1) + 'M';\n\t\tif (pNum >= 10000) return (pNum / 1000).toFixed(0) + 'K';\n\t\tif (pNum >= 1000) return (pNum / 1000).toFixed(1) + 'K';\n\t\treturn pNum.toString();\n\t}\n\n\tformatNumber(pNum)\n\t{\n\t\treturn pNum.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\t}\n\n\t// ================================================================\n\t// Auto-Process\n\t// ================================================================\n\n\tinitAutoProcess()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.api('GET', '/comprehension_load/load/live-status')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\tif (pData.Phase === 'loading' || pData.Phase === 'stopping')\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.AppData.ComprehensionLoader.ServerBusyAtLoad = true;\n\t\t\t\t\ttmpSelf.setSectionPhase(4, 'busy');\n\t\t\t\t\ttmpSelf.pict.views['ComprehensionLoader-Load'].startPolling();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttmpSelf.runAutoProcessChain();\n\t\t\t})\n\t\t\t.catch(function()\n\t\t\t{\n\t\t\t\t// Server unreachable — don't auto-process\n\t\t\t});\n\t}\n\n\trunAutoProcessChain()\n\t{\n\t\tlet tmpSelf = this;\n\t\tlet tmpDelay = 0;\n\t\tlet tmpStepDelay = 2000;\n\n\t\tif (document.getElementById('auto1') && document.getElementById('auto1').checked)\n\t\t{\n\t\t\tsetTimeout(function() { tmpSelf.pict.views['ComprehensionLoader-Session'].goAction(); }, tmpDelay);\n\t\t\ttmpDelay += tmpStepDelay + 1500;\n\t\t}\n\t\tif (document.getElementById('auto2') && document.getElementById('auto2').checked)\n\t\t{\n\t\t\tsetTimeout(function() { tmpSelf.pict.views['ComprehensionLoader-Schema'].fetchSchema(); }, tmpDelay);\n\t\t\ttmpDelay += tmpStepDelay;\n\t\t}\n\t\tif (document.getElementById('auto3') && document.getElementById('auto3').checked)\n\t\t{\n\t\t\tsetTimeout(function() { tmpSelf.pict.views['ComprehensionLoader-Source'].goAction(); }, tmpDelay);\n\t\t\ttmpDelay += tmpStepDelay;\n\t\t}\n\t\tif (document.getElementById('auto4') && document.getElementById('auto4').checked)\n\t\t{\n\t\t\tsetTimeout(function() { tmpSelf.pict.views['ComprehensionLoader-Load'].startLoad(); }, tmpDelay);\n\t\t}\n\t}\n}\n\nmodule.exports = ComprehensionLoaderProvider;\n\nmodule.exports.default_configuration =\n{\n\tProviderIdentifier: 'ComprehensionLoader',\n\tAutoInitialize: true,\n\tAutoInitializeOrdinal: 0\n};\n","const libPictView = require('pict-view');\n\nclass ComprehensionLoaderLayoutView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tonAfterRender()\n\t{\n\t\t// Render all section views into their containers\n\t\tthis.pict.views['ComprehensionLoader-Session'].render();\n\t\tthis.pict.views['ComprehensionLoader-Schema'].render();\n\t\tthis.pict.views['ComprehensionLoader-Source'].render();\n\t\tthis.pict.views['ComprehensionLoader-Load'].render();\n\n\t\tthis.pict.CSSMap.injectCSS();\n\t}\n\n\ttoggleSection(pSectionId)\n\t{\n\t\tlet tmpCard = document.getElementById(pSectionId);\n\t\tif (!tmpCard) return;\n\t\ttmpCard.classList.toggle('open');\n\t}\n\n\texpandAllSections()\n\t{\n\t\tlet tmpCards = document.querySelectorAll('.accordion-card');\n\t\tfor (let i = 0; i < tmpCards.length; i++)\n\t\t{\n\t\t\ttmpCards[i].classList.add('open');\n\t\t}\n\t}\n\n\tcollapseAllSections()\n\t{\n\t\tlet tmpCards = document.querySelectorAll('.accordion-card');\n\t\tfor (let i = 0; i < tmpCards.length; i++)\n\t\t{\n\t\t\ttmpCards[i].classList.remove('open');\n\t\t}\n\t}\n\n\ttoggleStatusDetail()\n\t{\n\t\tlet tmpDetail = document.getElementById('liveStatusDetail');\n\t\tlet tmpMeta = document.getElementById('liveStatusMeta');\n\t\tlet tmpMessage = document.getElementById('liveStatusMessage');\n\t\tlet tmpToggle = document.getElementById('liveStatusToggle');\n\t\tlet tmpBar = document.getElementById('liveStatusBar');\n\t\tif (!tmpDetail) return;\n\n\t\tlet tmpIsExpanded = tmpDetail.style.display !== 'none';\n\n\t\tif (tmpIsExpanded)\n\t\t{\n\t\t\ttmpDetail.style.display = 'none';\n\t\t\ttmpMeta.style.display = '';\n\t\t\ttmpMessage.style.display = '';\n\t\t\ttmpToggle.innerHTML = '&#9660;';\n\t\t\ttmpBar.classList.remove('expanded');\n\t\t\tthis.pict.providers.ComprehensionLoader.onStatusDetailCollapsed();\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmpDetail.style.display = '';\n\t\t\ttmpMeta.style.display = 'none';\n\t\t\ttmpMessage.style.display = 'none';\n\t\t\ttmpToggle.innerHTML = '&#9650;';\n\t\t\ttmpBar.classList.add('expanded');\n\t\t\tthis.pict.providers.ComprehensionLoader.onStatusDetailExpanded();\n\t\t}\n\t}\n}\n\nmodule.exports = ComprehensionLoaderLayoutView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Layout',\n\tDefaultRenderable: 'ComprehensionLoader-Layout',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Application-Container',\n\tCSS: /*css*/`\n* { box-sizing: border-box; margin: 0; padding: 0; }\nbody { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f5f5; color: #333; padding: 20px; }\nh1 { margin-bottom: 20px; color: #1a1a1a; }\nh2 { margin-bottom: 12px; color: #444; font-size: 1.2em; border-bottom: 2px solid #ddd; padding-bottom: 6px; }\n\n.section { background: #fff; border-radius: 8px; padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n\n/* Accordion layout */\n.accordion-row { display: flex; gap: 0; margin-bottom: 16px; align-items: stretch; }\n.accordion-number {\n\tflex: 0 0 48px; display: flex; align-items: flex-start; justify-content: center;\n\tpadding-top: 16px; font-size: 1.6em; font-weight: 700; color: #4a90d9;\n\tuser-select: none;\n}\n.accordion-card {\n\tflex: 1; background: #fff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\toverflow: hidden; min-width: 0;\n}\n.accordion-header {\n\tdisplay: flex; align-items: center; padding: 14px 20px; cursor: pointer;\n\tuser-select: none; gap: 12px; transition: background 0.15s; line-height: 1.4;\n}\n.accordion-header:hover { background: #fafafa; }\n.accordion-title { font-weight: 600; color: #333; font-size: 1.05em; white-space: nowrap; }\n.accordion-preview { flex: 1; font-style: italic; color: #888; font-size: 0.9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.accordion-toggle {\n\tflex: 0 0 20px; display: flex; align-items: center; justify-content: center;\n\tborder-radius: 4px; transition: background 0.15s, transform 0.25s; font-size: 0.7em; color: #888;\n}\n.accordion-header:hover .accordion-toggle { background: #eee; color: #555; }\n.accordion-card.open .accordion-toggle { transform: rotate(180deg); }\n.accordion-body { padding: 0 20px 20px; display: none; }\n.accordion-card.open .accordion-body { display: block; }\n.accordion-card.open .accordion-header { border-bottom: 1px solid #eee; }\n.accordion-card.open .accordion-preview { display: none; }\n\n/* Action controls (go link + auto checkbox) */\n.accordion-actions { display: flex; align-items: baseline; gap: 8px; flex-shrink: 0; }\n.accordion-card.open .accordion-actions { display: none; }\n.accordion-go {\n\tfont-size: 0.82em; color: #4a90d9; cursor: pointer; text-decoration: none;\n\tfont-weight: 500; white-space: nowrap; padding: 2px 6px; border-radius: 3px;\n\ttransition: background 0.15s;\n}\n.accordion-go:hover { background: #e8f0fe; text-decoration: underline; }\n.accordion-auto {\n\tfont-size: 0.82em; color: #999; white-space: nowrap; cursor: pointer;\n}\n.accordion-auto .auto-label { display: none; }\n.accordion-auto:hover .auto-label { display: inline; }\n.accordion-auto input[type=\"checkbox\"] { width: auto; margin: 0; cursor: pointer; vertical-align: middle; position: relative; top: 0px; opacity: 0.75; transition: opacity 0.15s; }\n.accordion-auto:hover input[type=\"checkbox\"] { opacity: 1; }\n.accordion-auto:hover { color: #666; }\n\n/* Phase status indicator */\n.accordion-phase {\n\tflex: 0 0 auto; display: none; align-items: center; justify-content: center;\n\tfont-size: 0.85em; line-height: 1;\n}\n.accordion-phase.visible { display: flex; }\n.accordion-phase-ok { color: #28a745; }\n.accordion-phase-error { color: #dc3545; }\n.accordion-phase-busy { color: #28a745; }\n.accordion-phase-busy .phase-spinner {\n\tdisplay: inline-block; width: 14px; height: 14px;\n\tborder: 2px solid #28a745; border-top-color: transparent; border-radius: 50%;\n\tanimation: phase-spin 0.8s linear infinite; vertical-align: middle;\n}\n@keyframes phase-spin {\n\tto { transform: rotate(360deg); }\n}\n\n.accordion-controls {\n\tdisplay: flex; gap: 8px; margin-bottom: 12px; justify-content: flex-end;\n}\n.accordion-controls button {\n\tpadding: 4px 10px; font-size: 0.82em; font-weight: 500; background: none;\n\tborder: 1px solid #ccc; border-radius: 4px; color: #666; cursor: pointer; margin: 0;\n}\n.accordion-controls button:hover { background: #f0f0f0; border-color: #aaa; color: #333; }\n\nlabel { display: block; font-weight: 600; margin-bottom: 4px; font-size: 0.9em; }\ninput[type=\"text\"], input[type=\"password\"], input[type=\"number\"] {\n\twidth: 100%; padding: 8px 12px; border: 1px solid #ccc; border-radius: 4px;\n\tfont-size: 0.95em; margin-bottom: 10px;\n}\ninput[type=\"text\"]:focus, input[type=\"password\"]:focus, input[type=\"number\"]:focus {\n\toutline: none; border-color: #4a90d9;\n}\n\nbutton {\n\tpadding: 8px 16px; border: none; border-radius: 4px; cursor: pointer;\n\tfont-size: 0.9em; font-weight: 600; margin-right: 8px; margin-bottom: 8px;\n}\nbutton.primary { background: #4a90d9; color: #fff; }\nbutton.primary:hover { background: #357abd; }\nbutton.secondary { background: #6c757d; color: #fff; }\nbutton.secondary:hover { background: #5a6268; }\nbutton.danger { background: #dc3545; color: #fff; }\nbutton.danger:hover { background: #c82333; }\nbutton.success { background: #28a745; color: #fff; }\nbutton.success:hover { background: #218838; }\nbutton:disabled { opacity: 0.5; cursor: not-allowed; }\n\n.status { padding: 8px 12px; border-radius: 4px; margin-top: 10px; font-size: 0.9em; }\n.status.ok { background: #d4edda; color: #155724; }\n.status.error { background: #f8d7da; color: #721c24; }\n.status.info { background: #d1ecf1; color: #0c5460; }\n.status.warn { background: #fff3cd; color: #856404; }\n\n.inline-group { display: flex; gap: 8px; align-items: flex-end; margin-bottom: 10px; }\n.inline-group > div { flex: 1; }\n\na { color: #4a90d9; }\n\nselect { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #ccc; border-radius: 4px; font-size: 0.95em; margin-bottom: 10px; }\n\n.checkbox-row { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }\n.checkbox-row input[type=\"checkbox\"] { width: auto; margin: 0; }\n.checkbox-row label { display: inline; margin: 0; font-weight: normal; cursor: pointer; }\n\n/* Live Status Bar */\n.live-status-bar {\n\tbackground: #fff; border-radius: 8px; margin-bottom: 16px;\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tposition: sticky; top: 0; z-index: 100; border-left: 4px solid #6c757d;\n}\n.live-status-bar.phase-idle { border-left-color: #6c757d; }\n.live-status-bar.phase-disconnected { border-left-color: #dc3545; }\n.live-status-bar.phase-ready { border-left-color: #4a90d9; }\n.live-status-bar.phase-loading { border-left-color: #28a745; }\n.live-status-bar.phase-stopping { border-left-color: #ffc107; }\n.live-status-bar.phase-complete { border-left-color: #28a745; }\n\n.live-status-dot {\n\twidth: 12px; height: 12px; border-radius: 50%; flex-shrink: 0;\n\tbackground: #6c757d;\n}\n.live-status-bar.phase-idle .live-status-dot { background: #6c757d; }\n.live-status-bar.phase-disconnected .live-status-dot { background: #dc3545; }\n.live-status-bar.phase-ready .live-status-dot { background: #4a90d9; }\n.live-status-bar.phase-loading .live-status-dot {\n\tbackground: #28a745;\n\tanimation: live-pulse 1.5s ease-in-out infinite;\n}\n.live-status-bar.phase-stopping .live-status-dot {\n\tbackground: #ffc107;\n\tanimation: live-pulse 0.8s ease-in-out infinite;\n}\n.live-status-bar.phase-complete .live-status-dot { background: #28a745; }\n\n@keyframes live-pulse {\n\t0%, 100% { opacity: 1; transform: scale(1); }\n\t50% { opacity: 0.4; transform: scale(0.8); }\n}\n\n.live-status-message { flex: 1; font-size: 0.92em; color: #333; line-height: 1.4; }\n\n.live-status-meta {\n\tdisplay: flex; gap: 16px; flex-shrink: 0; font-size: 0.82em; color: #666;\n}\n.live-status-meta-item { white-space: nowrap; }\n.live-status-meta-item strong { color: #333; }\n\n.live-status-progress-bar {\n\theight: 3px; background: #e9ecef; border-radius: 2px; overflow: hidden;\n\tposition: absolute; bottom: 0; left: 0; right: 0;\n}\n.live-status-progress-fill {\n\theight: 100%; background: #28a745; transition: width 1s ease;\n}\n/* Expandable status bar */\n.live-status-header {\n\tdisplay: flex; align-items: center; gap: 14px; cursor: pointer;\n\tpadding: 14px 20px; user-select: none;\n}\n.live-status-bar.expanded .live-status-header {\n\tborder-bottom: 1px solid #e9ecef; padding-bottom: 10px;\n}\n.live-status-expand-toggle {\n\tflex: 0 0 20px; display: flex; align-items: center; justify-content: center;\n\tfont-size: 0.7em; color: #888; transition: transform 0.25s;\n}\n.live-status-bar.expanded .live-status-expand-toggle { transform: rotate(180deg); }\n\n.live-status-detail {\n\tpadding: 12px 20px 16px; max-height: 60vh; overflow-y: auto;\n}\n\n/* Status Detail Sections */\n.status-detail-section { margin-bottom: 14px; }\n.status-detail-section:last-child { margin-bottom: 0; }\n.status-detail-section-title {\n\tfont-size: 0.85em; font-weight: 600; color: #555; text-transform: uppercase;\n\tletter-spacing: 0.5px; margin-bottom: 8px; padding-bottom: 4px;\n\tborder-bottom: 1px solid #eee;\n}\n\n/* Running Operations */\n.running-op-row {\n\tdisplay: flex; align-items: center; gap: 12px; padding: 6px 0;\n\tfont-size: 0.9em;\n}\n.running-op-name { font-weight: 600; min-width: 180px; }\n.running-op-bar {\n\tflex: 1; height: 8px; background: #e9ecef; border-radius: 4px; overflow: hidden;\n\tmin-width: 120px;\n}\n.running-op-bar-fill { height: 100%; background: #4a90d9; transition: width 0.5s ease; }\n.running-op-count { font-size: 0.85em; color: #666; white-space: nowrap; }\n.running-op-pending { color: #888; font-size: 0.85em; font-style: italic; padding: 4px 0; }\n\n/* Completed Operations */\n.completed-op-row { padding: 8px 0; border-bottom: 1px solid #f0f0f0; }\n.completed-op-row:last-child { border-bottom: none; }\n.completed-op-header {\n\tdisplay: flex; align-items: center; gap: 10px; font-size: 0.9em; margin-bottom: 4px;\n}\n.completed-op-name { font-weight: 600; }\n.completed-op-stats { color: #666; font-size: 0.85em; }\n.completed-op-checkmark { color: #28a745; }\n\n/* Error Operations */\n.error-op-row { padding: 6px 0; border-bottom: 1px solid #f0f0f0; font-size: 0.9em; }\n.error-op-row:last-child { border-bottom: none; }\n.error-op-header { display: flex; align-items: center; gap: 8px; }\n.error-op-name { font-weight: 600; color: #dc3545; }\n.error-op-status { font-size: 0.82em; color: #dc3545; }\n.error-op-message { font-size: 0.82em; color: #888; margin-top: 2px; padding-left: 18px; }\n`,\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Layout',\n\t\t\tTemplate: /*html*/`\n<h1>Retold Comprehension Loader</h1>\n\n<!-- Live Status Bar (Expandable) -->\n<div id=\"liveStatusBar\" class=\"live-status-bar phase-idle\" style=\"position:relative\">\n\t<div class=\"live-status-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleStatusDetail()\">\n\t\t<div class=\"live-status-dot\"></div>\n\t\t<div class=\"live-status-message\" id=\"liveStatusMessage\">Idle</div>\n\t\t<div class=\"live-status-meta\" id=\"liveStatusMeta\"></div>\n\t\t<div class=\"live-status-expand-toggle\" id=\"liveStatusToggle\">&#9660;</div>\n\t</div>\n\t<div class=\"live-status-detail\" id=\"liveStatusDetail\" style=\"display:none\">\n\t\t<div id=\"ComprehensionLoader-Throughput-Histogram\"></div>\n\t\t<div id=\"ComprehensionLoader-StatusDetail-Container\"></div>\n\t</div>\n\t<div class=\"live-status-progress-bar\"><div class=\"live-status-progress-fill\" id=\"liveStatusProgressFill\" style=\"width:0%\"></div></div>\n</div>\n\n<!-- Expand / Collapse All -->\n<div class=\"accordion-controls\">\n\t<button onclick=\"pict.views['ComprehensionLoader-Layout'].expandAllSections()\">Expand All</button>\n\t<button onclick=\"pict.views['ComprehensionLoader-Layout'].collapseAllSections()\">Collapse All</button>\n</div>\n\n<!-- Section containers -->\n<div id=\"ComprehensionLoader-Section-Session\"></div>\n<div id=\"ComprehensionLoader-Section-Schema\"></div>\n<div id=\"ComprehensionLoader-Section-Source\"></div>\n<div id=\"ComprehensionLoader-Section-Load\"></div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Layout',\n\t\t\tTemplateHash: 'ComprehensionLoader-Layout',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Application-Container'\n\t\t}\n\t]\n};\n","const libPictView = require('pict-view');\n\nclass ComprehensionLoaderLoadView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tstartLoad()\n\t{\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(4, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Starting load...', 'info');\n\n\t\t// Clear previous report\n\t\tthis.pict.AppData.ComprehensionLoader.LastReport = null;\n\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/load/start')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\tif (pData.Success)\n\t\t\t\t{\n\t\t\t\t\tlet tmpMsg = 'Load started for ' + pData.Entities.length + ' entities (' + tmpSelf.pict.providers.ComprehensionLoader.formatNumber(pData.TotalRecords) + ' records).';\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', tmpMsg, 'ok');\n\t\t\t\t\ttmpSelf.startPolling();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Load start failed: ' + (pData.Error || 'Unknown error'), 'error');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(4, 'error');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(4, 'error');\n\t\t\t});\n\t}\n\n\tstopLoad()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/load/stop')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Load stop requested.', 'warn');\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t});\n\t}\n\n\tstartPolling()\n\t{\n\t\tif (this.pict.AppData.ComprehensionLoader.LoadPollTimer) clearInterval(this.pict.AppData.ComprehensionLoader.LoadPollTimer);\n\t\tlet tmpSelf = this;\n\t\tthis.pict.AppData.ComprehensionLoader.LoadPollTimer = setInterval(function() { tmpSelf.pollLoadStatus(); }, 2000);\n\t\tthis.pollLoadStatus();\n\t}\n\n\tstopPolling()\n\t{\n\t\tif (this.pict.AppData.ComprehensionLoader.LoadPollTimer)\n\t\t{\n\t\t\tclearInterval(this.pict.AppData.ComprehensionLoader.LoadPollTimer);\n\t\t\tthis.pict.AppData.ComprehensionLoader.LoadPollTimer = null;\n\t\t}\n\t}\n\n\tpollLoadStatus()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('GET', '/comprehension_load/load/status')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.renderLoadProgress(pData);\n\n\t\t\t\tif (!pData.Running)\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.stopPolling();\n\t\t\t\t\tlet tmpEntities = pData.Entities || {};\n\t\t\t\t\tlet tmpNames = Object.keys(tmpEntities);\n\t\t\t\t\tif (tmpNames.length > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet tmpHasErrors = false;\n\t\t\t\t\t\tfor (let i = 0; i < tmpNames.length; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (tmpEntities[tmpNames[i]].Status === 'Error') tmpHasErrors = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tmpHasErrors)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Load finished with errors.', 'error');\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(4, 'error');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('loadStatus', 'Load complete.', 'ok');\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(4, 'ok');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Fetch the structured report\n\t\t\t\t\t\ttmpSelf.fetchLoadReport();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\t// Silently ignore poll errors\n\t\t\t});\n\t}\n\n\tfetchLoadReport()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('GET', '/comprehension_load/load/report')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\tif (pData && pData.ReportVersion)\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.AppData.ComprehensionLoader.LastReport = pData;\n\t\t\t\t\ttmpSelf.renderLoadReport(pData);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\t// Ignore report fetch errors\n\t\t\t});\n\t}\n\n\trenderLoadReport(pReport)\n\t{\n\t\tlet tmpSection = document.getElementById('loadReportSection');\n\t\tif (!tmpSection) return;\n\t\ttmpSection.style.display = '';\n\n\t\tlet tmpCardsContainer = document.getElementById('reportSummaryCards');\n\t\tlet tmpOutcomeClass = 'outcome-' + pReport.Outcome.toLowerCase();\n\t\tlet tmpOutcomeColor = { Success: '#28a745', Partial: '#ffc107', Error: '#dc3545', Stopped: '#6c757d' }[pReport.Outcome] || '#666';\n\n\t\tlet tmpDurationSec = pReport.RunTimestamps.DurationSeconds || 0;\n\t\tlet tmpDurationStr = tmpDurationSec < 60 ? tmpDurationSec + 's' : Math.floor(tmpDurationSec / 60) + 'm ' + (tmpDurationSec % 60) + 's';\n\n\t\tlet tmpTotalPushed = this.pict.providers.ComprehensionLoader.formatNumber(pReport.Summary.TotalPushed);\n\t\tlet tmpTotalRecords = this.pict.providers.ComprehensionLoader.formatNumber(pReport.Summary.TotalRecords);\n\n\t\ttmpCardsContainer.innerHTML = ''\n\t\t\t+ '<div class=\"report-card ' + tmpOutcomeClass + '\">'\n\t\t\t+ ' <div class=\"card-label\">Outcome</div>'\n\t\t\t+ ' <div class=\"card-value\" style=\"color:' + tmpOutcomeColor + '\">' + pReport.Outcome + '</div>'\n\t\t\t+ '</div>'\n\t\t\t+ '<div class=\"report-card\">'\n\t\t\t+ ' <div class=\"card-label\">Duration</div>'\n\t\t\t+ ' <div class=\"card-value\">' + tmpDurationStr + '</div>'\n\t\t\t+ '</div>'\n\t\t\t+ '<div class=\"report-card\">'\n\t\t\t+ ' <div class=\"card-label\">Entities</div>'\n\t\t\t+ ' <div class=\"card-value\">' + pReport.Summary.Complete + ' / ' + pReport.Summary.TotalEntities + '</div>'\n\t\t\t+ '</div>'\n\t\t\t+ '<div class=\"report-card\">'\n\t\t\t+ ' <div class=\"card-label\">Records Pushed</div>'\n\t\t\t+ ' <div class=\"card-value\">' + tmpTotalPushed + '</div>'\n\t\t\t+ ' <div style=\"font-size:0.75em; color:#888\">of ' + tmpTotalRecords + '</div>'\n\t\t\t+ '</div>';\n\n\t\t// Anomalies\n\t\tlet tmpAnomalyContainer = document.getElementById('reportAnomalies');\n\t\tif (pReport.Anomalies.length === 0)\n\t\t{\n\t\t\ttmpAnomalyContainer.innerHTML = '<div style=\"color:#28a745; font-weight:600; font-size:0.9em\">No anomalies detected.</div>';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet tmpHtml = '<h4 style=\"margin:0 0 8px; color:#dc3545; font-size:0.95em\">Anomalies (' + pReport.Anomalies.length + ')</h4>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Type</th><th>Message</th></tr>';\n\t\t\tfor (let i = 0; i < pReport.Anomalies.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpAnomaly = pReport.Anomalies[i];\n\t\t\t\tlet tmpTypeColor = tmpAnomaly.Type === 'Error' ? '#dc3545' : '#6c757d';\n\t\t\t\ttmpHtml += '<tr>';\n\t\t\t\ttmpHtml += '<td><strong>' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpAnomaly.Entity) + '</strong></td>';\n\t\t\t\ttmpHtml += '<td style=\"color:' + tmpTypeColor + '\">' + tmpAnomaly.Type + '</td>';\n\t\t\t\ttmpHtml += '<td>' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpAnomaly.Message) + '</td>';\n\t\t\t\ttmpHtml += '</tr>';\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t\ttmpAnomalyContainer.innerHTML = tmpHtml;\n\t\t}\n\n\t\t// Entity details\n\t\tlet tmpEntityContainer = document.getElementById('reportEntityDetails');\n\t\tif (pReport.Entities && pReport.Entities.length > 0)\n\t\t{\n\t\t\tlet tmpHtml = '<h4 style=\"margin:0 0 8px; font-size:0.95em; color:#444\">Entity Details</h4>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Duration</th><th>Records</th><th>Status</th></tr>';\n\t\t\tfor (let i = 0; i < pReport.Entities.length; i++)\n\t\t\t{\n\t\t\t\tlet tmpEntity = pReport.Entities[i];\n\t\t\t\tlet tmpDur = tmpEntity.DurationSeconds < 60 ? tmpEntity.DurationSeconds + 's' : Math.floor(tmpEntity.DurationSeconds / 60) + 'm ' + (tmpEntity.DurationSeconds % 60) + 's';\n\t\t\t\tlet tmpRecs = this.pict.providers.ComprehensionLoader.formatNumber(tmpEntity.Pushed);\n\t\t\t\tlet tmpStatusColor = { Complete: '#28a745', Error: '#dc3545' }[tmpEntity.Status] || '#666';\n\t\t\t\ttmpHtml += '<tr>';\n\t\t\t\ttmpHtml += '<td><strong>' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpEntity.Name) + '</strong></td>';\n\t\t\t\ttmpHtml += '<td>' + tmpDur + '</td>';\n\t\t\t\ttmpHtml += '<td>' + tmpRecs + '</td>';\n\t\t\t\ttmpHtml += '<td style=\"color:' + tmpStatusColor + '\">' + tmpEntity.Status + '</td>';\n\t\t\t\ttmpHtml += '</tr>';\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t\ttmpEntityContainer.innerHTML = tmpHtml;\n\t\t}\n\t}\n\n\tdownloadReport()\n\t{\n\t\tif (!this.pict.AppData.ComprehensionLoader.LastReport)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('reportStatus', 'No report available.', 'warn');\n\t\t\treturn;\n\t\t}\n\t\tlet tmpJson = JSON.stringify(this.pict.AppData.ComprehensionLoader.LastReport, null, '\\t');\n\t\tlet tmpBlob = new Blob([tmpJson], { type: 'application/json' });\n\t\tlet tmpAnchor = document.createElement('a');\n\t\ttmpAnchor.href = URL.createObjectURL(tmpBlob);\n\t\tlet tmpTimestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n\t\ttmpAnchor.download = 'ComprehensionLoader-Report-' + tmpTimestamp + '.json';\n\t\ttmpAnchor.click();\n\t\tURL.revokeObjectURL(tmpAnchor.href);\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('reportStatus', 'Report downloaded.', 'ok');\n\t}\n\n\tcopyReport()\n\t{\n\t\tif (!this.pict.AppData.ComprehensionLoader.LastReport)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('reportStatus', 'No report available.', 'warn');\n\t\t\treturn;\n\t\t}\n\t\tlet tmpJson = JSON.stringify(this.pict.AppData.ComprehensionLoader.LastReport, null, '\\t');\n\t\tlet tmpSelf = this;\n\t\tnavigator.clipboard.writeText(tmpJson).then(function()\n\t\t{\n\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('reportStatus', 'Report copied to clipboard.', 'ok');\n\t\t});\n\t}\n\n\trenderLoadProgress(pData)\n\t{\n\t\tlet tmpContainer = document.getElementById('loadProgress');\n\t\tlet tmpEntities = pData.Entities || {};\n\t\tlet tmpEntityNames = Object.keys(tmpEntities);\n\n\t\tif (tmpEntityNames.length === 0)\n\t\t{\n\t\t\ttmpContainer.innerHTML = '';\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpPushing = [];\n\t\tlet tmpPending = [];\n\t\tlet tmpCompleted = [];\n\t\tlet tmpErrors = [];\n\n\t\tfor (let i = 0; i < tmpEntityNames.length; i++)\n\t\t{\n\t\t\tlet tmpName = tmpEntityNames[i];\n\t\t\tlet tmpEntity = tmpEntities[tmpName];\n\n\t\t\tif (tmpEntity.Status === 'Pushing')\n\t\t\t{\n\t\t\t\ttmpPushing.push({ Name: tmpName, Data: tmpEntity });\n\t\t\t}\n\t\t\telse if (tmpEntity.Status === 'Pending')\n\t\t\t{\n\t\t\t\ttmpPending.push({ Name: tmpName, Data: tmpEntity });\n\t\t\t}\n\t\t\telse if (tmpEntity.Status === 'Complete')\n\t\t\t{\n\t\t\t\ttmpCompleted.push({ Name: tmpName, Data: tmpEntity });\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmpErrors.push({ Name: tmpName, Data: tmpEntity });\n\t\t\t}\n\t\t}\n\n\t\tlet tmpHtml = '';\n\t\tlet tmpSelf = this;\n\n\t\tlet fRenderRow = function(pName, pEntity)\n\t\t{\n\t\t\tlet tmpPct = 0;\n\t\t\tif (pEntity.Total === 0 && pEntity.Status === 'Complete')\n\t\t\t{\n\t\t\t\ttmpPct = 100;\n\t\t\t}\n\t\t\telse if (pEntity.Total > 0)\n\t\t\t{\n\t\t\t\ttmpPct = Math.round((pEntity.Pushed / pEntity.Total) * 100);\n\t\t\t}\n\n\t\t\tlet tmpBarColor = '#28a745';\n\t\t\tif (pEntity.Status === 'Error') tmpBarColor = '#dc3545';\n\t\t\telse if (pEntity.Status === 'Pushing') tmpBarColor = '#4a90d9';\n\t\t\telse if (pEntity.Status === 'Pending') tmpBarColor = '#adb5bd';\n\n\t\t\tlet tmpRow = '<tr>';\n\t\t\ttmpRow += '<td><strong>' + pName + '</strong></td>';\n\t\t\ttmpRow += '<td>' + pEntity.Status + '</td>';\n\t\t\ttmpRow += '<td>';\n\t\t\ttmpRow += '<div class=\"progress-bar-container\"><div class=\"progress-bar-fill\" style=\"width:' + tmpPct + '%; background:' + tmpBarColor + '\"></div></div>';\n\t\t\ttmpRow += ' ' + tmpPct + '%';\n\t\t\ttmpRow += '</td>';\n\t\t\ttmpRow += '<td>' + (pEntity.Pushed || 0) + ' / ' + (pEntity.Total || 0) + '</td>';\n\t\t\ttmpRow += '</tr>';\n\t\t\treturn tmpRow;\n\t\t};\n\n\t\tif (tmpPushing.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"sync-section-header\">Pushing</div>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Status</th><th>Progress</th><th>Pushed</th></tr>';\n\t\t\tfor (let i = 0; i < tmpPushing.length; i++)\n\t\t\t{\n\t\t\t\ttmpHtml += fRenderRow(tmpPushing[i].Name, tmpPushing[i].Data);\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t}\n\n\t\tif (tmpPending.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"sync-section-header\">Next Up <span class=\"sync-section-count\">' + tmpPending.length + '</span></div>';\n\t\t\tlet tmpShowCount = Math.min(8, tmpPending.length);\n\t\t\ttmpHtml += '<table class=\"progress-table progress-table-muted\">';\n\t\t\tfor (let i = 0; i < tmpShowCount; i++)\n\t\t\t{\n\t\t\t\ttmpHtml += '<tr><td>' + tmpPending[i].Name + '</td>';\n\t\t\t\tif (tmpPending[i].Data.Total > 0)\n\t\t\t\t{\n\t\t\t\t\ttmpHtml += '<td class=\"sync-pending-count\">' + tmpSelf.pict.providers.ComprehensionLoader.formatNumber(tmpPending[i].Data.Total) + ' records</td>';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpHtml += '<td class=\"sync-pending-count\">\\u2014</td>';\n\t\t\t\t}\n\t\t\t\ttmpHtml += '</tr>';\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t\tif (tmpPending.length > tmpShowCount)\n\t\t\t{\n\t\t\t\ttmpHtml += '<div class=\"sync-section-overflow\">+ ' + (tmpPending.length - tmpShowCount) + ' more</div>';\n\t\t\t}\n\t\t}\n\n\t\tif (tmpErrors.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"sync-section-header sync-section-header-error\">Errors <span class=\"sync-section-count\">' + tmpErrors.length + '</span></div>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Status</th><th>Progress</th><th>Pushed</th></tr>';\n\t\t\tfor (let i = 0; i < tmpErrors.length; i++)\n\t\t\t{\n\t\t\t\ttmpHtml += fRenderRow(tmpErrors[i].Name, tmpErrors[i].Data);\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t}\n\n\t\tif (tmpCompleted.length > 0)\n\t\t{\n\t\t\ttmpHtml += '<div class=\"sync-section-header sync-section-header-ok\">Completed <span class=\"sync-section-count\">' + tmpCompleted.length + '</span></div>';\n\t\t\ttmpHtml += '<table class=\"progress-table\">';\n\t\t\ttmpHtml += '<tr><th>Entity</th><th>Status</th><th>Progress</th><th>Pushed</th></tr>';\n\t\t\tfor (let i = 0; i < tmpCompleted.length; i++)\n\t\t\t{\n\t\t\t\ttmpHtml += fRenderRow(tmpCompleted[i].Name, tmpCompleted[i].Data);\n\t\t\t}\n\t\t\ttmpHtml += '</table>';\n\t\t}\n\n\t\ttmpContainer.innerHTML = tmpHtml;\n\t}\n}\n\nmodule.exports = ComprehensionLoaderLoadView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Load',\n\tDefaultRenderable: 'ComprehensionLoader-Load',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Section-Load',\n\tCSS: /*css*/`\n.progress-table { width: 100%; border-collapse: collapse; margin-top: 4px; margin-bottom: 4px; }\n.progress-table th, .progress-table td { text-align: left; padding: 6px 12px; border-bottom: 1px solid #eee; font-size: 0.9em; }\n.progress-table th { background: #f8f9fa; font-weight: 600; }\n.progress-table-muted td { color: #888; padding: 3px 12px; font-size: 0.85em; border-bottom: 1px solid #f4f5f6; }\n.progress-bar-container { width: 120px; height: 16px; background: #e9ecef; border-radius: 8px; overflow: hidden; display: inline-block; vertical-align: middle; }\n.progress-bar-fill { height: 100%; background: #28a745; transition: width 0.3s; }\n.sync-section-header { font-size: 0.8em; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: #4a90d9; padding: 10px 0 2px 0; margin-top: 6px; border-top: 1px solid #e0e0e0; }\n.sync-section-header:first-child { border-top: none; margin-top: 10px; }\n.sync-section-header-error { color: #dc3545; }\n.sync-section-header-ok { color: #28a745; }\n.sync-section-count { font-weight: 400; color: #999; font-size: 0.95em; }\n.sync-section-overflow { font-size: 0.8em; color: #aaa; padding: 2px 12px 6px; }\n.sync-pending-count { text-align: right; color: #aaa; font-size: 0.85em; }\n.report-card { background: #f8f9fa; border-radius: 8px; padding: 12px 16px; min-width: 140px; text-align: center; border: 1px solid #e9ecef; }\n.report-card .card-label { font-size: 0.8em; color: #666; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; }\n.report-card .card-value { font-size: 1.4em; font-weight: 700; }\n.report-card.outcome-success { border-left: 4px solid #28a745; }\n.report-card.outcome-partial { border-left: 4px solid #ffc107; }\n.report-card.outcome-error { border-left: 4px solid #dc3545; }\n.report-card.outcome-stopped { border-left: 4px solid #6c757d; }\n`,\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Load',\n\t\t\tTemplate: /*html*/`\n<div class=\"accordion-row\">\n\t<div class=\"accordion-number\">4</div>\n\t<div class=\"accordion-card\" id=\"section4\" data-section=\"4\">\n\t\t<div class=\"accordion-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleSection('section4')\">\n\t\t\t<div class=\"accordion-title\">Load</div>\n\t\t\t<span class=\"accordion-phase\" id=\"phase4\"></span>\n\t\t\t<div class=\"accordion-preview\" id=\"preview4\">Push comprehension data to the remote server</div>\n\t\t\t<div class=\"accordion-actions\">\n\t\t\t\t<span class=\"accordion-go\" onclick=\"event.stopPropagation(); pict.views['ComprehensionLoader-Load'].startLoad()\">go</span>\n\t\t\t\t<label class=\"accordion-auto\" onclick=\"event.stopPropagation()\"><input type=\"checkbox\" id=\"auto4\"> <span class=\"auto-label\">auto</span></label>\n\t\t\t</div>\n\t\t\t<div class=\"accordion-toggle\">&#9660;</div>\n\t\t</div>\n\t\t<div class=\"accordion-body\">\n\t\t\t<div style=\"display:flex; gap:8px; margin-bottom:10px\">\n\t\t\t\t<button class=\"success\" style=\"margin:0\" onclick=\"pict.views['ComprehensionLoader-Load'].startLoad()\">Start Load</button>\n\t\t\t\t<button class=\"danger\" style=\"margin:0\" onclick=\"pict.views['ComprehensionLoader-Load'].stopLoad()\">Stop Load</button>\n\t\t\t</div>\n\n\t\t\t<div id=\"loadStatus\"></div>\n\t\t\t<div id=\"loadProgress\"></div>\n\n\t\t\t<!-- Load Report (appears after load completes) -->\n\t\t\t<div id=\"loadReportSection\" style=\"display:none; margin-top:16px; padding-top:16px; border-top:2px solid #ddd\">\n\t\t\t\t<h3 style=\"margin:0 0 12px; font-size:1.1em\">Load Report</h3>\n\n\t\t\t\t<div id=\"reportSummaryCards\" style=\"display:flex; gap:12px; flex-wrap:wrap; margin-bottom:16px\"></div>\n\t\t\t\t<div id=\"reportAnomalies\" style=\"margin-bottom:16px\"></div>\n\t\t\t\t<div id=\"reportEntityDetails\" style=\"margin-bottom:16px\"></div>\n\n\t\t\t\t<div style=\"display:flex; gap:8px\">\n\t\t\t\t\t<button class=\"secondary\" onclick=\"pict.views['ComprehensionLoader-Load'].downloadReport()\">Download Report JSON</button>\n\t\t\t\t\t<button class=\"secondary\" onclick=\"pict.views['ComprehensionLoader-Load'].copyReport()\">Copy Report</button>\n\t\t\t\t</div>\n\t\t\t\t<div id=\"reportStatus\"></div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Load',\n\t\t\tTemplateHash: 'ComprehensionLoader-Load',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Section-Load'\n\t\t}\n\t]\n};\n","const libPictView = require('pict-view');\n\nclass ComprehensionLoaderSchemaView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tfetchSchema()\n\t{\n\t\tlet tmpSchemaURL = document.getElementById('schemaURL').value.trim();\n\t\tlet tmpBody = {};\n\t\tif (tmpSchemaURL)\n\t\t{\n\t\t\ttmpBody.SchemaURL = tmpSchemaURL;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(2, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('schemaStatus', 'Fetching schema...', 'info');\n\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/schema/fetch', tmpBody)\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tif (pData.Success)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.AppData.ComprehensionLoader.FetchedEntities = pData.Entities || [];\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('schemaStatus', 'Fetched schema with ' + pData.EntityCount + ' entities from ' + pData.SchemaURL, 'ok');\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(2, 'ok');\n\t\t\t\t\t\tthis.renderEntityList();\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.updateAllPreviews();\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('schemaStatus', 'Fetch failed: ' + (pData.Error || 'Unknown error'), 'error');\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(2, 'error');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('schemaStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(2, 'error');\n\t\t\t\t});\n\t}\n\n\trenderEntityList()\n\t{\n\t\tlet tmpEntities = this.pict.AppData.ComprehensionLoader.FetchedEntities || [];\n\t\tlet tmpContainer = document.getElementById('entityList');\n\t\tif (!tmpContainer) return;\n\n\t\tif (tmpEntities.length === 0)\n\t\t{\n\t\t\ttmpContainer.innerHTML = '<div style=\"color:#888; font-size:0.9em\">No entities found.</div>';\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpHtml = '<div style=\"font-size:0.9em; color:#555\">';\n\t\tfor (let i = 0; i < tmpEntities.length; i++)\n\t\t{\n\t\t\ttmpHtml += '<span style=\"display:inline-block; background:#f0f0f0; border-radius:4px; padding:2px 8px; margin:2px 4px 2px 0; font-size:0.9em\">';\n\t\t\ttmpHtml += this.pict.providers.ComprehensionLoader.escapeHtml(tmpEntities[i]);\n\t\t\ttmpHtml += '</span>';\n\t\t}\n\t\ttmpHtml += '</div>';\n\t\ttmpContainer.innerHTML = tmpHtml;\n\t}\n}\n\nmodule.exports = ComprehensionLoaderSchemaView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Schema',\n\tDefaultRenderable: 'ComprehensionLoader-Schema',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Section-Schema',\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Schema',\n\t\t\tTemplate: /*html*/`\n<div class=\"accordion-row\">\n\t<div class=\"accordion-number\">2</div>\n\t<div class=\"accordion-card\" id=\"section2\" data-section=\"2\">\n\t\t<div class=\"accordion-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleSection('section2')\">\n\t\t\t<div class=\"accordion-title\">Remote Schema</div>\n\t\t\t<span class=\"accordion-phase\" id=\"phase2\"></span>\n\t\t\t<div class=\"accordion-preview\" id=\"preview2\">Fetch entity schema from the remote server</div>\n\t\t\t<div class=\"accordion-actions\">\n\t\t\t\t<span class=\"accordion-go\" onclick=\"event.stopPropagation(); pict.views['ComprehensionLoader-Schema'].fetchSchema()\">go</span>\n\t\t\t\t<label class=\"accordion-auto\" onclick=\"event.stopPropagation()\"><input type=\"checkbox\" id=\"auto2\"> <span class=\"auto-label\">auto</span></label>\n\t\t\t</div>\n\t\t\t<div class=\"accordion-toggle\">&#9660;</div>\n\t\t</div>\n\t\t<div class=\"accordion-body\">\n\t\t\t<label for=\"schemaURL\">Schema URL (leave blank for default: ServerURL + Retold/Models)</label>\n\t\t\t<input type=\"text\" id=\"schemaURL\" placeholder=\"http://remote-server:8086/1.0/Retold/Models\">\n\n\t\t\t<button class=\"primary\" onclick=\"pict.views['ComprehensionLoader-Schema'].fetchSchema()\">Fetch Schema</button>\n\t\t\t<div id=\"schemaStatus\"></div>\n\n\t\t\t<div id=\"entityList\" style=\"margin-top:12px\"></div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Schema',\n\t\t\tTemplateHash: 'ComprehensionLoader-Schema',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Section-Schema'\n\t\t}\n\t]\n};\n","const libPictView = require('pict-view');\n\nclass ComprehensionLoaderSessionView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tconfigureSession()\n\t{\n\t\tlet tmpServerURL = document.getElementById('serverURL').value.trim();\n\t\tif (!tmpServerURL)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Server URL is required.', 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tlet tmpBody = { ServerURL: tmpServerURL.replace(/\\/+$/, '') + '/1.0/' };\n\n\t\tlet tmpAuthMethod = document.getElementById('authMethod').value.trim();\n\t\tif (tmpAuthMethod)\n\t\t{\n\t\t\ttmpBody.AuthenticationMethod = tmpAuthMethod;\n\t\t}\n\n\t\tlet tmpAuthURI = document.getElementById('authURI').value.trim();\n\t\tif (tmpAuthURI)\n\t\t{\n\t\t\ttmpBody.AuthenticationURITemplate = tmpAuthURI;\n\t\t}\n\n\t\tlet tmpCheckURI = document.getElementById('checkURI').value.trim();\n\t\tif (tmpCheckURI)\n\t\t{\n\t\t\ttmpBody.CheckSessionURITemplate = tmpCheckURI;\n\t\t}\n\n\t\tlet tmpCookieName = document.getElementById('cookieName').value.trim();\n\t\tif (tmpCookieName)\n\t\t{\n\t\t\ttmpBody.CookieName = tmpCookieName;\n\t\t}\n\n\t\tlet tmpCookieValueAddr = document.getElementById('cookieValueAddr').value.trim();\n\t\tif (tmpCookieValueAddr)\n\t\t{\n\t\t\ttmpBody.CookieValueAddress = tmpCookieValueAddr;\n\t\t}\n\n\t\tlet tmpCookieValueTemplate = document.getElementById('cookieValueTemplate').value.trim();\n\t\tif (tmpCookieValueTemplate)\n\t\t{\n\t\t\ttmpBody.CookieValueTemplate = tmpCookieValueTemplate;\n\t\t}\n\n\t\tlet tmpLoginMarker = document.getElementById('loginMarker').value.trim();\n\t\tif (tmpLoginMarker)\n\t\t{\n\t\t\ttmpBody.CheckSessionLoginMarker = tmpLoginMarker;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Configuring session...', 'info');\n\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/session/configure', tmpBody)\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tif (pData.Success)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Session configured for ' + pData.ServerURL + ' (domain: ' + pData.DomainMatch + ')', 'ok');\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Configuration failed: ' + (pData.Error || 'Unknown error'), 'error');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionConfigStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t});\n\t}\n\n\tauthenticate()\n\t{\n\t\tlet tmpUserName = document.getElementById('userName').value.trim();\n\t\tlet tmpPassword = document.getElementById('password').value.trim();\n\n\t\tif (!tmpUserName || !tmpPassword)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Username and password are required.', 'error');\n\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Authenticating...', 'info');\n\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/session/authenticate', { UserName: tmpUserName, Password: tmpPassword })\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tif (pData.Success && pData.Authenticated)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Authenticated successfully.', 'ok');\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'ok');\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Authentication failed: ' + (pData.Error || 'Not authenticated'), 'error');\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'error');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'error');\n\t\t\t\t});\n\t}\n\n\tcheckSession()\n\t{\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Checking session...', 'info');\n\n\t\tthis.pict.providers.ComprehensionLoader.api('GET', '/comprehension_load/session/check')\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tif (pData.Authenticated)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Session is active. Server: ' + (pData.ServerURL || 'N/A'), 'ok');\n\t\t\t\t\t}\n\t\t\t\t\telse if (pData.Configured)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Session configured but not authenticated.', 'warn');\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'No session configured.', 'warn');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t});\n\t}\n\n\tdeauthenticate()\n\t{\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/session/deauthenticate')\n\t\t\t.then(\n\t\t\t\t(pData) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Session deauthenticated.', 'info');\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, '');\n\t\t\t\t})\n\t\t\t.catch(\n\t\t\t\t(pError) =>\n\t\t\t\t{\n\t\t\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sessionAuthStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\t});\n\t}\n\n\tgoAction()\n\t{\n\t\t// Two-step: configure session, then authenticate after delay\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(1, 'busy');\n\t\tthis.configureSession();\n\t\tsetTimeout(\n\t\t\t() =>\n\t\t\t{\n\t\t\t\tthis.authenticate();\n\t\t\t}, 1500);\n\t}\n}\n\nmodule.exports = ComprehensionLoaderSessionView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Session',\n\tDefaultRenderable: 'ComprehensionLoader-Session',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Section-Session',\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Session',\n\t\t\tTemplate: /*html*/`\n<div class=\"accordion-row\">\n\t<div class=\"accordion-number\">1</div>\n\t<div class=\"accordion-card\" id=\"section1\" data-section=\"1\">\n\t\t<div class=\"accordion-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleSection('section1')\">\n\t\t\t<div class=\"accordion-title\">Remote Session</div>\n\t\t\t<span class=\"accordion-phase\" id=\"phase1\"></span>\n\t\t\t<div class=\"accordion-preview\" id=\"preview1\">Configure remote server URL and credentials</div>\n\t\t\t<div class=\"accordion-actions\">\n\t\t\t\t<span class=\"accordion-go\" onclick=\"event.stopPropagation(); pict.views['ComprehensionLoader-Session'].goAction()\">go</span>\n\t\t\t\t<label class=\"accordion-auto\" onclick=\"event.stopPropagation()\"><input type=\"checkbox\" id=\"auto1\"> <span class=\"auto-label\">auto</span></label>\n\t\t\t</div>\n\t\t\t<div class=\"accordion-toggle\">&#9660;</div>\n\t\t</div>\n\t\t<div class=\"accordion-body\">\n\t\t\t<div class=\"inline-group\">\n\t\t\t\t<div style=\"flex:2\">\n\t\t\t\t\t<label for=\"serverURL\">Remote Server URL</label>\n\t\t\t\t\t<input type=\"text\" id=\"serverURL\" placeholder=\"http://remote-server:8086\" value=\"\">\n\t\t\t\t</div>\n\t\t\t\t<div style=\"flex:1\">\n\t\t\t\t\t<label for=\"authMethod\">Auth Method</label>\n\t\t\t\t\t<input type=\"text\" id=\"authMethod\" placeholder=\"get\" value=\"get\">\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<details style=\"margin-bottom:10px\">\n\t\t\t\t<summary style=\"cursor:pointer; font-size:0.9em; color:#666\">Advanced Session Options</summary>\n\t\t\t\t<div style=\"padding:10px 0\">\n\t\t\t\t\t<label for=\"authURI\">Authentication URI Template (leave blank for default)</label>\n\t\t\t\t\t<input type=\"text\" id=\"authURI\" placeholder=\"Authenticate/{~D:Record.UserName~}/{~D:Record.Password~}\">\n\t\t\t\t\t<label for=\"checkURI\">Check Session URI Template</label>\n\t\t\t\t\t<input type=\"text\" id=\"checkURI\" placeholder=\"CheckSession\">\n\t\t\t\t\t<label for=\"cookieName\">Cookie Name</label>\n\t\t\t\t\t<input type=\"text\" id=\"cookieName\" placeholder=\"SessionID\" value=\"SessionID\">\n\t\t\t\t\t<label for=\"cookieValueAddr\">Cookie Value Address</label>\n\t\t\t\t\t<input type=\"text\" id=\"cookieValueAddr\" placeholder=\"SessionID\" value=\"SessionID\">\n\t\t\t\t\t<label for=\"cookieValueTemplate\">Cookie Value Template (overrides Address if set)</label>\n\t\t\t\t\t<input type=\"text\" id=\"cookieValueTemplate\" placeholder=\"{~D:Record.SessionID~}\">\n\t\t\t\t\t<label for=\"loginMarker\">Login Marker</label>\n\t\t\t\t\t<input type=\"text\" id=\"loginMarker\" placeholder=\"LoggedIn\" value=\"LoggedIn\">\n\t\t\t\t</div>\n\t\t\t</details>\n\n\t\t\t<button class=\"primary\" onclick=\"pict.views['ComprehensionLoader-Session'].configureSession()\">Configure Session</button>\n\t\t\t<div id=\"sessionConfigStatus\"></div>\n\n\t\t\t<hr style=\"margin:16px 0; border:none; border-top:1px solid #eee\">\n\n\t\t\t<div class=\"inline-group\">\n\t\t\t\t<div>\n\t\t\t\t\t<label for=\"userName\">Username</label>\n\t\t\t\t\t<input type=\"text\" id=\"userName\" placeholder=\"username\">\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<label for=\"password\">Password</label>\n\t\t\t\t\t<input type=\"password\" id=\"password\" placeholder=\"password\">\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<button class=\"success\" onclick=\"pict.views['ComprehensionLoader-Session'].authenticate()\">Authenticate</button>\n\t\t\t<button class=\"secondary\" onclick=\"pict.views['ComprehensionLoader-Session'].checkSession()\">Check Session</button>\n\t\t\t<button class=\"danger\" onclick=\"pict.views['ComprehensionLoader-Session'].deauthenticate()\">Deauthenticate</button>\n\t\t\t<div id=\"sessionAuthStatus\"></div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Session',\n\t\t\tTemplateHash: 'ComprehensionLoader-Session',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Section-Session'\n\t\t}\n\t]\n};\n","const libPictView = require('pict-view');\n\nclass ComprehensionLoaderSourceView extends libPictView\n{\n\tconstructor(pFable, pOptions, pServiceHash)\n\t{\n\t\tsuper(pFable, pOptions, pServiceHash);\n\t}\n\n\tonAfterRender()\n\t{\n\t\t// Restore source mode and toggle UI\n\t\tlet tmpSourceMode = localStorage.getItem('comprehensionLoader_comprehensionSourceMode');\n\t\tif (tmpSourceMode === 'file')\n\t\t{\n\t\t\tlet tmpFileRadio = document.getElementById('sourceMode_file');\n\t\t\tif (tmpFileRadio) tmpFileRadio.checked = true;\n\t\t}\n\t\tthis.onSourceModeChange();\n\t}\n\n\tonSourceModeChange()\n\t{\n\t\tlet tmpMode = document.querySelector('input[name=\"comprehensionSourceMode\"]:checked');\n\t\tlet tmpModeName = tmpMode ? tmpMode.value : 'url';\n\n\t\tlet tmpURLSection = document.getElementById('sourceURLSection');\n\t\tlet tmpFileSection = document.getElementById('sourceFileSection');\n\n\t\tif (tmpURLSection) tmpURLSection.style.display = tmpModeName === 'url' ? '' : 'none';\n\t\tif (tmpFileSection) tmpFileSection.style.display = tmpModeName === 'file' ? '' : 'none';\n\n\t\tthis.pict.providers.ComprehensionLoader.updateAllPreviews();\n\t}\n\n\tfetchFromURL()\n\t{\n\t\tlet tmpURL = document.getElementById('comprehensionURL').value.trim();\n\t\tif (!tmpURL)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Comprehension URL is required.', 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(3, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Fetching comprehension...', 'info');\n\n\t\tlet tmpSelf = this;\n\n\t\t// Try browser fetch first, fall back to server proxy on CORS failure\n\t\tfetch(tmpURL)\n\t\t\t.then(function(pResponse)\n\t\t\t{\n\t\t\t\tif (!pResponse.ok) throw new Error('HTTP ' + pResponse.status);\n\t\t\t\treturn pResponse.json();\n\t\t\t})\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\ttmpSelf.sendComprehensionToServer(pData);\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\t// CORS or network error — try server-side proxy\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Direct fetch failed (' + pError.message + '), trying server proxy...', 'info');\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/comprehension/proxy-fetch', { URL: tmpURL })\n\t\t\t\t\t.then(function(pProxyData)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pProxyData.Success)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus',\n\t\t\t\t\t\t\t\t'Loaded via proxy: ' + pProxyData.EntityCount + ' entities, ' + tmpSelf.pict.providers.ComprehensionLoader.formatNumber(pProxyData.TotalRecords) + ' records.', 'ok');\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'ok');\n\t\t\t\t\t\t\ttmpSelf.renderComprehensionSummary(pProxyData);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Proxy fetch failed: ' + (pProxyData.Error || 'Unknown error'), 'error');\n\t\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch(function(pProxyError)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Proxy request failed: ' + pProxyError.message, 'error');\n\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t\t});\n\t\t\t});\n\t}\n\n\tloadFromFiles()\n\t{\n\t\tlet tmpFileInput = document.getElementById('comprehensionFiles');\n\t\tif (!tmpFileInput || tmpFileInput.files.length === 0)\n\t\t{\n\t\t\tthis.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Please select one or more JSON files.', 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pict.providers.ComprehensionLoader.setSectionPhase(3, 'busy');\n\t\tthis.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Reading files...', 'info');\n\n\t\tlet tmpSelf = this;\n\t\tlet tmpFiles = tmpFileInput.files;\n\t\tlet tmpMergedData = {};\n\t\tlet tmpFilesRead = 0;\n\n\t\tfor (let i = 0; i < tmpFiles.length; i++)\n\t\t{\n\t\t\t(function(pFile)\n\t\t\t{\n\t\t\t\tlet tmpReader = new FileReader();\n\t\t\t\ttmpReader.onload = function(pEvent)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tlet tmpParsed = JSON.parse(pEvent.target.result);\n\n\t\t\t\t\t\t// Merge entity keys from this file into the merged data\n\t\t\t\t\t\tlet tmpKeys = Object.keys(tmpParsed);\n\t\t\t\t\t\tfor (let k = 0; k < tmpKeys.length; k++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet tmpKey = tmpKeys[k];\n\t\t\t\t\t\t\tif (Array.isArray(tmpParsed[tmpKey]))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (!tmpMergedData[tmpKey])\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttmpMergedData[tmpKey] = [];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttmpMergedData[tmpKey] = tmpMergedData[tmpKey].concat(tmpParsed[tmpKey]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttmpMergedData[tmpKey] = tmpParsed[tmpKey];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch (pParseError)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Error parsing ' + pFile.name + ': ' + pParseError.message, 'error');\n\t\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\ttmpFilesRead++;\n\t\t\t\t\tif (tmpFilesRead === tmpFiles.length)\n\t\t\t\t\t{\n\t\t\t\t\t\t// All files read — send merged comprehension to server\n\t\t\t\t\t\ttmpSelf.sendComprehensionToServer(tmpMergedData);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttmpReader.onerror = function()\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Error reading ' + pFile.name, 'error');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t};\n\t\t\t\ttmpReader.readAsText(pFile);\n\t\t\t})(tmpFiles[i]);\n\t\t}\n\t}\n\n\tsendComprehensionToServer(pData)\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/comprehension/receive', { Comprehension: pData })\n\t\t\t.then(function(pResult)\n\t\t\t{\n\t\t\t\tif (pResult.Success)\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus',\n\t\t\t\t\t\t'Loaded: ' + pResult.EntityCount + ' entities, ' + tmpSelf.pict.providers.ComprehensionLoader.formatNumber(pResult.TotalRecords) + ' records.', 'ok');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'ok');\n\t\t\t\t\ttmpSelf.renderComprehensionSummary(pResult);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Failed: ' + (pResult.Error || 'Unknown error'), 'error');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, 'error');\n\t\t\t});\n\t}\n\n\trenderComprehensionSummary(pResult)\n\t{\n\t\tlet tmpContainer = document.getElementById('comprehensionSummary');\n\t\tif (!tmpContainer) return;\n\n\t\tlet tmpHtml = '<table style=\"width:100%; border-collapse:collapse; margin-top:8px; font-size:0.9em\">';\n\t\ttmpHtml += '<thead><tr><th style=\"text-align:left; padding:6px 12px; border-bottom:2px solid #ddd\">Entity</th>';\n\t\ttmpHtml += '<th style=\"text-align:right; padding:6px 12px; border-bottom:2px solid #ddd\">Records</th></tr></thead>';\n\t\ttmpHtml += '<tbody>';\n\n\t\tlet tmpEntityList = pResult.EntityList || [];\n\t\tlet tmpRecordCounts = pResult.RecordCounts || {};\n\t\tfor (let i = 0; i < tmpEntityList.length; i++)\n\t\t{\n\t\t\tlet tmpName = tmpEntityList[i];\n\t\t\tlet tmpCount = tmpRecordCounts[tmpName] || 0;\n\t\t\ttmpHtml += '<tr>';\n\t\t\ttmpHtml += '<td style=\"padding:4px 12px; border-bottom:1px solid #f0f0f0\">' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpName) + '</td>';\n\t\t\ttmpHtml += '<td style=\"padding:4px 12px; border-bottom:1px solid #f0f0f0; text-align:right; font-variant-numeric:tabular-nums\">' + this.pict.providers.ComprehensionLoader.formatNumber(tmpCount) + '</td>';\n\t\t\ttmpHtml += '</tr>';\n\t\t}\n\n\t\ttmpHtml += '</tbody>';\n\t\ttmpHtml += '<tfoot><tr>';\n\t\ttmpHtml += '<td style=\"padding:6px 12px; font-weight:600\">Total</td>';\n\t\ttmpHtml += '<td style=\"padding:6px 12px; text-align:right; font-weight:600; font-variant-numeric:tabular-nums\">' + this.pict.providers.ComprehensionLoader.formatNumber(pResult.TotalRecords) + '</td>';\n\t\ttmpHtml += '</tr></tfoot>';\n\t\ttmpHtml += '</table>';\n\n\t\ttmpContainer.innerHTML = tmpHtml;\n\t\ttmpContainer.style.display = '';\n\t}\n\n\tclearComprehension()\n\t{\n\t\tlet tmpSelf = this;\n\t\tthis.pict.providers.ComprehensionLoader.api('POST', '/comprehension_load/comprehension/clear')\n\t\t\t.then(function(pData)\n\t\t\t{\n\t\t\t\tif (pData.Success)\n\t\t\t\t{\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Comprehension data cleared.', 'info');\n\t\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setSectionPhase(3, '');\n\t\t\t\t\tlet tmpContainer = document.getElementById('comprehensionSummary');\n\t\t\t\t\tif (tmpContainer)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmpContainer.innerHTML = '';\n\t\t\t\t\t\ttmpContainer.style.display = 'none';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(function(pError)\n\t\t\t{\n\t\t\t\ttmpSelf.pict.providers.ComprehensionLoader.setStatus('sourceStatus', 'Request failed: ' + pError.message, 'error');\n\t\t\t});\n\t}\n\n\tgoAction()\n\t{\n\t\tlet tmpMode = document.querySelector('input[name=\"comprehensionSourceMode\"]:checked');\n\t\tlet tmpModeName = tmpMode ? tmpMode.value : 'url';\n\n\t\tif (tmpModeName === 'url')\n\t\t{\n\t\t\tthis.fetchFromURL();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.loadFromFiles();\n\t\t}\n\t}\n}\n\nmodule.exports = ComprehensionLoaderSourceView;\n\nmodule.exports.default_configuration =\n{\n\tViewIdentifier: 'ComprehensionLoader-Source',\n\tDefaultRenderable: 'ComprehensionLoader-Source',\n\tDefaultDestinationAddress: '#ComprehensionLoader-Section-Source',\n\tTemplates:\n\t[\n\t\t{\n\t\t\tHash: 'ComprehensionLoader-Source',\n\t\t\tTemplate: /*html*/`\n<div class=\"accordion-row\">\n\t<div class=\"accordion-number\">3</div>\n\t<div class=\"accordion-card\" id=\"section3\" data-section=\"3\">\n\t\t<div class=\"accordion-header\" onclick=\"pict.views['ComprehensionLoader-Layout'].toggleSection('section3')\">\n\t\t\t<div class=\"accordion-title\">Comprehension Source</div>\n\t\t\t<span class=\"accordion-phase\" id=\"phase3\"></span>\n\t\t\t<div class=\"accordion-preview\" id=\"preview3\">Provide a comprehension JSON URL or upload files</div>\n\t\t\t<div class=\"accordion-actions\">\n\t\t\t\t<span class=\"accordion-go\" onclick=\"event.stopPropagation(); pict.views['ComprehensionLoader-Source'].goAction()\">go</span>\n\t\t\t\t<label class=\"accordion-auto\" onclick=\"event.stopPropagation()\"><input type=\"checkbox\" id=\"auto3\"> <span class=\"auto-label\">auto</span></label>\n\t\t\t</div>\n\t\t\t<div class=\"accordion-toggle\">&#9660;</div>\n\t\t</div>\n\t\t<div class=\"accordion-body\">\n\t\t\t<div style=\"margin-bottom:12px\">\n\t\t\t\t<label style=\"margin-bottom:6px\">Source Mode</label>\n\t\t\t\t<div style=\"display:flex; gap:16px; align-items:center\">\n\t\t\t\t\t<label style=\"font-weight:normal; margin:0; cursor:pointer\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"comprehensionSourceMode\" id=\"sourceMode_url\" value=\"url\" checked onchange=\"pict.views['ComprehensionLoader-Source'].onSourceModeChange()\"> URL\n\t\t\t\t\t\t<span style=\"color:#888; font-size:0.85em\">(fetch from a URL)</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<label style=\"font-weight:normal; margin:0; cursor:pointer\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"comprehensionSourceMode\" id=\"sourceMode_file\" value=\"file\" onchange=\"pict.views['ComprehensionLoader-Source'].onSourceModeChange()\"> File Upload\n\t\t\t\t\t\t<span style=\"color:#888; font-size:0.85em\">(load JSON from local files)</span>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div id=\"sourceURLSection\">\n\t\t\t\t<label for=\"comprehensionURL\">Comprehension JSON URL</label>\n\t\t\t\t<input type=\"text\" id=\"comprehensionURL\" placeholder=\"http://example.com/comprehension.json\">\n\t\t\t\t<button class=\"primary\" onclick=\"pict.views['ComprehensionLoader-Source'].fetchFromURL()\">Fetch Comprehension</button>\n\t\t\t</div>\n\n\t\t\t<div id=\"sourceFileSection\" style=\"display:none\">\n\t\t\t\t<label for=\"comprehensionFiles\">Comprehension JSON File(s)</label>\n\t\t\t\t<input type=\"file\" id=\"comprehensionFiles\" multiple accept=\".json\" style=\"margin-bottom:10px\">\n\t\t\t\t<div style=\"font-size:0.8em; color:#888; margin-bottom:10px\">Multiple files will be merged (entity keys combined).</div>\n\t\t\t\t<button class=\"primary\" onclick=\"pict.views['ComprehensionLoader-Source'].loadFromFiles()\">Load Files</button>\n\t\t\t</div>\n\n\t\t\t<button class=\"secondary\" onclick=\"pict.views['ComprehensionLoader-Source'].clearComprehension()\" style=\"margin-left:0\">Clear Comprehension</button>\n\t\t\t<div id=\"sourceStatus\"></div>\n\n\t\t\t<div id=\"comprehensionSummary\" style=\"display:none\"></div>\n\t\t</div>\n\t</div>\n</div>\n`\n\t\t}\n\t],\n\tRenderables:\n\t[\n\t\t{\n\t\t\tRenderableHash: 'ComprehensionLoader-Source',\n\t\t\tTemplateHash: 'ComprehensionLoader-Source',\n\t\t\tDestinationAddress: '#ComprehensionLoader-Section-Source'\n\t\t}\n\t]\n};\n"]}