Refactor energy calibration pipeline, introduce modern arguments blocks, and add universal logging

* Transitioned nappNorm, nappDetermineShift, and nappCopyShift to use modern MATLAB arguments blocks, removing their legacy functionSignatures.json entries.

* Refactored nappNorm to rely on prior peak fitting results (e.g., from nappFitGaussXps) for normalization rather than performing the fitting internally.

* Decoupled energy calibration: nappDetermineShift now solely calculates internal binding energy shifts, and nappCopyShift distributes them using a unified matching engine ('earlier', 'after', 'spectrumNumber').

* Implemented a Universal Logging Block to track data provenance, automatically appending execution timestamps and caller script names to processed rows.

* Updated nappCombineSpectra to output a logDataSource cell array and cleanly name combined spectra.

* Created nappSaveDataTable for automatic, script-named .mat file saving, complete with a Live Editor interceptor.

* Added a publish-mode silencer to nappFitGaussXps to prevent optimizer spam in generated PDFs.

* Updated readme.md to document the new arguments structure, the 3-step calibration workflow, the matching engine, and the new table variables.
This commit is contained in:
bartels-rausch committed 2026-03-25 12:07:49 +01:00
1 parent b4cb748cfa
commit 091cf00e77
18 files changed
+822 -1106

No files matched your search

Binary file not shown.
@@ -3,6 +3,7 @@
%[text] [https://gitea.psi.ch/5505/functionsMatlab/src/branch/main/beamtime](https://gitea.psi.ch/5505/functionsMatlab/src/branch/main/beamtime)
%[text] and
%[text] [https://gitea.psi.ch/5505/functionsMatlab/src/branch/main/beamtime/documentedExampleScripts](https://gitea.psi.ch/5505/functionsMatlab/src/branch/main/beamtime/documentedExampleScripts)
%%
%[text] ## Load Data
%[text] Import raw beamtime data into the Matlab workspace for analysis. Data is organized in a single *matlab data table* where XPS intensities from region iterations are averaged and normalized to counts per second (CPS). This ensures comparison regardless of dwell time or region iteration settings.
%[text] There are several options to import. The preferred way is to write a importData.m script to call the import function and to add notes to data. Once imported, data is saved to a FileList.mat file, which should be updated regularly to ensure the MATLAB works with the most recent data.
@@ -16,6 +17,15 @@ FileList = outerjoinRowToTable(FileList,tmpData.FileList);
clearvars tmp*
%%
%[text] ## Align sample
%[text] - Approach and take spectra too far away, too close, in working distance.
%[text] - At least note dwell time and pass energy and area reading for a few distances
%[text] - also note x,y,z \
%[text] ## Reference spectra
%[text] 1. sample prior to dosing.
%[text] 2. sample prior to adding dosing carrier gas.
%[text] 3. gas-phase with all settings used for sample.
%[text] 4. cold and warm sample holder without sample (if contamination is an issue). \
%[text] ## Survey: Characterize sample
%[text] Survey spectra are used to characterize new samples and to monitor samples over time. They should show all expected elements and no unexpected ones, and are typically recorded at key times (before/after experiments, when dosing changes, at regular intervals).
%[text] **If unexpected peaks appear**
@@ -134,8 +144,8 @@ tmpDataSelection = month(FileList.lastModifiedDatenum) == 11 ...
% List the selected files in the command window.
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'})) %[output:2f867eb6]
% plot
nappPlot(FileList,tmpDataSelection,'tableVariable','image','mode','iterations','plotStep',2); %[output:30898c2d]
legend
nappPlot(FileList,tmpDataSelection,'tableVariable','image','mode','iterations','plotStep',2); %[output:30898c2d] %[output:0b22a369]
legend %[output:0b22a369]
%%
%[text] ### Plot shifting images
%[text] The two O1s images MgO ice in Ar HONO, 21-Aug-2021 and MgO ice AA in N2, 25-Oct-2021 illustrate the difference between unusable and usable data.
@@ -147,7 +157,7 @@ tmpDataSelection = matches(FileList.name,'0067067_O1s_1000eV.ibw');
% List the selected files in the command window.
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'})) %[output:27ab5aa8]
% plot
nappPlot(FileList,tmpDataSelection);
nappPlot(FileList,tmpDataSelection); %[output:3f52d2f2] %[output:2edd5c8e]
%[text]
%%
%[text] #### Remove a single iteration from image
@@ -158,11 +168,11 @@ tmpDataSelection = month(FileList.lastModifiedDatenum) == 10 ...
% List the selected files in the command window.
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'})) %[output:9949b5fb]
% plot
nappPlot(FileList,tmpDataSelection);
nappPlot(FileList,tmpDataSelection); %[output:0ab749aa]
% remove iteration #9
FileList(tmpDataSelection,:).image{:}(:,9)=[];
% plot again
nappPlot(FileList,tmpDataSelection,'tableVariable','image');
nappPlot(FileList,tmpDataSelection,'tableVariable','image'); %[output:26c3d5db]
%%
%[text] ## Binding energy scale
%[text] To compare spectra taken at different photon energies or to present your data, convert kinetic energy to binding energy using three steps:
@@ -205,10 +215,10 @@ tmpDataSelection = matches(FileList.sample,'Ice with N2')...
& (day(FileList.lastModifiedDatenum) >= 27);
FileList = nappBindingEnergyXps(FileList,'tableSelection',tmpDataSelection);
% plot C1s spectra
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond',...
'mode','AllInOne','energyScale','kinetic');
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond',...
'mode','AllInOne','energyScale','binding');
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond',... %[output:group:1b93bfe3] %[output:6c799ef9]
'mode','AllInOne','energyScale','kinetic'); %[output:group:1b93bfe3] %[output:6c799ef9]
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond',... %[output:group:01cb9662] %[output:644d063f]
'mode','AllInOne','energyScale','binding'); %[output:group:01cb9662] %[output:644d063f]
%[text] ## Normalize spectra
%[text] Normalization is done to get an estimate of surface concentration and to identify changes in intensity driven by chemical or physical processes from experimental variations, such as changes in working distance.
%%
@@ -239,10 +249,10 @@ tmpDataSelection = (month(FileList.lastModifiedDatenum) == 2) ...
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'})) %[output:1cf215b8]
%%
% fit
FileList = nappFitGaussXps(FileList,tmpFitParameters,tmpDataSelection,... %[output:group:67ea982a] %[output:22c700e4] %[output:3b9a689c] %[output:712f3db2]
'tableVariable','spectrum_countsPerSecond','energyScale','kinetic',... %[output:22c700e4] %[output:3b9a689c] %[output:712f3db2]
'mode','unconstrained','backgroundMode','linear','showFigures','on'); %[output:group:67ea982a] %[output:22c700e4] %[output:3b9a689c] %[output:712f3db2]
xlim([360, 366]);
FileList = nappFitGaussXps(FileList,tmpFitParameters,tmpDataSelection,... %[output:group:67ea982a] %[output:22c700e4] %[output:3b9a689c] %[output:712f3db2] %[output:7541066b]
'tableVariable','spectrum_countsPerSecond','energyScale','kinetic',... %[output:22c700e4] %[output:3b9a689c] %[output:712f3db2] %[output:7541066b]
'mode','unconstrained','backgroundMode','linear','showFigures','on'); %[output:group:67ea982a] %[output:22c700e4] %[output:3b9a689c] %[output:712f3db2] %[output:7541066b]
xlim([360, 366]); %[output:7541066b]
%%
% filter
@@ -251,25 +261,25 @@ tmpDataSelection = (month(FileList.lastModifiedDatenum) == 2) ...
& (day(FileList.lastModifiedDatenum) >= 27) ...
& matches(FileList.name,"0056056_O1s_900eV.ibw");
% show data
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'})) %[output:8f9f23b4]
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'})) %[output:969d4f09]
% fit
FileList = nappFitGaussXps(FileList,tmpFitParameters,tmpDataSelection,... %[output:group:1a1bf894] %[output:969d4f09] %[output:608e038f] %[output:598292bc]
'tableVariable','spectrum_countsPerSecond','energyScale','kinetic',... %[output:969d4f09] %[output:608e038f] %[output:598292bc]
'mode','unconstrained','backgroundMode','linear','showFigures','on'); %[output:group:1a1bf894] %[output:969d4f09] %[output:608e038f] %[output:598292bc]
xlim([360, 366]);
FileList = nappFitGaussXps(FileList,tmpFitParameters,tmpDataSelection,... %[output:group:1a1bf894] %[output:880f99d8] %[output:608e038f] %[output:598292bc] %[output:342429e8]
'tableVariable','spectrum_countsPerSecond','energyScale','kinetic',... %[output:880f99d8] %[output:608e038f] %[output:598292bc] %[output:342429e8]
'mode','unconstrained','backgroundMode','linear','showFigures','on'); %[output:group:1a1bf894] %[output:880f99d8] %[output:608e038f] %[output:598292bc] %[output:342429e8]
xlim([360, 366]); %[output:342429e8]
% select
tmpDataSelection = (month(FileList.lastModifiedDatenum) == 2) ...
& (year(FileList.lastModifiedDatenum) == 2022) ...
& (day(FileList.lastModifiedDatenum) >= 27) ...
& matches(FileList.name,"0060060_O1s_900eV.ibw");
% List the selected files in the command window.
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'})) %[output:0ab41352]
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','scientaPassEnergy_eV'})) %[output:326c5622]
%%
% fit
FileList = nappFitGaussXps(FileList,tmpFitParameters,tmpDataSelection,... %[output:group:9c54ed73] %[output:326c5622] %[output:5bd5684a] %[output:42116ac3]
'tableVariable','spectrum_countsPerSecond','energyScale','kinetic',... %[output:326c5622] %[output:5bd5684a] %[output:42116ac3]
'mode','unconstrained','backgroundMode','linear','showFigures','on'); %[output:group:9c54ed73] %[output:326c5622] %[output:5bd5684a] %[output:42116ac3]
xlim([360, 366]);
FileList = nappFitGaussXps(FileList,tmpFitParameters,tmpDataSelection,... %[output:group:9c54ed73] %[output:7f2dd5ee] %[output:5bd5684a] %[output:42116ac3] %[output:31491535]
'tableVariable','spectrum_countsPerSecond','energyScale','kinetic',... %[output:7f2dd5ee] %[output:5bd5684a] %[output:42116ac3] %[output:31491535]
'mode','unconstrained','backgroundMode','linear','showFigures','on'); %[output:group:9c54ed73] %[output:7f2dd5ee] %[output:5bd5684a] %[output:42116ac3] %[output:31491535]
xlim([360, 366]); %[output:31491535]
%%
%[text] ### Norm the spectra
%[text] The example table lists the three C1s spectra ( 0035035\_C1s\_900eV.ibw ,  0056056\_C1s\_900eV.ibw ,  0060060\_C1s\_900eV.ibw ) and their plots. After scaling, you can compare the C1s spectra directly, since the intensities now reflect a concentration (carbon relative to ice).
@@ -282,14 +292,14 @@ tmpDataSelection = matches(FileList.sample,'Ice with N2')...
& (year(FileList.lastModifiedDatenum) == 2022) ...
& (day(FileList.lastModifiedDatenum) >= 27);
% show data
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','sample'})) %[output:0e8d0cec]
disp(FileList(tmpDataSelection,{'name','sampleTemp_dC','cellPressure_mbar'})) %[output:65618880]
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','sample'})) %[output:65618880]
disp(FileList(tmpDataSelection,{'name','sampleTemp_dC','cellPressure_mbar'})) %[output:9c77f960]
% scale
FileList = nappScale(FileList,tmpDataSelection,'regionOld','C1s','regionNew','O1s'); % C1s with O1s area
% plot scaled data
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsNorm');
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsNorm'); %[output:43e6e41e]
% plot original data
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond');
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond'); %[output:8d96736e]
% filter the data O1s
tmpDataSelection = matches(FileList.sample,'Ice with N2')...
@@ -300,15 +310,15 @@ tmpDataSelection = matches(FileList.sample,'Ice with N2')...
& (year(FileList.lastModifiedDatenum) == 2022) ...
& (day(FileList.lastModifiedDatenum) >= 27);
% show data
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','sample'})) %[output:9c77f960]
disp(FileList(tmpDataSelection,{'name','sampleTemp_dC','cellPressure_mbar'})) %[output:506ce9c9]
disp(FileList(tmpDataSelection,{'name','lastModifiedDatestr','sample'})) %[output:506ce9c9]
disp(FileList(tmpDataSelection,{'name','sampleTemp_dC','cellPressure_mbar'})) %[output:5432d349]
% scale
FileList = nappScale(FileList,tmpDataSelection,'regionOld','O1s','regionNew','O1s'); % O1s with O1s area
% plot scaled data
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsNorm');
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsNorm'); %[output:15414432]
% plot original data
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond');
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond'); %[output:93ebe7fc]
%%
%[text] ## Calculate surface coverage
%[text] Ensure that the dosing yields a surface coverage that is low enough to address your science question, but high enough to provide spectra with sufficient intensity for reliable fitting and interpretation (remember, you can always measure longer to improve signal‑to‑noise).
@@ -327,86 +337,128 @@ nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond');
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>sample<\/strong> \n <strong>____________________________<\/strong> <strong>________________________<\/strong> <strong>________________________________<\/strong>\n\n {'0128128_Survey_850eV.ibw'} {'28-Nov-2025 14:08:31'} {'this is a sample description'}\n\n","truncated":false}}
%---
%[output:04fdda4a]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABPwAAAMeCAYAAACJFhrxAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQXUJMXZtmvx\/XFZbNmFEFicwALBITgkuLtDIAkuGwi+i2uwLMGdQHB31wSCbAghuPsuHgiB\/9z9fTVfdb01Mz3zTk\/XdF91zh4OM9Ul11Mz7\/Tdjwz44YcffjA0CEAAAhCAAAQgAAEIQAACEIAABCAAAQhAoBQEBiD4lcKObAICEIAABCAAAQhAAAIQgAAEIAABCEAAAgkBBD8OAgQgAAEIQAACEIAABCAAAQhAAAIQgAAESkQAwa9ExmQrEIAABCAAAQhAAAIQgAAEIAABCEAAAhBA8OMMQAACEIAABCAAAQhAAAIQgAAEIAABCECgRAQQ\/EpkTLYCAQhAAAIQgED8BL777jvz3\/\/+10w88cTxL5YVQgACEIAABCAAAQj0JAEEv540G4uGAAQgAIFeIfD999+b119\/3fznP\/8xs88+u5lgggnaWvqHH35Yu27gwIFmsskmyzyOBCatYYoppjCDBg3KfJ3tqLW\/\/fbb5ocffjCzzDKLmXDCCdsaY9y4cbXrppxySjPRRBNlHieGPWRerNfxk08+MRdeeKF5\/vnnzSuvvGJeffXVpMe0005r5plnHjP\/\/PObbbfd1kw\/\/fTtTsF1XSTw5ZdfmnfeeSf5DM4wwwxmvPHG6+Ls\/zPVe++9Zz766CPzox\/9yEw66aS5za+z+uCDD6bGHzZsmFliiSUazvnII4+Yl156KdVnueWWM7PNNlvwOn1GRo8enXpvs802S\/an9vnnn5tbbrml9r6Y\/\/znP89177lBZWAIQAACEIBAlwgg+HUJNNNAAAIQgEC1CFx66aXmjjvuME899ZSRQGDbYostZpZZZhmz6667Zhb\/dGP\/05\/+tDaGbrYvu+yyhkA\/+OADc\/HFF5u\/\/OUv5oknnqj1lTgw77zzml122cWssMIKdcf49ttvzSWXXGK0DytQ2c4S\/bbZZhuz1VZbZRbtxEJz2rb33nub3\/zmNz21h1ZPsITSCy64wJx66qmpM1BvnJ133tnsscceRoIuLS4CEqR+\/\/vfJ6LTxx9\/nFrcggsumJzllVdeObhoiV+jRo3KvKHtt9\/ebLjhhn36axx97h9\/\/PHUGuaee24zfPhws+eee5rpppsu8zxZOj700ENm6623TnXV98dNN93U8PKVVlqpz\/eGhMPBgwcHr\/vHP\/5hfvGLX6Teu+KKK2rfe\/oO0phuu\/rqq83CCy+cZRv0gQAEIAABCFSSAIJfJc3OpiEAAQhAIC8C8oI7\/vjj+3ir+PPJO+Wkk07KJJidcsopiWhkWzPBT96Am266aZ8bbn8NEii0Vnnbue3dd981W265ZdPr5X0jUXHmmWduinOjjTYyTz75ZK3fXnvtZXbbbbe618W4h6ab9Doce+yx5qyzzmrpMp0L2boIr7GWFlqhzhK9JNC7wn1o+\/o8nXnmmX2EfHl3Hn744ZmJHXDAAWannXZK9b\/rrruMBOFGTZ9HCfQzzjhj5rmadZRnrUQ1f+8SH+vN89Zbbxl587ltkUUWMVdddVXd6RD8mlmC9yEAAQhAAAKtE0Dwa50ZV0AAAhCAAATqEvDFuUaoJO6cfvrpdbt88803yQ287x3USPAbO3as2WKLLcwLL7yQyUrrrrtuIjzapht8XS\/PwCxNnofyBKwXqizhTkwuv\/zy1HCNBL\/Y9pCFg9\/n3nvvNTvssEM7lyZefvpHK56AxO9VV121qdhnV7r77rsnnnZuO\/LII825556beTO+4CfPOHnUZmnyvpX3ncL3O9UOO+wwc9FFF6WGO\/HEE816660XnEKeeQceeGDqPY3hewq6HRD8OmUtxoEABCAAAQj8HwEEP04DBCAAAQhAoEMEvv76azPffPP1GW2ttdZKwjRvvvnmPsLB3XffXctTpQvlTfT0008n+bkUBqtcXX5rJPgp7FD\/3KYw3qWWWspIzJMQ5TflzpKooVZPqNIexh9\/fHPdddf1uf6Pf\/xjKpxRnjzKcfbmm2+aa665Jki3keAXwx76eyQU4unmHNN4ykmmMGp5O8kWyuknVn4\/9X3xxRczh3z3d61cX59AyEtTuRcVfqp8jPq8+k2erFNPPXXtZXnmyUMvazv66KPNJptsUuuu\/I4PPPBA6nKlBZhjjjmSceVR57YTTjjBrL\/++lmna9rvscceM5tvvnmqn\/Z\/2mmnBa8N7beRR6AGUQoC96GAPFzlZWw5EtLb1Ex0gAAEIAABCPQhgODHoYAABCAAAQh0iMBtt91mfvWrX6VGc8W0MWPGmLXXXjv1\/r777pu6Rp4x8pBp1BoJfgqlcwWAH\/\/4x+bKK6+s3TiHBD3Xy++4447rE47s5t5S8Y5ll102tTzfq0niYkiodC9qJPjFsIf+HAlV4F1ooYVS4q7EPnl6+U1FXXQGfCFV4rAKenSrffHFF+a1114z8shceumlM4Wat7o2cXnjjTeSUPHJJ5882V8rxWdana8T\/fXZePbZZ2tDKWz29ttvr4mxN954Yx9vTHnDSZCzbZVVVjEvv\/xy8r8SC7N6z6q\/7LH44ountrLddtuZgw8+OHlNdpNY737eNLfvkecO0KodJE4vueSSqbyBeojwt7\/9rY8oHXroIS\/gZt9pzWzVTPBTUQ8J6EovIC\/HAQMGNBuS9yEAAQhAAAKlJ4DgV3oTs0EIQAACEOgWAYl9Ev1sUzJ\/X8hRqKZEAtskIMjLz7b+CH6fffZZIjS5zfe+03shQe3OO+9MLpP45HrlhcRFefvI68c2Pyy4P4JfLHvoz5kJiTRHHXVUklcx1CQAuR5d6uN6edmwUvdajSevS7eF+imHoOyhJs9RFVqxTd5T999\/vzn77LPNMcccU3tdxRD88EsJPjpLflMBiR133DH1snIzuvnm5K06cuTI1Lm3F0iQVjGGX\/\/614kIaJs8JLU2t8kTcsiQIX3WoPyQbgi7qh27n6n+2FJFdtwiHb5QHRK4XNspp6f2aJvEcuX0y9ok3Ckc1m3PPPNMilUohDbkUdeOHey8RxxxRFKAxm3yTpW3qttCRT4anX17rbwl11lnndRYms+OX0\/wUyVgFTIRE9skRkpkFTc3tFnfU1Z4VV\/Zxf1+tvkK3UXIk9H9bEhg1WfBbfLA3GeffbKalH4QgAAEIACBrhFA8OsaaiaCAAQgAIGyE\/DFAeXdOvTQQ1PbVi4v39NLHkTW00k3748++mjqGt28u6JDPQ+\/f\/7zn2aNNdZIXRuqjBnKyaUbYXnFSNRxb3B9QVKDux5L+v\/99tsvKWpgmwoUqKqp21yRU6\/X8\/CLZQ\/9OasSDoYNG5YaQpVNJd5MM800fYZW\/9dffz31ujyVbLXekFdlKGxTNpRt3CZxyXpk+rngJIxIrPNDwCXiSXzxvTTdc2rnCHmESjy2Ipc8SuUB2qzghTzfJDQOHTo0GTr0OZFoqPySbmvmAdcfO+paP5xWgqlbgEOhqPo8us0Vwvz1ibef367RGn0BPvR5lNjl59M7\/\/zzzfLLL18bul072AFConQoX6HEvXPOOSe1JZ2nQYMGNTRFOzn89ODCD3V2J5GnnzjYs+izVF+J4FYUDK1BY7hzaC\/y1nWbzmqjiuf9PYNcDwEIQAACEGiXAIJfu+S4DgIQgAAEIOAQUGimcmq5LeTZEkrAL0+mkOeSHUvCoa6zrZ7gp2IXKvIhryLbfvnLX\/YJz\/RFDDfMMJSvSx5L8o5Rk3C3\/\/77p\/bphzCGDsbss8+eerme4BfzHlo58H5VYnutcqtJiJHnUpbqxrouL8Gv3n6eeOKJpBCLWxlafUPChi\/+SthU0Yh6627EUGKWrpXQGdqzRBW\/+MUNN9zQp0iGhENVlu1EU566k08+uTaURNLzzjvPLLroombcuHGJWOqHz7rC6HPPPZfyXFMhl6+++sr8\/e9\/T7zN5I0oZiuuuGLSz6\/O7H9W5dXpC7TyOpM3sdtcQTjEMqsdbD+FAet7x33wMPfcc\/fJP+l7D2f1aGxH8MtiXzcEOxR+rXNuPWDl2SxR0G9\/\/etfa0K9\/0BEfWVjnQsaBCAAAQhAIDYCCH6xWYT1QAACEIBATxL49NNP+4gMZ5xxRh+PO+W92mCDDVJ71I2mH4rrdsgq+GUBF5pfN+k2XE9ioebzixHYG1rfU0sChCp21qvSa9eUVfCLeQ9Z1mb7+EJR6NoZZ5wxCa9WjjPlaRs8eHBwiiIEPwmvq622Wmo9Ep8OOeSQ2muhdbnVWEOFSyTaKYRXIpVCiV0BSQNLzLKhygqBlvjoNt\/LcO+9906FZYrpww8\/3LEcbuIgG\/nnXiK5v3atU6GvKjZh26233pqEK2dpEoHlMSmRyjZV8nbDlX0Pw3qfr9\/+9re1sOr+2sHOEao27IYOh8JutZ8NN9yw6fb7I\/jJFhI8dVZCnqSqQq4HFiFvUNc7WR6k8gj0m+sl67MMidBNN0sHCEAAAhCAQJcIIPh1CTTTQAACEIBAuQkoB9XKK6+c2mTIIyp0Y6sQOHn41GudEvxUNVchkX5Vz1NOOSVVTEQJ8BW2piT4jZqEKuXP8r2SQtd0SvArcg+tnGCF6cqby\/XMbHa9hK5ddtmlT7GOvAU\/eWopZ59spDx6c845ZyLgrrnmmqkz4Ic3hnLH2fDN0DmXeCUh1BZUUNi3POXc5orPf\/rTn8wBBxyQet\/NSRkqjqL8gfIe7WQLhUqHxld+Tv1zWyg0udHaJPYpV+HEE0+cdPPTBMhjd8SIEX2GWGCBBVJil+3XCTvYyVR9WJ6rbpPYb8OJ5S3nCsLine truncated
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQW0XEXWtguCfgNBEyQQLAQI7jDY4O7BXQfXQQdPcBIYNAxOcAZ3h+DMwCDBnaAJEJyBQf71nu+r\/qvrnu4+3Xf3vZ3qZ6+VNUN3nX1qP7u6773v2bVrvN9\/\/\/13h0EAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgMA4S2A8hN5xNndMHAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIBARgChl4UAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQGAcJ4DQO44nkOlDAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEEDoZQ1AAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEBjHCSD0juMJZPoQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABBB6WQMQgAAEIAABCEAAAl1O4JdffnG\/\/vqrm3jiibv83twQAhCAAAQgAAEIQAACKRJA6E0xq8QEAQhAAAIQaDECv\/32m3v\/\/ffdf\/\/7Xzf77LO7CSaYoKEZjhkzpnTdpJNO6iabbLLCfiQsag49e\/Z0vXr1KnydH6i5f\/TRR+733393M800k5twwgkb8vHVV1+VrptiiincRBNNVNhPK8RQeLLRwC+\/\/NJddtll7pVXXnHvvPOOe\/fdd7MR00wzjZtnnnncfPPN57bffnvXu3fvRm\/BdV1I4Pvvv3cff\/xx9hmcbrrp3Pjjj9+Fd\/\/fW3366afu888\/d7PNNpv7wx\/+0LT7a60++uijZf779+\/vllpqqar3fOKJJ9xbb71VNmb55Zd3s846a+51+owMGzas7L0tttgii0\/27bffujvvvLP0vpivtdZaTY29aVBxDAEIQAACEIBAUwgg9DYFK04hAAEIQAACEBCBK6+80t17773uueeecxKGvC2++OJu2WWXdbvvvnth0VeCzhJLLFHyIZHlqquuqgp69OjRbvjw4e6f\/\/yne+aZZ0pjJQoNGDDA7bbbbm7FFVes6OPnn392V1xxRRaHFyb9YIm92223ndtmm20Ki7VioXt6O+CAA9xee+01TsVQ78qWQH7ppZe6M888s2wNVPKz6667un333ddJyMdai4CEyL\/97W+Z2PjFF1+UTW6BBRbI1vIqq6ySO2mJnoMHDy4c0I477ugGDhzYYbz86HP\/9NNPl81h7rnndosssojbb7\/93LTTTlv4PkUGPvbYY27bbbctG6rvj9tvv73q5SuvvHKH7w0Jxn369Mm97tVXX3Vrr7122XvXXHNN6XtP30HyGdoNN9zgFl544SJhMAYCEIAABCAAgTYggNDbBkkmRAhAAAIQgEBXE1DV66mnntqhOi2eh6rRhg4dWkgoPeOMMzKx0FstoVfVv5tvvnkHoSWeg4QpzVXVtaF98sknbuutt655vartJCbPOOOMNTFvsskm7tlnny2N23\/\/\/d3ee+9d8bpWjKFmkNGAk08+2Z1\/\/vl1XaZ1oVx3R5VoXRNto8ESO\/VgJnxgkxe+Pk\/nnntuhwc4quY+9thjCxM77LDD3C677FI2\/v7773d6EFDN9HnUg5npp5++8L1qDVQlvcTUOHaJzpXu8+GHHzpV74a26KKLuuuvv77i7RB6a2WC9yEAAQhAAAIQqEUAobcWId6HAAQgAAEIQKBuArEoW82BRL2zzz674pCffvopE27iasBqQu\/YsWPdVltt5V577bVCc99ggw0ywdmbhB1dr0rgIqZKY1X+VmpJIcFWTK6++uoyd9WE3laLoQiHeMxDDz3kdtppp0Yuzap69Q\/rfgJ66LHaaqvVFHn9TPfZZ5+ssja0448\/3l100UWFg4mFXlXCqoK+iKnaXtW2atNiZcccc4y7\/PLLy9wNGTLEbbjhhrm3UCXu4YcfXvaefMSVweEAhF6rbOEHAhCAAAQg0L4EEHrbN\/dEDgEIQAACEGgKgR9\/\/NHNO++8HXyvu+662Xb8O+64o4Ng9MADD5T6UOpCVQ8+\/\/zzWf9NtTtQL87Yqgm92l6uf6GpXcMf\/\/hHJxFXAmRs6o0pMUtWSaBUDD169HA333xzh+v\/\/ve\/l21bV+WeepiOGjXK3Xjjjbmsqwm9rRBDZxeItvKHPUXlTz1H1S5D1Y3KhXr2ilU8TmPfeOONwq09OjtXrq9MIK8qW72V1WZA\/Zb1eY1NletTTTVV6WVV4qoit6ideOKJbrPNNisNV\/\/mESNGlF2u9i\/9+vXL\/KqCNrTTTjvNbbTRRkVvV3PcU0895bbccsuycYr\/rLPOyr02L95qFcByolYz4cMgVbRrV4HnSOuGmmliAAQgAAEIQKDtCSD0tv0SAAAEIAABCEDAlsDdd9\/t9thjjzKnoYg6cuRIt95665W9\/5e\/\/KXsGlXCqSKumlUTerVlOhR+5phjDnfdddeVBJM8ITes6j3llFM6tJ0Ie2vqULbllluubHpxFaNE5TyBOryomtDbCjF0ZmX8+uuvbqGFFioT9SXyqrIzNh3WpzUQC+h6KKCD2rrKvvvuO\/fee+85VWAvs8wyhVqK1Ds3cfnggw+yliCTTz55Fl89hwrWez+L8fpsvPjiiyVXao9wzz33lET42267rUP1tapfJcR6W3XVVd3bb7+d\/adE4qLV8hqvfCy55JJloeywww7uyCOPzF5T3vSQJvy86d5xBW7ooN486KHE0ksvXdYXWA+P\/v3vf3d4GJH3sEtV\/7W+02rlqpbQq8Pa9OBEbWRU1TzeeOPVcsn7EIAABCAAAQgkRgChN7GEEg4EIAABCECguwlI5JXY602HNMUCnrbkSxzyJuFIVb3eOiP0fvPNN5nAGFpcbav38oTU++67L7tMomNYhZsnKqu6T1V+3uL2D50Relslhs6spTxx7oQTTsj6JueZhL+wglNjwqpO3z4gvFb+VGUdWt449QhWPmSqFNcBet5ULfnII4+4Cy64wJ100kml13XIVbzNXkKf1lJsOhhs5513LntZvZfDfrKqTh80aFDZuvcX6EGEDtnac889M\/HXmyqiNbfQVPk888wzd5iD+j+HrUp69+5d9pnqTC51eGJ4+Fr8gCJP2Axzp57ditGbHpKoZ29Rk2CrtgehvfDCC2Ws8lol5FXQNpIHf9\/jjjsuO1gwNFWjqzo9tLzD26qtfX+tqqPXX3\/9Ml+6n\/dfSeh96623sgPqxMSbRGiJ6+IWtrDQ95QX3DVWeQm\/n30\/4nASqlwOPxsS1vVZCE0V1wceeGDRlDIOAhCAAAQgAIEmEUDobRJY3EIAAhCAAATalUAsCqmv5tFHH12GQ70648pOVQz6ykaJNk8++WTZNRJtQrGpUkXv66+\/7tZcc82ya\/NOus\/ruSkBRFVwEvNCYSMWouU8rFDUfx900EHZYVXedPDUl19+WTaPUNzWG5Uqelslhs6sYQlG\/fv3L3MxYMCArMpy6qmn7uBa499\/\/\/2y11WZqHYfsrwq6rzt+cqhchOaREVfgR33epUgJpE2bvUh8VaiW1yVHa5Tf4+8CnA9NPDipirIVfFd6yAzVbpKYO7bt2\/mOu9zIrFY\/aNDq1Xx2pk86tq4bYKE8vBgNbUc0OcxtFAAjecn3nH\/2mpzjB+85H0eJXLG\/XIvueQSt8IKK5RcN5oH7yDvYUReP2KJuhdeeGFZSFpPvXr1qpqKRnr06oFV3NIivIkqe8XBr8WYpcbq4YcXg\/PmIB\/hPRSLqvND01pVSxYMAhCAAAQgAIHuJYDQ2738uTsEIAABCEAgKQLagq+emaHlVbLlHaykysW8SkXvS4KxrvNWSejVIWY6vE1VhN7+\/Oc\/d9iGH4tX4XbyvH6cqlBUNZxMgu3BBx9cFme8VT0vsbPPPnvZy5WE3laOoZ4FqypT9WqNTb1TJcCpUlFibhFrltBb6d7PPPNMdsDemWeeWTYkT9CKRX8J2joMTJY372rxSsTUtRK4866VmBYfanbrrbd2OPxMgvHCCy9cBG3NMepDe\/rpp5fGSRy\/+OKL3WKLLea++uqrTCSP2ySEgvhLL71UVqmqA\/p++OEH9\/LLL2fVpao+FrOVVlopG6fetKHFn1VVccfCvKpMtXsgtPBBQGfy4H2q3YO+d8IHTnPPPXeH\/tLxboGiFcyNCL01k+dc1v\/ct9rIa7Ohde4r3rWTQWJwbP\/6179KD2jiB2EaqxxrXWAQgAAEIAABCHQvAYTe7uXP3SEAAQhAAAJJEfj66687iEvnnHNOhwpb9bXceOONy2KXwBC3XAgHFBV6iwDNu7\/EGb8tWyKx7hcfMuWFjLgyU8LTkCFDah4cVlTobeUYiszNj4kFwrxrp59++qyNhnqYqg9rnz59cm\/RHUKvBPfVV1+9bD4SHY866qjSa3nzUrW4b\/uQdyCdxFq1apA4qZYRoXAoxxIxfUsKtbqQ6BxaXFV8wAEHlG2\/F9PHH3\/crEerOChH8brXw5F47pqnWhzoEDFvd911V9aWoohJ\/FeFtMRJb2uttVZZW4q4otiPiz9fhx56aKl9Rmfz4O+hnQix0B62iMhrr6B4Bg4cWDP8zgi9yoWEbq2VvMrxoUOHZg+q8qq\/w90IqhhXBXBsYVV8zDLv4UPNYBkAAQhAAAIQgEBTCCD0NgUrTiEAAQhAAALtSUA9JldZZZWy4PMqIPMEDW11VkVfJbMSekeNGpVtfQ8Pa9M9zzjjjLJD4nSwkbYn63CjaiaBUv0x4yrEvGushN7ujKGela12DKreDCuxa10vgXO33XbrcAhbs4VeVWZKnFWO1Cd3zjnnzIT7ddZZp2wNxNvY83rD+Line truncated
%---
%[output:8d5664cd]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABPwAAAMeCAYAAACJFhrxAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQXUJMXZtmvx\/XFZfIEgu3hggeAQCB4guLsFSHDZQFhsF4JDsCxBgweCu7smEGRDgOAQCLqLB\/\/P3d9X81XXWzPTM+\/0dE33Vefs4TBTXXI9NfNO3\/3IgB9++OEHQ4MABCAAAQhAAAIQgAAEIAABCEAAAhCAAARKQWAAgl8p7MgmIAABCEAAAhCAAAQgAAEIQAACEIAABCCQEEDw4yBAAAIQgAAEIAABCEAAAhCAAAQgAAEIQKBEBBD8SmRMtgIBCEAAAhCAAAQgAAEIQAACEIAABCAAAQQ\/zgAEIAABCEAAAhCAAAQgAAEIQAACEIAABEpEAMGvRMZkKxCAAAQgAAEIxE\/g22+\/Nd99952ZeOKJ418sK4QABCAAAQhAAAIQ6EkCCH49aTYWDQEIQAACvULg+++\/N6+\/\/rr55ptvzJxzzmkmmGCCtpb+\/vvv164bOHCgmWyyyTKPI4FJa5hiiinMoEGDMl9nO2rt\/\/73v80PP\/xgZp11VjPhhBO2Nca4ceNq10055ZRmookmyjxODHvIvFiv40cffWT+9Kc\/meeee8688sor5tVXX016TDvttGa++eYzCy64oNluu+3M9NNP3+4UXNdFAp9\/\/rl5++23k8\/gDDPMYMYbb7wuzv4\/U\/3nP\/8xH3zwgfnRj35kJp100tzm11l94IEHUuMPGTLELLXUUg3nfPjhh81LL72U6rPCCiuYOeaYI3idPiOjR49Ovbf55psn+1P79NNPzc0331x7X8zXWmutXPeeG1QGhgAEIAABCHSJAIJfl0AzDQQgAAEIVIvAJZdcYm6\/\/Xbz5JNPGgkEti2xxBJmueWWM7vttltm8U839j\/5yU9qY+hm+9JLL20I9L333jMXXXSR+etf\/2oef\/zxWl+JA\/PPP7\/ZddddzUorrVR3jK+\/\/tpcfPHFRvuwApXtLNFv2223NVtvvXVm0U4sNKdt++67r\/n1r3\/dU3to9QRLKL3gggvMqaeemjoD9cbZZZddzF577WUk6NLiIiBB6ve\/\/30iOn344YepxS288MLJWV5llVWCi5b4NWrUqMwb2mGHHcxGG23Up7\/G0ef+scceS61h3nnnNcOGDTN77723mW666TLPk6Xjgw8+aLbZZptUV31\/3HjjjQ0v\/9nPftbne0PC4SyzzBK87p\/\/\/Kf5+c9\/nnrv8ssvr33v6TtIY7rtqquuMosuumiWbdAHAhCAAAQgUEkCCH6VNDubhgAEIACBvAjIC+7444\/v463izyfvlJNOOimTYHbKKackopFtzQQ\/eQNuttlmfW64\/TVIoNBa5W3ntnfeecdstdVWTa+X941ExZlnnrkpzo033tg88cQTtX777LOP2WOPPepeF+Memm7S63Dssceas846q6XLdC5k6yK8xlpaaIU6S\/SSQO8K96Ht6\/N05pln9hHy5d15xBFHZCZ20EEHmZ133jnV\/8477zQShBs1fR4l0M8444yZ52rWUZ61EtX8vUt8rDfPW2+9ZeTN57bFFlvMXHnllXWnQ\/BrZgnehwAEIAABCLROAMGvdWZcAQEIQAACEKhLwBfnGqGSuHP66afX7fLVV18lN\/C+d1AjwW\/s2LFmyy23NM8\/\/3wmK6233nqJ8GibbvB1vTwDszR5HsoTsF6osoQ7MbnssstSwzUS\/GLbQxYOfp977rnH7Ljjju1cmnj56R+teAISv1dbbbWmYp9d6Z577pl42rntqKOOMueee27mzfiCnzzj5FGbpcn7Vt53Ct\/vVDv88MPNhRdemBruxBNPNOuvv35wCnnmHXzwwan3NIbvKeh2QPDrlLUYBwIQgAAEIPB\/BBD8OA0QgAAEIACBDhH48ssvzQILLNBntHXWWScJ07zpppv6CAd33XVXLU+VLpQ30VNPPZXk51IYrHJ1+a2R4KewQ\/1zm8J4l1lmGSMxT0KU35Q7S6KGWj2hSnsYf\/zxzbXXXtvn+j\/+8Y+pcEZ58ijH2ZtvvmmuvvrqIN1Ggl8Me+jvkVCIp5tzTOMpJ5nCqOXtJFsop59Y+f3U98UXX8wc8t3ftXJ9fQIhL03lXlT4qfIx6vPqN3myTj311LWX5ZknD72s7Xe\/+53ZdNNNa92V3\/H+++9PXa60AHPPPXcyrjzq3HbCCSeYDTbYIOt0Tfs9+uijZosttkj10\/5PO+204LWh\/TbyCNQgSkHgPhSQh6u8jC1HQnqbmokOEIAABCAAgT4EEPw4FBCAAAQgAIEOEbj11lvN7rvvnhrNFdPGjBlj1l133dT7+++\/f+oaecbIQ6ZRayT4KZTOFQDmmmsuc8UVV9RunEOCnuvld9xxx\/UJR3Zzb6l4x\/LLL59anu\/VJHExJFS6FzUS\/GLYQ3+OhCrwLrLIIilxV2KfPL38pqIuOgO+kCpxWAU9utU+++wz89prrxl5ZC677LKZQs1bXZu4vPHGG0mo+OSTT57sr5XiM63O14n++mw888wztaEUNnvbbbfVxNgbbrihjzemvOEkyNm26qqrmpdffjn5X4mFWb1n1V\/2WHLJJVNb2X777c2IESOS12Q3ifXu501z+x557gCt2kHi9NJLL53KG6iHCH\/\/+9\/7iNKhhx7yAm72ndbMVs0EPxX1kICu9ALychwwYECzIXkfAhCAAAQgUHoCCH6lNzEbhAAEIACBbhGQ2CfRzzYl8\/eFHIVqSiSwTQKCvPxs64\/g98knnyRCk9t87zu9FxLU7rjjjuQyiU+uV15IXJS3j7x+bPPDgvsj+MWyh\/6cmZBIc\/TRRyd5FUNNApDr0aU+rpeXDSt1r9V48rp0W6ifcgjKHmryHFWhFdvkPXXfffeZs88+2xxzzDG111UMwQ+\/lOCjs+Q3FZDYaaedUi8rN6Obb07eqiNHjkyde3uBBGkVY\/jVr36ViIC2yUNSa3ObPCEHDx7cZw3KD+mGsKvasfuZ6o8tVWTHLdLhC9Uhgcu1nXJ6ao+2SSxXTr+sTcKdwmHd9vTTT6dYhUJoQx517djBznvkkUcmBWjcJu9Ueau6LVTko9HZt9fKW\/IXv\/hFaizNZ8evJ\/ipErAKmYiJbRIjJbKKmxvarO8pK7yqr+zifj\/bfIXuIuTJ6H42JLDqs+A2eWDut99+WU1KPwhAAAIQgEDXCCD4dQ01E0EAAhCAQNkJ+OKA8m4ddthhqW0rl5fv6SUPIuvppJv3Rx55JHWNbt5d0aGeh98LL7xg1lxzzdS1ocqYoZxcuhGWV4xEHfcG1xckNbjrsaT\/P+CAA5KiBrapQIGqmrrNFTn1ej0Pv1j20J+zKuFgyJAhqSFU2VTizTTTTNNnaPV\/\/fXXU6\/LU8lW6w15VYbCNmVD2cZtEpesR6afC07CiMQ6PwRcIp7EF99L0z2ndo6QR6jEYytyyaNUHqDNCl7I801C42yzzZYMHfqcSDRUfkm3NfOA648dda0fTivB1C3AoVBUfR7d5gph\/vrE289v12iNvgAf+jxK7PLz6Z1\/\/vlmxRVXrA3drh3sACFROpSvUOLeOeeck9qSztOgQYMamqKdHH56cOGHOruTyNNPHOxZ9Fmqr0RwKwqG1qAx3Dm0F3nruk1ntVHF8\/6eQa6HAAQgAAEItEsAwa9dclwHAQhAAAIQcAgoNFM5tdwW8mwJJeCXJ1PIc8mOJeFQ19lWT\/BTsQsV+ZBXkW2\/\/OUv+4Rn+iKGG2YYytcljyV5x6hJuDvwwANT+\/RDGEMHY84550y9XE\/wi3kPrRx4vyqxvVa51STEyHMpS3VjXZeX4FdvP48\/\/nhSiMWtDK2+IWHDF38lbKpoRL11N2IoMUvXSugM7Vmiil\/84vrrr+9TJEPCoSrLdqIpT93JJ59cG0oi6XnnnWcWX3xxM27cuEQs9cNnXWH02WefTXmuqZDLF198Yf7xj38k3mbyRhSzlVdeOennV2f2P6vy6vQFWnmdyZvYba4gHGKZ1Q62n8KA9b3jPniYd955++Sf9L2Hs3o0tiP4ZbGvG4IdCr\/WObcesPJslijot7\/97W81od5\/IKK+srHOBQ0CEIAABCAQGwEEv9gswnogAAEIQKAnCXz88cd9RIYzzjijj8ed8l5tuOGGqT3qRtMPxXU7ZBX8soALza+bdBuuJ7FQ8\/nFCOwNre+pJQFCFTvrVem1a8oq+MW8hyxrs318oSh07YwzzpiEVyvHmfK0zTLLLMEpihD8JLyuvvrqqfVIfDr00ENrr4XW5VZjDRUukWinEF6JVAoldgUkDSwxy4YqKwRa4qPbfC\/DfffdNxWWKaYPPfRQx3K4iYNs5J97ieT+2rVOhb6q2IRtt9xySxKunKVJBJbHpEQq21TJ2w1X9j0M632+fvOb39TCqvtrBztHqNqwGzocCrvVfjbaaKOm2++P4CdbSPDUWQl5kqoKuR5YhLxBXe9keZDKI9BvrpeszzIkQjfdLB0gAAEIQAACXSKA4Ncl0EwDAQhAAALlJqAcVKusskpqkyGPqNCNrULg5OFTr3VK8FPVXIVE+lU9TznllFQxESXAV9iakuA3ahKqlD\/L90oKXdMpwa\/IPbRyghWmK28u1zOz2fUSunbdddc+xTryFvzkqaWcfbKR8ujNM888iYC79tprp86AH94Yyh1nwzdD51zilYRQW1BBYd\/ylHObKz7\/+c9\/NgcddFDqfTcnZag4ivIHynu0ky0UKh0aX\/k59c9todDkRmuT2KdchRNPPHHSzU8TII\/d4cOH9xlioYUWSoldtl8n7GAnU\/Vhea66TWK\/DLine truncated
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQW0XEXWtguCfgNBEyQQLAQI7jDY4O7BXQfXQQdPcBIYNAxOcAZ3h+DMwCDBnaAJEJyBQf71nu+r\/qvrnu4+3Xf3vZ3qZ6+VNUN3nX1qP7u6773v2bVrvN9\/\/\/13h0EAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgMA4S2A8hN5xNndMHAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIBARgChl4UAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQGAcJ4DQO44nkOlDAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEEDoZQ1AAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEBjHCSD0juMJZPoQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABBB6WQMQgAAEIAABCEAAAl1O4JdffnG\/\/vqrm3jiibv83twQAhCAAAQgAAEIQAACKRJA6E0xq8QEAQhAAAIQaDECv\/32m3v\/\/ffdf\/\/7Xzf77LO7CSaYoKEZjhkzpnTdpJNO6iabbLLCfiQsag49e\/Z0vXr1KnydH6i5f\/TRR+733393M800k5twwgkb8vHVV1+VrptiiincRBNNVNhPK8RQeLLRwC+\/\/NJddtll7pVXXnHvvPOOe\/fdd7MR00wzjZtnnnncfPPN57bffnvXu3fvRm\/BdV1I4Pvvv3cff\/xx9hmcbrrp3Pjjj9+Fd\/\/fW3366afu888\/d7PNNpv7wx\/+0LT7a60++uijZf779+\/vllpqqar3fOKJJ9xbb71VNmb55Zd3s846a+51+owMGzas7L0tttgii0\/27bffujvvvLP0vpivtdZaTY29aVBxDAEIQAACEIBAUwgg9DYFK04hAAEIQAACEBCBK6+80t17773uueeecxKGvC2++OJu2WWXdbvvvnth0VeCzhJLLFHyIZHlqquuqgp69OjRbvjw4e6f\/\/yne+aZZ0pjJQoNGDDA7bbbbm7FFVes6OPnn392V1xxRRaHFyb9YIm92223ndtmm20Ki7VioXt6O+CAA9xee+01TsVQ78qWQH7ppZe6M888s2wNVPKz6667un333ddJyMdai4CEyL\/97W+Z2PjFF1+UTW6BBRbI1vIqq6ySO2mJnoMHDy4c0I477ugGDhzYYbz86HP\/9NNPl81h7rnndosssojbb7\/93LTTTlv4PkUGPvbYY27bbbctG6rvj9tvv73q5SuvvHKH7w0Jxn369Mm97tVXX3Vrr7122XvXXHNN6XtP30HyGdoNN9zgFl544SJhMAYCEIAABCAAgTYggNDbBkkmRAhAAAIQgEBXE1DV66mnntqhOi2eh6rRhg4dWkgoPeOMMzKx0FstoVfVv5tvvnkHoSWeg4QpzVXVtaF98sknbuutt655vartJCbPOOOMNTFvsskm7tlnny2N23\/\/\/d3ee+9d8bpWjKFmkNGAk08+2Z1\/\/vl1XaZ1oVx3R5VoXRNto8ESO\/VgJnxgkxe+Pk\/nnntuhwc4quY+9thjCxM77LDD3C677FI2\/v7773d6EFDN9HnUg5npp5++8L1qDVQlvcTUOHaJzpXu8+GHHzpV74a26KKLuuuvv77i7RB6a2WC9yEAAQhAAAIQqEUAobcWId6HAAQgAAEIQKBuArEoW82BRL2zzz674pCffvopE27iasBqQu\/YsWPdVltt5V577bVCc99ggw0ywdmbhB1dr0rgIqZKY1X+VmpJIcFWTK6++uoyd9WE3laLoQiHeMxDDz3kdtppp0Yuzap69Q\/rfgJ66LHaaqvVFHn9TPfZZ5+ssja0448\/3l100UWFg4mFXlXCqoK+iKnaXtW2atNiZcccc4y7\/PLLy9wNGTLEbbjhhrm3UCXu4YcfXvaefMSVweEAhF6rbOEHAhCAAAQg0L4EEHrbN\/dEDgEIQAACEGgKgR9\/\/NHNO++8HXyvu+662Xb8O+64o4Ng9MADD5T6UOpCVQ8+\/\/zzWf9NtTtQL87Yqgm92l6uf6GpXcMf\/\/hHJxFXAmRs6o0pMUtWSaBUDD169HA333xzh+v\/\/ve\/l21bV+WeepiOGjXK3Xjjjbmsqwm9rRBDZxeItvKHPUXlTz1H1S5D1Y3KhXr2ilU8TmPfeOONwq09OjtXrq9MIK8qW72V1WZA\/Zb1eY1NletTTTVV6WVV4qoit6ideOKJbrPNNisNV\/\/mESNGlF2u9i\/9+vXL\/KqCNrTTTjvNbbTRRkVvV3PcU0895bbccsuycYr\/rLPOyr02L95qFcByolYz4cMgVbRrV4HnSOuGmmliAAQgAAEIQKDtCSD0tv0SAAAEIAABCEDAlsDdd9\/t9thjjzKnoYg6cuRIt95665W9\/5e\/\/KXsGlXCqSKumlUTerVlOhR+5phjDnfdddeVBJM8ITes6j3llFM6tJ0Ie2vqULbllluubHpxFaNE5TyBOryomtDbCjF0ZmX8+uuvbqGFFioT9SXyqrIzNh3WpzUQC+h6KKCD2rrKvvvuO\/fee+85VWAvs8wyhVqK1Ds3cfnggw+yliCTTz55Fl89hwrWez+L8fpsvPjiiyVXao9wzz33lET42267rUP1tapfJcR6W3XVVd3bb7+d\/adE4qLV8hqvfCy55JJloeywww7uyCOPzF5T3vSQJvy86d5xBW7ooN486KHE0ksvXdYXWA+P\/v3vf3d4GJH3sEtV\/7W+02rlqpbQq8Pa9OBEbWRU1TzeeOPVcsn7EIAABCAAAQgkRgChN7GEEg4EIAABCECguwlI5JXY602HNMUCnrbkSxzyJuFIVb3eOiP0fvPNN5nAGFpcbav38oTU++67L7tMomNYhZsnKqu6T1V+3uL2D50Relslhs6spTxx7oQTTsj6JueZhL+wglNjwqpO3z4gvFb+VGUdWt449QhWPmSqFNcBet5ULfnII4+4Cy64wJ100kml13XIVbzNXkKf1lJsOhhs5513LntZvZfDfrKqTh80aFDZuvcX6EGEDtnac889M\/HXmyqiNbfQVPk888wzd5iD+j+HrUp69+5d9pnqTC51eGJ4+Fr8gCJP2Axzp57ditGbHpKoZ29Rk2CrtgehvfDCC2Ws8lol5FXQNpIHf9\/jjjsuO1gwNFWjqzo9tLzD26qtfX+tqqPXX3\/9Ml+6n\/dfSeh96623sgPqxMSbRGiJ6+IWtrDQ95QX3DVWeQm\/n30\/4nASqlwOPxsS1vVZCE0V1wceeGDRlDIOAhCAAAQgAIEmEUDobRJY3EIAAhCAAATalUAsCqmv5tFHH12GQ70648pOVQz6ykaJNk8++WTZNRJtQrGpUkXv66+\/7tZcc82ya\/NOus\/ruSkBRFVwEvNCYSMWouU8rFDUfx900EHZYVXedPDUl19+WTaPUNzWG5Uqelslhs6sYQlG\/fv3L3MxYMCArMpy6qmn7uBa499\/\/\/2y11WZqHYfsrwq6rzt+cqhchOaREVfgR33epUgJpE2bvUh8VaiW1yVHa5Tf4+8CnA9NPDipirIVfFd6yAzVbpKYO7bt2\/mOu9zIrFY\/aNDq1Xx2pk86tq4bYKE8vBgNbUc0OcxtFAAjecn3nH\/2mpzjB+85H0eJXLG\/XIvueQSt8IKK5RcN5oH7yDvYUReP2KJuhdeeGFZSFpPvXr1qpqKRnr06oFV3NIivIkqe8XBr8WYpcbq4YcXg\/PmIB\/hPRSLqvND01pVSxYMAhCAAAQgAIHuJYDQ2738uTsEIAABCEAgKQLagq+emaHlVbLlHaykysW8SkXvS4KxrvNWSejVIWY6vE1VhN7+\/Oc\/d9iGH4tX4XbyvH6cqlBUNZxMgu3BBx9cFme8VT0vsbPPPnvZy5WE3laOoZ4FqypT9WqNTb1TJcCpUlFibhFrltBb6d7PPPNMdsDemWeeWTYkT9CKRX8J2joMTJY372rxSsTUtRK4866VmBYfanbrrbd2OPxMgvHCCy9cBG3NMepDe\/rpp5fGSRy\/+OKL3WKLLea++uqrTCSP2ySEgvhLL71UVqmqA\/p++OEH9\/LLL2fVpao+FrOVVlopG6fetKHFn1VVccfCvKpMtXsgtPBBQGfy4H2q3YO+d8IHTnPPPXeH\/tLxboGiFcyNCL01k+dc1v\/ct9rIa7Ohde4r3rWTQWJwbP\/6179KD2jiB2EaqxxrXWAQgAAEIAABCHQvAYTe7uXP3SEAAQhAAAJJEfj66687iEvnnHNOhwpb9bXceOONy2KXwBC3XAgHFBV6iwDNu7\/EGb8tWyKx7hcfMuWFjLgyU8LTkCFDah4cVlTobeUYiszNj4kFwrxrp59++qyNhnqYqg9rnz59cm\/RHUKvBPfVV1+9bD4SHY866qjSa3nzUrW4b\/uQdyCdxFq1apA4qZYRoXAoxxIxfUsKtbqQ6BxaXFV8wAEHlG2\/F9PHH3\/crEerOChH8brXw5F47pqnWhzoEDFvd911V9aWoohJ\/FeFtMRJb2uttVZZW4q4otiPiz9fhx56aKl9Rmfz4O+hnQix0B62iMhrr6B4Bg4cWDP8zgi9yoWEbq2VvMrxoUOHZg+q8qq\/w90IqhhXBXBsYVV8zDLv4UPNYBkAAQhAAAIQgEBTCCD0NgUrTiEAAQhAAALtSUA9JldZZZWy4PMqIPMEDW11VkVfJbMSekeNGpVtfQ8Pa9M9zzjjjLJD4nSwkbYn63CjaiaBUv0x4yrEvGushN7ujKGela12DKreDCuxa10vgXO33XbrcAhbs4VeVWZKnFWO1Cd3zjnnzIT7ddZZp2wNxNvY83rD+Line truncated
%---
%[output:3f09c9f5]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>__________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0146146_Al2p_850eV.ibw'} {'29-Nov-2025 15:25:25'} 50 \n {'0146146_Ar2p_850eV.ibw'} {'29-Nov-2025 15:25:25'} 50 \n {'0146146_C1s_850eV.ibw' } {'29-Nov-2025 15:25:25'} 50 \n {'0146146_Cl2p_850eV.ibw'} {'29-Nov-2025 15:25:25'} 50 \n {'0146146_O1s_850eV.ibw' } {'29-Nov-2025 15:25:25'} 50 \n\n","truncated":false}}
%---
%[output:340587e5]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABPwAAAMeCAYAAACJFhrxAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQmUXEX5t2u6Z8lGAoFEw6KI7JuC7G4kioIgyCYiIIqouIOs8mcL4IIIKIKCC7uAqCwCgqBsioKKCiqrIpCwBSTJJJnM3t\/5Xbzz3aV67nt7ujvd00+d4\/Ew8966dZ+qW9P95K2qtlKpVHIUCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAYFwQaEP4jYt+5CEgAAEIQAACEIAABCAAAQhAAAIQgAAEIBAQQPgxECAAAQhAAAIQgAAEIAABCEAAAhCAAAQgMI4IIPzGUWfyKBCAAAQgAAEIQAACEIAABCAAAQhAAAIQQPgxBiAAAQhAAAIQgAAEIAABCEAAAhCAAAQgMI4IIPzGUWfyKBCAAAQgAAEIQAACEIAABCAAAQhAAAIQQPgxBiAAAQhAAAJNQOCFF15wL7\/8snvDG97gJk+eXFGLX3rppZHrJk6c6KZMmVJRPZVctHTpUjdv3jz33\/\/+182YMcOtueaaFT3HinwG3fu5555zy5Ytc7NmzQqeoaOjoxIcY7pG7bjllltSdbznPe9xr33ta0etW\/1www03uKGhoZG4XXbZJeiTcqVUKrn58+e7tra24LmLxeKY2r8iL164cKETPz3vKqusskKaUo132dLw++67zz3++OOx0Le\/\/e3BHDJaue6669ySJUtiIfvuu6\/TnOErr7zyirvgggtiv9p\/\/\/1H7vPkk0+6P\/3pTyO\/17yz6667Wh6BGAhAAAIQgAAExkAA4TcGeFwKAQhAAAIQqCWB3\/\/+9+7KK690999\/fyDKwrLhhhu6Lbfc0h1++OFutdVWMzVBsnCbbbYZid1uu+2CuvOU3\/72t+7ggw+OXSLBpHaWK5IrZ511lrvmmmtSIZtvvrk7\/vjjY+0arT0r6hkefPDB4Bl+97vfpZoncXH00Ue7173udXlQjin2Bz\/4gfva176WquOII45wn\/\/850et+9\/\/\/rfbaaedYjE\/\/\/nP3RZbbBH72cDAgLvsssuCsfeHP\/whkJzR8bfPPvu4gw46aIUIz7zwJL2++c1vpp5D4lzvwVFHHeU22GADb7Ua26effrr5locccogTm2Sp5rtsbcy3vvUtd+6558bCP\/nJT7rjjjtu1Pd12223jf1eYvvuu+8OhK+vPPLIIymBd\/XVV4+81z\/72c\/cMcccE7tUEpACAQhAAAIQgEBtCSD8asuX2iEAAQhAAAIVEfj1r3\/t9OV8tKJMnR\/\/+MeZWV2qI\/nlP6\/w6+vrC0SRMr2iZdVVV41l70R\/p8yf\/fbbz0kyjVYkqSSrssqKeIa\/\/e1vbq+99spqmvvRj37kZs+enRlXjYD3ve997tFHH01VJTFzzz33jHoLi\/AbHBwM+uPmm28eta43vvGNgVDaaKONqvFYNanj+9\/\/vvv617+eWbek7ac\/\/elU3KWXXurmzp2beX0Y8OUvf9l94hOfiMVX+122NsYn4jRn\/OY3vylbxfXXX+++9KUvxX6f9X4i\/Kw9QhwEIAABCECgvgQQfvXlzd0gAAEIQAACmQR8mXTlLpLkuemmm9zUqVO9IRJ1koLJLKW8wu+8885zZ599duoe5YTf4sWL3QEHHOAefvjhzOdVgMTMu9\/97oZ6BomMD37wg7HstnIPo2wxLbNVf9Sy+ORK9H5ajvmmN72pbBOyhN\/w8HCQjXXttdeaHkPPq+eudJm56SYVBuV5j3QLZTS+7W1vi93tK1\/5SiBzrSUp\/PK0IetdtrYhGveud73L\/ec\/\/4ldetddd5XNSP3iF7\/obrzxxli8xO9oUhfhV0nPcA0EIAABCECg9gQQfrVnzB0gAAEIQAACuQh89KMfTWVqSUSsu+66TtlCySw7LVeMZqFp6aky07QE9rbbbnPaMyxZ8gi\/Z555xu24447eZygn\/E466SR3xRVXxK7REl5JPdWnZX7Rot8puygsK\/oZJL6U0ZiUJRIob3nLW4L+0R5p0XLYYYelli7m6nhDsJYWn3\/++WUjDz300GCZdLmSJfz0TB\/+8IdTl2v8SSpraWd0ea8CP\/axj7kTTzzR0Pr6hnzgAx9wDz30UOymykrUWJb0Smaeaqn8L3\/5y1i8smz1zlmLllorqzUsY32XrfctF\/ed73zHnXPOObFfS\/77+liZnVraHe3frIxAVbxgwQJ31VVXjdyjUCi4Aw88cGSPRJb0jrUXuR4CEIAABCBQGQGEX2XcuAoCEIAABCBQEwLa8y65h1ZUqOjQBR3OEJV4kjHKTgqLhI\/20Bqt5BF+WqJYbhmgT\/jpYARJsWiR6FMWX1h84uqBBx4YkQQr+hl8mVknn3zyyB6GkiPKYIweRrDxxhsH2Za1KpKQGhvR\/RyT91J\/aM+99vZ2bzOyhN\/\/\/d\/\/xeSNKtEhH5tttllQ37PPPut23nnnmBQabVl3tBE6\/OPFF18MDm\/RwQ3rrbde2XaOlaEOnUhmOuogCWXsheWEE05I7WP5z3\/+M3Y4haRvKAatzxnWX413OclBGbva\/04M11prreAfAUY7OEb7F6q\/RnsXw9\/p\/dPhHNGi5b2f+9znxtQdWcLv+eefD\/4RQDLWuifpmBrExRCAAAQgAIEWIYDwa5GO5jEhAAEIQKA5CEjcnXLKKbHG6tCIlVZaaeRnknnJLC4dChCe0FpNWZbcf0yHVET3dvNJkF\/84hfBgSLRosMfoifBSlj+6le\/GgnRgQDKUgxPDl7Rz5C8vzIQdbhF9IRa9YsyKcOiDLg999yzZgNNDCWtokVZacn9\/HxLU8NrsoTfbrvtFluG7csY9EnBP\/\/5z2769OnBbbTHoIRUWL7xjW+4mTNnutNOOy2VcfeOd7wj+LnkVTWLMjOVjRktykKLynQfT433ddZZJ7hMglISKiw64VZ7+llLNd7l8F5aNqusWUm5ZJFcf\/\/73x8IaN8JylFpGa2vq6srVpUyAZURGC16RyVmRysSkHvssUcs5JJLLhmR\/j7h99hjjwVbBGguiWYsaw5T9qH2U4w+i7I1oxmZ6pdoRnCYnRhthOaq6P6N+seS7bffPtZOZWAeeeSR1i4lDgIQgAAEINBUBBB+TdVdNBYCEIAABMY7AZ0YGt0\/zbekTqIpKZYuvvhi9853vjPAIyGoLK9okRCMZoZZMvyWL18eSJMwm1BSQV+Yo7LRJ\/xOPfVUpy\/8YZHUif63pQ9X9DMkJYnvMAbLc1QzxpeRJmEisREt2new3EEVWcJPmXzRJZ06KGX33XeP1a97Jk8Djp70q\/6OShwt70wu705y0TLlXXbZpWq4JIDWX3\/9WH3Je9x6663uM5\/5TCxG8rSzszP4WTJDL2u5dLLx1XiXVef3vvc9d+aZZ2ayUaavTnBOijzf\/ps+KZw8DMa3xNnXiEr28NP7dfvtt5d9Js07EoLhP3QkWepCyfZw71JfG5KH2PgEbz0P28nsQAIgAAEIQAACVSaA8KsyUKqDAAQgAAEIjIVAcs8vSbZvf\/vbsSqVqaKMs2hJ7uOXbMPBBx\/stEw1LBbhlzwVV9frf1nCT8sCo5lIX\/jCF4K9+5Q9pUM8dKCHZIKWwEpWhVl9Wdzq9QwSnZtsskmsORJWPT097o9\/\/GOQUaeMRLVfe55JXui\/a1m0lHOrrbaKyTidCixh4durLrk0NWxblvC76KKLYvdQxp+kc7RIKmmvumi544473Nprrx38KCn8rFzuvfdeN2vWLGt4ZtyHPvShoL\/Cokw4ZRvqeZQBeNxxx8WWZOv3P\/3pT0fi\/\/73v8cy1z7+8Y8HY0BsxVFZixoDc+bMCeK0d120VONd1oEon\/3sZzOfNQzYZ599gmeMFmXgJQ\/EScpLLat961vfGrtOh7doX8qsUonwy6pTv1emX3jYkA4S0YEi0aJ3cocddgh+pH8kkRRMlmjmqe\/EZvVxIx44Y+FDDAQgAAEIQCCLAMIvixC\/hwAEIAABCNSRQDLL5qCDDnJz585NtSBcdhj+QvJCBwyUK3llWVIShHt5JZcT+zL89CU8usegMm2SB42E7dTvJDQlzrJKvZ5By1HDbMmwTRI75U4c1lLPM844Y2RJddZzVPL75NJq1SGxI8HjExnf\/e53U3u36Zos4ZfVNslayaPkPoLaKy7cN3A04SdJKbmUXIas+2pJt8R1tYpkn6RfsmjZaPIgG0kfZb1Fx2Ee2RaVieH9xvouJzNsw3qVMSkh\/dRTT7kLL7ww9XyS8mussUbs58m2JDOHfctutW9nUvb6+mYswk9Lc7XUP3kATnif8ERh336IRx99dLD0V0XLwpXlnCxagq33U0V7EUYPZQmFebXGG\/VAAAIQgAAEGo0Awq\/ReoT2QAACEIBASxPYeuutYzLlU5\/6lDv22GNTTJJLL8vFhRfmlWXReAkSffmfOHFisFw4K8MvKSMtHaplohtttNGoofV6hn\/84x+pZaxZzyBGWqJYq2yhpKxQe8LsJZ\/E00ENkn7JMhbhJwGldtx5552xaiXVvvrVr478zCf8JJy0RDNcLivx4jsMIrnXYxb3rN\/7lh\/7rlFmX\/KgGWVPRg\/5yLqX5JieK1xSO9Z32bcHoPb3\/MhHPjLSFPWFMg+jxSf\/fcuCQ5mma5PjK88BNJUKv+uuu27kYBVlLWscJaV69MCiZCZr9CAgbXGgrQ6S5YgjjhhZfp7sD209IHlKgQAEIAABCIxXAgi\/8dqzPBcEIAABCDQlgaQsi35hjT5Q8svraPu26bo8siyZ2aSN\/MN94sYq\/JQR6DtlVieqKLine truncated
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQe4HFX5h7\/dvSU9gZDQMSKEIiC9CUpVEQQpigiIIipYEKQJfyBSRJQqoqJIExREpAnSFAERAcWCGkoAKaGFUJKQ5Lbd\/T+\/uZnLzOzszjl7997cu\/c9z8PDk7vfnDnzzpnZ2Xe\/\/U6uXC6XjQYBCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAALDlkAO0Ttszx0DhwAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAQEED0MhEgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCAxzAojeYX4CGT4EIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAUQvcwACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAwDAngOgd5ieQ4UMAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQQPQyByAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIDHMCiN5hfgIZPgQgAAEIQGAkEXjllVds7ty59u53v9vGjh1b16G\/9tprfduNHj3axo0bV1c\/9Wz09ttv2wsvvGCvv\/66TZkyxVZZZZW6jmNpHoP2\/dJLL9nChQttxRVXDI6htbW1Hhz92kbjuO222yr6+NCHPmQrrLBCzb51Hm666SYrFot9cbvssktwTqq1crlss2fPtlwuFxx3oVDo1\/iX5sZvvvmmiZ+Od5llllkqQ2nEtewy8AcffNCefPLJWOi2224b3ENqtRtuuMEWLFgQC\/nEJz5humektTfeeMMuuuii2Ev77bdf336eeeYZ++tf\/9r3uu47u+66q8shEAMBCEAAAhCAAAScCSB6nVERCAEIQAACEIDA0iDwwAMP2C9\/+Ut76KGHAkEatrXXXts23nhjO+KII2y55ZZzGpok8eabb94Xu+WWWwZ9+7Q\/\/elPdtBBB8U2kVjUOKs1SbVzzjnHrr322oqQDTbYwE444YTYuGqNZ2kdw7\/+9a\/gGO6\/\/\/6K4UlYHXPMMbbaaqv5oOxX7MUXX2zf+c53Kvo48sgj7Wtf+1rNvp9++mnbeeedYzG\/+c1vbKONNor9rbu7237+858Hc+8vf\/lLILej82+fffaxAw88cKmIbl94kp1nn312xXHoCxNdB0cffbSttdZaqd1qbp9++unOuzz44INNbJKtkdey62DOP\/98u+CCC2LhX\/ziF+2b3\/xmzet1iy22iL2uLzTuvffeQPSntccee6xC3F5zzTV91\/V1111nxx57bGxTyV8aBCAAAQhAAAIQaCQBRG8jadIXBCAAAQhAAAINJfD73\/\/eJGVqNWXm\/eIXv8jM4lQfSenjK3o7OzsDQajMzmibPHlyLFsv+poy\/fbdd1+TXKzVJCclKbPa0jiGf\/7zn7bXXntlDc0uueQS23777TPjGhHw0Y9+1B5\/\/PGKriTk7rvvvpq7cBG9PT09wfm49dZba\/b1nve8JxCJ66yzTiMOa0D6+OlPf2pnnnlmZt+S9YcddlhF3BVXXGGnnHJK5vZhwPHHH29f+MIXYvGNvpZdB5MmYHXP+MMf\/lC1ixtvvNG+8Y1vxF7Puj4Rva5nhDgIQAACEIAABAaSAKJ3IOnSNwQgAAEIQAACdRNIy5yt1pnk3i233GITJkxIDZGglQxOZiX6it4LL7zQzj333Ip9VBO98+bNs\/33399mzpzpxEFCbqeddhpSxyCB9clPfjKWzVrtYJQdqnIKOh8D2dKkWnR\/+tn9+973vqpDyBK9pVIpyL68\/vrrnQ5Dx6vjrreciNNO6gzyuY60C2Uwb7PNNrG9ffvb3w4kvmtLil6fMWRdy65jiMbtuOOO9r\/\/\/S+26T333FM1A\/3rX\/+6\/fa3v43FS\/jXkvmI3nrODNtAAAIQgAAEINBoAojeRhOlPwhAAAIQgAAEGkLgs5\/9bEVmpgTUGmusYcoOTGbV6mfp0axTlRhQJqpKHdx5552mmqDJ5iN6n3\/+edtuu+1Sj62a6D355JPtqquuim2jUg2SuepPP+eONr2mbMKwLe1jkPBUBnNSkkmcbbLJJsH5UQ3UaDv00EMrfqLekAkR6UQlJH74wx9W7faQQw4JymFUa1miV8f06U9\/umJzzT99maCf8EfLOCjwc5\/7nJ100kmNPtR+9\/fxj3\/cHn300Vg\/ykLWXJbsTGaaqyTK7373u1i8sup1zbk2ldRQFnvY+nstu+63WtwPfvADO++882Iv60uftHOsTG6V8Iie36wMYHU8Z84cu\/rqq\/v2kc\/n7YADDuirgUzphv6eRbaHAAQgAAEIQMCFAKLXhRIxEIAABCAAAQgMKgHVtE3WyIyKNC2mpUW3ovJWEk7ZiGGT6FONzFrNR\/Tqp+jVfu6dJnq14JVkaLRJ8CprN2xpwvKRRx7pk0NL+xjSMjFnzJjRV6NYUkwZy9FFptZdd90gu3qgmuSz5ka0XnNyXzofqqnb0tKSOows0ft\/\/\/d\/MWmnTrR42\/rrrx\/09+KLL9pHPvKRmAysVb4jOggt6vbqq68Gi\/JpQa4111yz6jj7y1CLiSUzm7VAmDJ0w3biiSdW1Kn+73\/\/G1t0TLI\/FMKuxxn234hrOclBGfqqbyuGq666avDlT60FAVWfWOer1rUYvqbrT4uuRZvKOHz1q1\/t1+nIEr0vv\/xy8OWPJLxrzfF+DYiNIQABCEAAAhBoSgKI3qY8rRwUBCAAAQhAYHgTkLD91re+FTsILQY2fvz4vr9J4iazNrXYkxZGU2ukJE3WF9XiY9HarWny6+abbw4Wios2Leo1ZcqUvj9JVN9xxx19\/9ZCT8pKlgAcCseQZKiMYy1aVigU+sas86LM6bAp43XPPfccsAkohpKV0aYs1GS93rQSBOE2WaJ3t912i5XbSMsQTpPBf\/vb32zZZZcNdqMawhKRYfve975nU6dOtdNOO60iw\/YDH\/hA8HdJy0Y2ZWIr+zralHUa\/RIljafm++qrrx5sJjEt+Ri2bbfd1lSz17U14loO96XyCMqSl4xNNn2p8rGPfSz44iE6P8O4qKyO9tfe3h7rSpm\/ygCONl2jEvK1msTzHnvsEQu5\/PLL+77sSRO9TzzxRFAKRveS6C8UdA9TtrHqJUePRdnZ0QxsnZfoLwDCbOToIHSvitZn1pdkW221VWycyrg+6qijXE8pcRCAAAQgAAEIDGECiN4hfHIYGgQgAAEIQGCkEjj66KNj9VHTfjotwZgUipdddpl98IMfDLBJBCurM9okgqOZoC4ZvYsXLw5kWZg9LJkkURKVzGmi99RTTzWJnrBJ5kX\/7XJul\/YxJOVY2iJbLsfRyJi0DFSJMgmtaFNd4WoLkGWJXmXuRn+6rwXwdt9991j\/2qcW6Io2SXD97F9N5zsq7\/Qz\/mQZjyQXlaPYZZddGoZL4m\/69Omx\/pL7uP322+3LX\/5yLEbSvK2tLfhbMiM3qyxGcvCNuJbV549\/\/GM766yzMtkos\/\/iiy+2pMBNq6+d9mVAcpG\/tFIWaYOop0avrq+77rqr6jHpviMRHH7BlWSpDfUlS1ibPG0MycUJ08T+YC6imHkCCYAABCAAAQhAoF8EEL39wsfGEIAABCAAAQgMBIFkTU\/J1e9\/\/\/uxXSkzTRmm0Zas05sc20EHHWQqRxA2F9EryXfBBRf0baPt9V+W6NXPv6OZh4cffnhQm1fZklqcTQu1SSKp1IEkZZjFm8VzsI5Bgvu9731vbDgSlYsWLbKHH344yKBVBrLGL7kpaaV\/D2TTT\/Y33XTTmITdfvvtg4XC0mrRJksQhGPLEr2XXnppbB\/K8NWXDdEmmahatNF2991327Rp04I\/JUWvK5c\/\/\/nPtuKKK7qGZ8Z96lOfCs5X2JT5quxiHY8yfr\/5zW\/GSm\/o9V\/\/+td98f\/+979jmaqf\/\/zngzkgtuKoLGXNgR122CGIU23aaGvEtayF7r7yla9kHmsYsM8++wTHGG3KuE0udJiU1iqf8P73vz+2nRblU93prFaP6M3qU68rszdcRFILxGmhuGjTNbn11lsHf9LigZLByRbNNFfpmOQXIDrHQ3EhQRc+xEAAAhCAAAQgECeA6GVGQAACEIAABCAw5Agks+oOPPBAO+WUUyrGGf68PHxB0koLR1VrvpI0KYfCWp3JshFpGb2SL9EawsqsSy4gF45Tr0lkh9mgtU7IYB2Dyg6E2dHheCT0JKnTmn7S\/93vfrevdMZATKpkCQ3tQ0JPYi9NYP3oRz+qqM2qbbJEb9bYJeklDZN1glULNqwLXEv0Sk5LKibLTWi\/Kt2hLywa1SR5JXuTTeUBkgsUSvYpyzU6D30ka1Qih\/vr77WczKgP+1WGtL6IePbZZ+0nP\/lJxfHpy5iVV1459vfkWJK\/FEgrr6C63EnJn3Zu+iN6VYJBJV2SCxuG+9GieauttlpFdrVeP+aYY4ISD2oq\/6FfNSSbSm3o+lRTreHoYnvhFyWNmm\/0AwEIQAACEIDA0iWA6F26\/Nk7BCAAAQhAAAIpBDbbbLOYRPvSl75kxx13XEVk8if21eLCDX0laTReYkzSZ\/To0UFZiKyM3qSEdjnRKgewzjrr1AwdrGP4z3\/+U1GuIOsYxEg\/RR+o7MCkpNJ4wmzFNHmrBbgke5OtP6JX4lHj+OMf\/xjrVjL1jDPO6PtbmuiVaNRP8cOyCBJuaYt8JWs5Z3HPej2tzETaNsrkTS4gqGzp6OJtWfuSFNVxhaUT+nstp9X4Vf3uz3zmM31D0blQpnG0pX3pk1b+IZSo2jY5v3wWFqxX9N5wwLine truncated
%---
%[output:7b803654]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABPwAAAMeCAYAAACJFhrxAAAAAXNSR0IArs4c6QAAIABJREFUeF7svQe4JFWZ\/3+6++Z7JydmmCEMeUCSAuIaAAkiaQEREdBdhDXsmlEUJSisYRVUxLQqirgCroJIUnRJhh8oqAjCSA6TZxjmTrixw\/\/\/rbHuVNV7+nb1TdO37+c8j48P1aeqzvmcU3W7P\/Oe82ZKpVLJUSAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAIG6IJBB+NXFONIJCEAAAhCAAAQgAAEIQAACEIAABCAAAQgEBBB+TAQIQAACEIAABCAAAQhAAAIQgAAEIAABCNQRAYRfHQ0mXYEABCAAAQhAAAIQgAAEIAABCEAAAhCAAMKPOQABCEAAAhCAAAQgAAEIQAACEIAABCAAgToigPCro8GkKxCAAAQgAAEIQAACEIAABCAAAQhAAAIQQPgxByAAAQhAAAI1TGD9+vXuueeec3PnznUzZ84cUku7u7vdxo0bB87VdTKZzJCuVe1JfX19bsmSJW7FihWuvb3dbbfddm7atGnVXsZ1dnY6XUuloaFhSNeo+qb\/OGGk+jDU+4fnlUold+2117p8Ph+71D777OP0v9Euuq\/m4uTJk92sWbNG+3ajdv1isehWrlwZPBPz5s0L5uVYl97eXvf000+7jo4ON3\/+\/FF9Hn\/2s585vUei5eSTTx6036qv86JFz+1xxx1XFtXNN9\/sHn744YHP9ayfccYZA\/993333BfMnLAsXLnQHHHDAWKPnfhCAAAQgAIEJQwDhN2GGmo5CAAIQgMB4ISBBduWVV7o\/\/vGP7plnnhlo9jbbbBP8QD7rrLOqEjyXXHKJ+973vjdwneuvv76qH9oSJKeddlrQnmi57LLL3IknnujF2t\/f777+9a+773znO27Tpk2xOjNmzHDnnXee++d\/\/udA3qUpRxxxhHvqqacGqj7++OOpz9VJtdCHNP0crM5DDz3k5f3KV77S\/ehHPxru5b3nr1q1yl1zzTXB2P\/hD38YqCNJtmjRIveud73LHXrooaNy75G+6J133umuuOIK99e\/\/tXMx2OOOcb9x3\/8R1mp\/p73vMc9++yzqZqUzWbdLbfcYupKvOv+El8ay7CI5YEHHhg8D4MJtVQ391Q65ZRT3IMPPhj7RM\/lYYcdVvaSt99+u\/v3f\/\/32Odvectb3Gc+85my57zzne90v\/rVrwY+V5+uu+66gf8+99xz3Q033DDw3695zWvc1VdfPdRucR4EIAABCEAAAhUIIPyYIhCAAAQgAIEaIiDB9+Y3v9m9+OKLg7ZKkV4HHXRQxZa\/9NJL7rWvfW1MuqU9N7z4T37yE\/fRj37U3Ou\/\/uu\/3Jve9CZzXJFgH\/7wh50ifgYrEgKSSY2NjYPW++1vf+ve9ra3xepUK\/y2dh8qDlSKCklxGz1FjBStNpJl9erVTpInKp191z\/88MPdF77wBTdlypSRvP2IXUvzUfIqKqN8F5d4+8Y3vuFe\/epXm48VjVZNUfRetCiaUNJQ4zRY+eQnPxkI\/ZEsP\/jBD9zFF18cu6Sep+SxaIWPfexj7sc\/\/nHsHF3HxyashPAbyVHjWhCAAAQgAIHhE0D4DZ8hV4AABCAAAQiMCAEte1WETyXZF97sxhtvHDTS77HHHnOf+tSnYpFZOrca4ecThuH9fcJPkXTnn3++kQXlAL3jHe9wn\/jEJ7wfawnr\/\/3f\/7kLL7wwWBIcLdUIv63ZhxGZGM4Fy3j3228\/Ey0ZXl8MxXKkipidfvrpbvHixakuqei0yy+\/PFXdsa6kSNSvfe1rqW4r6ac5N3v27IH6YvHyl7881flhpajw0zyWOE1GyJa7oERcUnBXdfNEZT07r3rVq2JHFS38+9\/\/3ntZPcP6x4Toe0hc\/vznPw8aVYvwG84ocS4EIAABCEBg5Akg\/EaeKVeEAAQgAAEIDInAf\/\/3f7vPfe5zsXN33313d\/DBBwfLEJPL8k466ST3xS9+caC+oogk87Tf3d\/\/\/vdAXPhKNcJPsu2HP\/yh9zo+4XfbbbcFSyOjRXLhhBNOcLlcLljmmyx\/+ctfgn3hVCRK7rjjDrd27dpAVCaXX4bnViP8xroPQxr8Cif95je\/cW9\/+9vL1tI8EfuRKl\/5ylec\/hctkj4SR5KPd911l7nVN7\/5TXfkkUeOVBNG5Drai27fffc119Iy6F133dXdeuutRrCfffbZgbQOyyOPPOKOP\/741O3RkvWo3JMo05550aI6Rx11lFMUZTLyUM+LIgG1NHikioRjdEm2rvuLX\/wiYJAsvv5WigjUNRTRGxWdu+22m3vDG94wcHmW9I7UaHIdCEAAAhCAQDoCCL90nKgFAQhAAAIQGHUCyX3qtEeaNs4P97mTSEtKnb\/97W+utbU1aNvSpUud9sWqVNIKv3J7xoXX9wk\/7ekX3Z9MYkN7p02aNCk4zSeuovuJ\/fznP3cf+MAHKnXBpRV+W6MPFRs\/hApJWeK7RDmBU+l22m9Ry3aVyELiUAk5tAxce0mGZaeddgqiNsOEKxJ+yYjCtFF+2svu+eefd+vWrXO67lCT0VTqlz6\/55573L\/+67\/GqkpkhnvlSV5KvEWXLSua73\/\/938HzpGA1l6Fg837wdry6U9\/2n3\/+9+PVdFzsO222wbHfEtuK+2zuWHDBvfkk08GsnLnnXd222+\/\/aCJP\/7nf\/7HXXDBBbE2lFs+rGXNWqIdLdqLT0vwh1MGE36KgnziiSeCCFZJyK2RSGU4feNcCEAAAhCAQC0SQPjV4qjQJghAAAIQmHAEtPxWiQOiRYk2Xve61w0c0g9iyYlo+epXvzpw3kgKv0KhEEQlhRF22rtLkUrRBBxJ4ee7fzI5gJYLKmJQP\/DDIrm04447Bv85ksJva\/VhpCevmL\/sZS+LXVZiLrnc9n3ve19ZWaqssBrDnp6egevcdNNNQSIKiZ9wybQiMBXFl4yKU\/Sp9uqLFp8UDKPVFDmnfeDCIiEliabrJ5fXKqJNQu3MM88c8Wy1vr0bo5Jc7dMz9KUvfWmgrckIvauuuspdeumlA5\/\/9Kc\/DZZXpymSqfvvv3\/suVFfo3tiap4q4jC6hLZcRJ2Ev6KAozJW7QgTf0hu+vbZU\/IV3SNaVE+yMVmSST7EQ4lGFKE7WNF4a9zDIkH43e9+d+C\/fcJPYlH90byJvlskgj\/ykY\/EIkZ\/\/etfuw9+8IOxJmjcovNSYxUdy\/CdEr5f9N8SvnovRYsiKmt1D8o084w6EIAABCAAAR8BhB\/zAgIQgAAEIFADBJS9Uj+Io+X+++8Poq3CIjGwyy67xOpE5YGWwWrPvmjR\/mPJRAFpIvyU9VUiKCyKHpMAHEz4qY4SE0SLlhZXSsoRra+lkMklxI8++mgsQ6\/qp4nw21p9GOnppKWS73\/\/+2OXlUi56KKLYuJH4ux3v\/udV5ppuffee+8du4bGNyqy9KGW5UrOHX300bG60Yi08APtNZcURsqknMlkguWd0TarbZKWgyXOULZfyZpwefdIcPQtp9XedWpPWJIReEkRlvxcS+vDSMdKbZRQTWbDlfBM8j3nnHNiS\/A1VoruDYuWJitCr1IiHNVXghIlzUmWt771rYG4ixYJ\/Y6OjoFDeoe84hWviNWRRExGB\/r6Xe0efvPnzw8uk5SX0WtLYut\/Wt6sKMzXv\/71sVvrnsr4HRZfFHQ0olP1khwUSe3LqlxpbPkcAhCAAAQgUOsEEH61PkK0DwIQgAAEJgSB5P59ith5+OGHTd+1bDK6r50y+ib3\/YueJDmhiJ1oqST8tK+YJEUo9\/7lX\/4lSJwhYTOY8JOsUbRUWLQ0UhFdEheKYHzhhRcCmaQf2NrrLfzBX2mAfUsMKwm\/WutDpT4O9nlSBmluPPDAA0GkkgRdtJSLPvMJP989db0DDjjAaQloNApTYqWpqSl2iubFvffeO3AsGhnnk5RpGKSVS2mupTpaPrznnnvGqkv4fOhDHwqk3Z\/+9CenfkTndTJSMspf7JUgReJSc1pLa3V9PRvaYzE5p33CUecqgi1atBdndH\/LZFINifyrr746bbedEpVoeX20aJnwxz\/+8dixZOSmb9zSRjRWK\/zSdiYq7JJRpcnl14pOTSb4ic4pLeFO7lsoMZ0U6mnbRj0IQAACEIBALRNA+NXy6NA2CEAAAhCYMAQ+85nPxJaZaQmaL+lGUrIoKiq6bC4JbCjCT0vztF+bigSHpI7kSCXhFz0vPLelpaVs1mHfHoC+AR+K8Ku1Pgx1IktcKmNqtITJWnwyKZSzyftVI\/zSJN7w3VsyJtyrbjDhJ9m13XbbBUkkoqItbLOWbi5cuHCoyMx5ySW7YQUJymRGbLVNkaHRyFpFlUX3+BusYclsyerLv\/3bv8VOSUbu6kNfwp4wWtK33F\/Ppa6rbMKKWExG\/kk8av9CRVuGxTeXkkuHk8tuq0kgMhzhJ8msuaBo3mTRu\/CXv\/xlsJfpJZdc4rTVQbRoabtktK9\/qheNlvSxVHS1L7HLiE1ALgQBCEAAAhDYSgQQflsJPLeFAAQgAAEIRAko4ii6hC+5pC+sm1yyVmk5WrXCL1lfP7BPP\/304PaVhF\/yB3+aEY5ev1z9aoVfLfYhDQtfHV+yhTAqS\/shSgZGpZVEkKLWksuoywk\/1X\/ve9\/r9thjjyB5xrx58yruZaZITc2J5FLML3\/5ywPZbMsJv2i0mKLjzjrrLJN9eqSj\/MRJS1IV2VqpSGRG93LTuUqKUU25\/PLLnSJxVXxRddGs1OF1fYk7wnq+ZaraK09jFpbPf\Line truncated
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQeYXFX9v8\/M7OzOZjc9m5CQAIYeOgIBfqj0Ik0IvYgiCIKgCIJEOggoRUBUVDooYAFEmqg0EQUBaQICKYTUTSGbsn1n\/v\/Pndzhzj1n2tbZ3fc8T548e+fcc89577l3Zt77ne+JpFKplKFAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIBAvyUQQfT223NHxyEAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIeAQQvUwECEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAL9nACit5+fQLoPAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQADRyxyAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEINDPCSB6+\/kJpPsQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABBC9zAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAv2cAKK3n59Aug8BCEAAAhAYDARWrFhhPvroIzN+\/HgzZsyYTg25qanJrFq1KrOv2olEIp1qq9SdWltbzdy5c83ChQtNTU2NWWeddczIkSNLbcY0NDQYtaVSUVHRqTZKPuiaHbprDJ09vr9fKpUy9913n2lvb89qaquttjL619NFx9VcHDZsmKmrq+vpw\/VY+8lk0ixatMi7JiZMmODNy94uLS0tZubMmaa2ttZMnDixR6\/Hhx9+2Og+EizTpk3LO27V137Bouv2wAMPzInqT3\/6k3nrrbcyr+taP+644zJ\/\/+tf\/\/Lmj18mT55stt9++95Gz\/EgAAEIQAACEBigBBC9A\/TEMiwIQAACEIBAfycgMXrzzTebf\/\/732bWrFmZ4ay11lqeGDnxxBNLEnuXX365ueOOOzLtPPDAAyUJFomxo48+2utPsFx33XXmkEMOceJua2szP\/vZz8ytt95qVq9enVVn9OjR5rzzzjNf+tKXPGlbTNlrr73MjBkzMlXff\/\/9ovfVTuUwhmLGma\/OG2+84eS94447mt\/85jddbd65f319vbnnnnu8c\/\/yyy9n6kiOTpkyxZx66qlmt91265Fjd3ejTz\/9tLnpppvMm2++ac3H\/fff33zzm9\/M+TDltNNOM7Nnzy6qS9Fo1Dz66KNWXT1w0fElPHUu\/SKWO+ywg3c95BOpRR3cUenwww83r776atYrui533333nE0+8cQT5vTTT896\/aijjjJXXnllzn1OOeUU85e\/\/CXzusZ0\/\/33Z\/4+55xzzIMPPpj5+3Of+5y56667Ojss9oMABCAAAQhAAAJZBBC9TAgIQAACEIAABMqOgMTuEUccYZYuXZq3b4rsnDp1asH+f\/LJJ+bzn\/98lmwtdl+\/8d\/\/\/vfm3HPPtY71ox\/9yBx22GHWdkV+nn322UYRfvmKRJAkYjwez1vvhRdeMF\/+8pez6pQqevt6DAVPVBEVwsI+uIsYKTq1O8vixYuN5F7wYYOr\/T333NNcc801Zvjw4d15+G5rS\/NR0jIoIV2NS7j+\/Oc\/N7vssov1sqJPSymK1g0WRQ9LFus85SsXXHCB9yCnO8vdd99tLrnkkqwmdT2FtwUrfO973zO\/\/e1vs\/ZROy42fiVEb3eeNdqCAAQgAAEIQKBUAojeUolRHwIQgAAEIACBHiWg9AaK6Cskef1OPPTQQ3kje999911z6aWXZkViat9SRK9LFPvHd4leRc5Onz7dkkS5wH3ta18z3\/\/+950vK1XB3\/72N3PRRRd5qR+CpRTR25dj6K4JI1m5zTbbWNHRfvtiKJbdVcTs2GOPNe+9915RTSoa9frrry+qbm9XUuT5T3\/606IOK9mrOTd27NhMfbH47Gc\/W9T+fqWg6NU8ljAPR8TnalACNvxgo6SDhyrr2tl5552zturXAS+++KKzWV3DeogUvA+Jy3\/+85+8UfSI3q6cJfaFAAQgAAEIQKCrBBC9XSXI\/hCAAAQgAAEIdCuBX\/7yl+bqq6\/OanOTTTYxO+20k\/dz8\/DPrw899FBz7bXXZuoralASV\/ls\/\/e\/\/3nCylVKEb2SrPfee6+zHZfoffzxx72fwAeLpNLBBx9sYrGYl84hXF5\/\/XUv76uKBNlTTz1lli1b5gnq8M\/s\/X1LEb29PYZunRRrGvv73\/9uTjjhhJxNa56IfXeVG2+80ehfsEj2SRhKOj\/zzDPWoW655Raz9957d1cXuqUd5ZrdeuutrbaU7mKjjTYyjz32mPVg5aSTTvIeVvjl7bffNgcddFDR\/VFqkqDUlSBVTtxgUZ199tnHKGo6HGms60WRv0oB0V1FojmYekPtPvnkkx6DcHGNt1AEsNpQBH9QcG+88cZm3333zTRP6obuOpu0AwEIQAACEICAiwCil3kBAQhAAAIQgEBZEQjnoVUOVC2I5OexlUANy7z\/\/ve\/prq62hvHvHnzjPJeFirFit5cOWH99l2iVzl7g\/lHJbSUG3Xo0KHebi5hGcwX+sgjj5hvf\/vbhYZgihW9fTGGgp3vRIWwJHM1kUvcFTqc8ikrPYMWKJMw1kJrSvehXNF+WX\/99b0obX8hPYnecARxsVG9ylU7Z84cs3z5cqN2O7vIYKFx6fXnnnvOfPWrX82qKoHt58KVtJZwDaanUPTu7373u8w+evCgXMT55n2+vlx22WXmzjvvzKqi62Dttdf2trlSKxTKo71y5Urz4YcfepJ6gw02MOuuu27eBd1+\/etfmwsvvDCrD7nSRCh9hVJxBIty7SrVSldKPtGrqOcPPvjAi1iXfO6LBfK6Mjb2hQAEIAABCECg7wkgevv+HNADCEAAAhCAAATWEFCaBS0IFSxaQO0LX\/hCZpNEiKRUsPzkJz\/J7Nedorejo8OLQvQjapWbU5GJwYXVwqLXdfzwok\/6WbgihCV2\/CKp+JnPfMb7sztFb1+NobsntZhvscUWWc1KyIbTKpx55pk5JXlLS4uXX7W5uTnTzh\/\/+EdvgTEJPz81hiKuFbUbjoJVtLly8QaLSwb70amKlFWeV79IREqeqv1wGgVFsEqkHn\/88XllZWe4unIzBx+OqE1dQz\/+8Y8zzYcjcm+\/\/XZzxRVXZF7\/wx\/+4KXRKKZIom+77bZZ143GGsx5rXmqCONgqoRcEbR60KOo\/6CEVz\/8Bd0ktV15dLWono4RLKonyRwu4cXbxEMLyCkiP1\/R+dZ594vE8G233Zb52yV6JZQ1Hs2b4L1FDwC++93vZkWI\/\/WvfzVnnXVWVhd03oLzUucqeC79e4p\/f9HfEv26LwWLIqjLNcd0MfOMOhCAAAQgAAEIGIPoZRZAAAIQgAAEIFA2BLQavURIsLz00ktedKVfJIQ23HDDrDpBaaR0B8rJGyzKLxpeAKqYiN7f\/OY3ngD0i6JFJX7ziV7V0YJTwaIUEoUWWwvW10\/ew6ki3nnnHTNjxoysdouJ6O2rMXT3pNJP4r\/1rW9lNSuBdvHFF2cJPwnTf\/zjH05ZqrQeW265ZVYbOr9BgakXlX5BUna\/\/fbLqhuMQPVfUC7ZsCjUeYpEIt7P+IN9Vt8kq\/MtiLbbbrt5ks5P49EdHF1pE5SbVv3xSzjiNixAw68rhYof2VyojxLpu+++e1Y1ie4w35NPPjkr1YrOlaL5\/aIUFIrILbTAoepr4TkthhguxxxzjCdsg0UPcmprazObdA\/ZbrvtsupIHoejgV3jLjVH78SJE71mwtI62LYeXuif0lgo6nqPPfbIOrSOed5552W2uX71EIzgVsUwB\/1y4tFHHy10KnkdAhCAAAQgAIEyJ4DoLfMTRPcgAAEIQAACg4lAOD+vIvTeeustC4F+Hh\/MW3vEEUdYeX2DO0lKKUIvWAqJXuUNlZzype5XvvIVb0E0ibp8oleSTtGRftFP4BXBKWGliOWPP\/7Yk4gSK8rl6oueQufZ9VPyQqK33MZQaIz5Xg9LQM2NV155xYtMlJgNllzRpi7R6zqm2tt+++2NfuofjLqWUKusrMzaRfPi+eefz2wLRsK65HQxDIqVisW0pTpKE7HZZptlVZfo+853vuPJ2tdee81oHMF5HY6MDvIXey18J2GtOa0UCmpf14ZyKIfntEs0a19FrAaLcm0H81eHF0vTA5y77rqr2GEbLUCnNCrBonQQ559\/fta2cKS267wVG8FcqugtdjBBURuOIg+n2VA0enjhxuCcUqqOcF5iPZAIP0gptm\/UgwAEIAABCECgfAggesvnXNATCEAAAhCAwKAncOWVV2b9nFg\/NXYtphaWa4qCDP48OgyyM6JXP8FWPlYViS3JPEmxQqI3uJ+\/byKRsBa78vvoyvHrmgidEb3lNobOTnAJ66lTp2bt7i\/C55KIvpQPH68U0VvMgmquY0vC+blo84leSc511lnHWxwsKFj9Pusn+pMnT+4sMmu\/cGoGv4LEdDBdgrarb4oED0bSK4o0mMM3X8ckgYO5izWWr3\/961m7hCP19aJrIUY\/OtqV1kXXpdodO3asUYRyONJXwln5iRVd7RfXXAqniAinVyhlYbiuiF49XNBcUPR+uOhe+Oc\/\/9nLVX755ZcbpbQJFqUw0UMI1\/hULxgd7WKpX1O4FuzrtglIQxCAAAQgAAEI9AoBRG+vYOYgEIAABCAAAQgUQ0ARhsGfaod\/uu23Ef5pcqGfHZcqesP1JVaOPfZY7\/CFRG9Y9BQz7mD7ueqXKnrLcQzFsHDVcS2i5UdhKt+xJHBQVkoAKko1nC4jl+hV\/TPOOMNsuumm3qJoEyZMKJirVJHZmhPhn9zfcMMN5qCLine truncated
%---
%[output:7ec3927c]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABPwAAAMeCAYAAACJFhrxAAAAAXNSR0IArs4c6QAAIABJREFUeF7snXecFdX5\/88CCyy9lxUQkSKiRIm9ArFgD9aoUaMxiSZ2jSZGscaSRI3GGlssicYeey9ojD0WVEDFgBSl7rq0hYX9vT7X7+xv2t157jbuvfM+r5d\/eO8zZ+a8z5nZO2+ec05JbW1traNAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACRUGgBOFXFP1IIyAAAQhAAAIQgAAEIAABCEAAAhCAAAQgkCGA8GMgQAACEIAABCAAAQhAAAIQgAAEIAABCECgiAgg\/IqoM2kKBCAAAQhAAAIQgAAEIAABCEAAAhCAAAQQfowBCEAAAhCAAAQgAAEIQAACEIAABCAAAQgUEQGEXxF1Jk2BAAQgAAEIQAACEIAABCAAAQhAAAIQgADCjzEAAQhAAAIQKEACa9eudTNnznSrV692Q4YMcW3atGlQKxYsWFB3XFlZmevUqVOD6mnIQTr33Llz3bJly1z\/\/v3dgAEDXGlpaU5Vqf0VFRV1x3Tt2tW1bds2pzoaE9wUbWjM+XXsnDlz3HvvveemT5\/uPvnkEzdv3jzXrVs317t3bzd69Gg3bty4zBjJtVRWVrpVq1ZlDtP46t69e65VrNN4jSuNL43pvn37ulatWrX49Xz99ddu4cKFboMNNnAdO3ZstvN\/+eWX7tVXXw3UP3z4cLfNNtvUe87XX3\/dff7554GYnXbayQ0ePDj2uMWLF7sbb7wx8N2hhx6aaZ9KVVWVe\/LJJ+u+F\/M999yzWdvebFCpGAIQgAAEIFDgBBB+Bd6BXD4EIAABCKSLwN\/\/\/nf37LPPZgSPhIZXttxyS7fDDju4448\/3iz\/JCK22mqrujokB\/7xj3\/kBFSS4aijjgoc069fPyeRkK188MEH7oorrnCvvfZaJGSvvfZyv\/71r92gQYNM1yEWxx13XF3saaed5k444QTTsV7Qum5DThfrC66pqXE333yz++Mf\/5hYhSTO+eefn1XkxFWw6667ui+++KLuKwnFhorlxAtsogAJqauvvjojnRYtWhSoVfJTY2OXXXaJPZvG7MUXX2y+kmOOOcYdeOCBkXjVo\/vozTffDFzDRhtt5MaMGeNOOeUU16tXL\/N5LIG6l4488shA6MYbb+wef\/zxeg\/\/wQ9+4CQL\/UX3w3rrrRd73Keffup0j\/rLvffeW\/ccUV2q018efPBBt\/nmm1uaQQwEIAABCEAAAk1IAOHXhDCpCgIQgAAEINBcBGprazNiJ5xdEz6fsmmuvPJKU5bbn\/\/8Z3fNNdfUVZGr8KuurnaSQrNnzw5cRs+ePd3bb78di+L99993+++\/fyKmW2+9NZOZllQOOugg9+6779aFnXrqqe7EE09MOqzu+3xog\/lifYESK2rrhx9+mNPhfjlT34FxAinfhZ+uWcLbL8Lj2ijhd\/3110fk5R133OEuuOACM8\/f\/va37mc\/+1kg\/vnnn3c\/\/\/nP661D2XAS9xLjTVUkfyXVwm2XfMx2Ht23EsH+8v3vf9\/df\/\/9WS8L4ddUPUY9EIAABCAAgeYngPBrfsacAQIQgAAEINBoAmE5V1+Fkn7XXntt1hBJLgmHcDZTrsJP55BcDJdswk+y4OCDD04UMqpP0x+feuqpzDTfuKKptGJyzz33BL7OVfityzY0dFBI7vzwhz\/MTN9tSHn66aedpnvGFYnlF154wU2aNMlpOqq\/5LPw0zTm3XbbzTS21KaTTjopk2nnL7\/\/\/e+dRLO1hIVfXKZotro0rpV916VLF+vpEuOUwXnnnXcG4pRJO3HixNhjJX\/PPvvswHeqI5wp6A9A+CV2AwEQgAAEIACBvCGA8MubruBCIAABCEAAAvEEVqxY4UaNGhX5cp999nFad++JJ56IiA5JG29dLR2o7Cdl12kar6bBhmWOYnIRfrNmzXJjx46NveA44ac1B5UNGJ4+qOl\/yiqaPHmye+ONNwL1aarumWeeWfeZMo+0JttXX33lHnroodhz5yL81kUbmmKMS+pIzISLpqwqe00yb\/78+Zlp1ZJ74aKp334xNGPGjMyY0HTYt956K2vWYD4Lv8svv9zddNNNgaZqHGr6qdoXN31cmaH+dQmVmacMPWu59NJL3SGHHFIX\/pOf\/CQzjv1FrIcOHZqpN5wJ+6c\/\/cmU7Wq9Ht0\/hx12WCBc7f\/LX\/4SW0Vce+vLCFQlGld+ya41+n784x\/XcWRKr7W3iIMABCAAAQg0PwGEX\/Mz5gwQgAAEIACBRhGQtPnlL38ZqENTe5XRpDJlyhS37777Br4\/44wzAscok0cZPfWVXISfpjJKKsaVOOEXl\/103nnn1a3\/p6y1ww8\/PDAVOLwG2XbbbRcrKv3XkIvwWxdtaNRAcC7TfnEIF60lpwy18KYnypL81a9+FYn\/5z\/\/6bTuo8qjjz4ayXaLu06r8NNmH5Ky+q9169auT58+mWmlTTmFNXx9ynj0T2+W7H7mmWfqpu0+9thj7uSTTw4cJukpIecV\/5qF9U1Lj2OjjNOtt9468NXRRx\/tzj333MxnS5cuzdyvftEeFq\/hetesWeMkpSXROnfu7EaOHFnvpjq6h7bddtvAuoHKlP3vf\/8bmb4c948IWs8z6RmRNH6ThJ829VBmanl5eSZ7t6SkJKlKvocABCAAAQhAoIEEEH4NBMdhEIAABCAAgZYiINnnz9RSJtcjjzwSOL1khqSGVyQ8\/EKuKYVfeJ0yZREpy9ArcbIkfH61QYv5Swh5RZt5KAvRK5ru6J+O2JTCb121obFj5qKLLnK33357oBqJI60\/l02eaCOT8HjxT2ltKuGnTDplvWUTwRKMmi4a3vShsUx0vOr2b9IRFr9xgsufoaepzBtuuGHdpey4444ZptYSl3Wp8SxR55W4KbRxGXXKwlU\/++9nrw5do7JiJXH9dXvfX3jhhe5vf\/tb4LKVGassWn+JW6PxkksucT\/60Y\/qbbL6eL\/99gvE6Hxe\/dmEn3YC1kYmYuIVyUhJVmWr+qc2S976N4tRm\/3j11uv0H8RGlOXXXZZ3UcSrJKf\/qIMzNNPP93apcRBAAIQgAAECp4Awq\/gu5AGQAACEIBAsRMIywztiqvsOH\/R2mPK8PIXZTx16tQp85Fkw3\/+85\/A95INfkliyfCTOJFw8DKVNK1YL9b+tcDihF94x9e4DQ+S+lEbKmjaqb+EpYglw29dtiGpjUnfawppeEMUiSkJqmxl2rRpkd1kDzjggLppwarv7rvvDhyuLCy\/dNGX9WX4vfjii+7YY49NuvzM97\/5zW8SN7YwVeQLCk+nPeKIIwIbcGgqqsa3v\/hFWDhDT20Jr29X3zUpo9Y\/zTws3HWsZFd4PT3J25133rmu6pdeeimzvmDSxiO6xyTMw7tZqy\/904xVcdx6hZJ7t9xyS6BJ2lW4d+\/e9aJvyBp+2hgkPNXZfxJl+omDJ1zDLBWrfwjwpGDcNagO\/znUlkMPPTTyjLRsBJTr2CMeAhCAAAQgkK8EEH752jNcFwQgAAEIQMA5p7XvtAaYv8Rl4sRNmX3llVfcwIEDs3KUONRxXrEIv\/DmITpe\/9Un\/OKyqySYli9fnlkzburUqZnsNE3h1U6jkoPWqX5DhgwJtM8i\/PKtDbkM9E033TQggzRNVtlaWkutKcsNN9yQ2RXaX7IJP62ruPvuuydKKn9d1t2CrW3SOnVXXXVVXbiyx2677Ta3xRZbuIqKCnf11VdHNrTwC\/GPPvookLn205\/+NDM+P\/7444z41LRkjc\/x48dn4sK8w8JRIlzn9BdlnSmz1V\/86\/jNmTOnXnEbZiGpqI0\/tI6nVzQNWPexX+RvtNFG7sknnwwcLgnnX1PQmtHYEOFn6UP\/FOy46dd6XnhT2SVWJQXD5Z133nE9evTIfPzXv\/41kPGnz9THGhcUCEAAAhCAQFoIIPzS0tO0EwIQgAAECpKA1kOTBPOX6667zu2xxx6Bz7ROl7K2\/EUvxptttlnWducq\/DSdT5tCeEVTRU844YRM9mB9wk9rufmzmHS85Em2XWYlH7QJg2XNt1yFXz62wTowlyxZEpmaKXETnsJpra++uFyEnzIMlX3pL5qmqczUtm3bZnZbDu\/mnGsGXVKbxEYswplxyoTzyy+vHk191WYTXsm21mHceTV99Q9\/+ENgUxztjC1x7ZVwhqH3eXi8+rMddS+FxZwy0pRRK1l48803R9oiqSi56C9xuw37pw7HTbtVe7QOZFJpjPBTX0h4SvLHZTBqjGg6b9x6iL\/+9a\/d8ccfn7m8uGnt+tyf6RpmKY657MCcxIHvIQABCEAAAoVAAOFXCL3ENUIAAhCAQGoJhAWVQOjFNTw1Le5FXFP2lJGUreQq\/PzxknFaq03ZRUnCL25TkaQOVf3PPfdcYkZOrsIvH9uQxML7XtMa999\/\/0C4pi2Gp3Jb66svLhfh94tf\/CLTV16R2JFg8m8gEt4RNi7rrLHXrUw8ZYcmFa13Gd7AI25KfH31KCNNcq5du3aZsPC0ezE566yzIlWEMzS9uLj7VxJRmYtetqumsytj0V\/ihK92Hz7ooIMCcVdccUXddGJly02aNCnwfXjH4mxtb6jw8wtWrcGn\/w9PI9eUXm8chTdh0T80KGtPRdOi\/WsBetfqz+4N90dY8CaNEb6HAAQgAAEIFAMBhF8x9CJtgAAEIACBoiUQl7mnxe\/D65HFZe34pwvGAcpF+IUzoCQivM0XkoRfnKjyX0+2LKzjjjvOnXnmmfX2bS7CL1\/bYB284Y1GdJw2b2iOjLine truncated
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snXe8FNX5hw\/l0nvnCohKEVQi2I1RIPb6Q+xGjcbYYtdoNIqxG41YYu+9xRY7FlQ0KJbELiCgIF2k91v4fb5znWVmdnbP2XsX7tzd53w+\/MHuO2fPPOfM7p1n331PvTVr1qwxNAhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEKizBOoheuvs3DFwCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIeAUQvCwECEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAQB0ngOit4xPI8CEAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIIHpZAxCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAE6jgBRG8dn0CGDwEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAA0csagAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCBQxwkgeuv4BDJ8CEAAAhCAQDETqKysNFOnTjVlZWVm4403Ng0bNqwWjp9++il1XNOmTU2LFi2q1U91DtJrz5w50yxbtsx07drVdOvWzZSUlOTUlc5\/4cKFqWNat25tGjVqlFMfNQnOxznU5PV17IwZM8x\/\/\/tfM3HiRPPNN9+YWbNmmTZt2piOHTuaAQMGmCFDhnhrJNe2aNEis3r1au8wra+2bdvm2kWtxmtdaX1pTXfu3NnUr19\/vY9n9uzZZt68eWajjTYyzZs3X2ev\/\/3335v33nsv1H+fPn3M9ttvn\/U1x44dayZNmhSK2XnnnU3Pnj1jj5s\/f7654447Qs8dfvjh3vmpLVmyxLzyyiup58V87733Xqfnvs6g0jEEIAABCEAAAnWKAKK3Tk0Xg4UABCAAAQhAQAQeffRR8\/rrr3tiTyLLb9tss43ZaaedzMknn+wsfSWgtt1221QfkkKPPfZYTqAll4455pjQMV26dDESSJna559\/bq6\/\/nrz\/vvvp4Xss88+5s9\/\/rPp0aOH0zjE4qSTTkrFnn322ebUU091OtYPqu1zyGmwgeDy8nJz9913m+uuu87aheTd3\/72t4wCL66D3XbbzUyePDn1lERydb9QsA4wTwESkTfddJMnG3\/++edQr5LeWhu77rpr7KtpzV5xxRXOIznuuOPMQQcdlBavfnQdjRs3LjSGTTfd1AwaNMiceeaZpkOHDs6v4xKoa+noo48Ohfbv39+89NJLWQ\/\/7W9\/aySJg03XwwYbbBB73Lfffmt0jQbbE088kXofUV\/qM9ieeeYZM3DgQJfTIAYCEIAABCAAAQhUmwCit9roOBACEIAABCAAgfVNYM2aNZ7Qi2bTRceh7LmRI0c6ZbXeeOON5uabb051kavoXbVqlZEMnD59emgY7du3Nx9\/\/HEsos8++8wceOCBVnz33nuvl4lqawcffLD59NNPU2FnnXWWOe2002yHpZ5Pwjk4DzYQKKGmc\/3iiy9yOjwo5bIdGCcOky56NWZ90RH8AiTuHCV6b7vttjRp\/eCDD5pLL73UmecFF1xg\/vjHP4bi33zzTXPCCSdk7UPZr\/rCRl+I5KtJ+kumRs9d0jnT6+i61RcAwbbVVluZf\/3rXxmHhejN14zRDwQgAAEIQAAC+SaA6M03UfqDAAQgAAEIQGCdEYhK2WwvJNl7yy23ZAyR3JRoimYv5ip69RqSytGWSfRKEh1yyCFWEaf+9DP3V1991SvnENdUMkFMHn\/88dDTuYre2jyH6i4WSb3\/+7\/\/88o0VKe99tprRj\/rj2v6QuGtt94yI0aMMCo7EGxJFr0qV7H77rs7rS2d0+mnn+5l1gbblVdeafQFg2uLit64zPBMfWldK9u2VatWri9njVPG9kMPPRSKU+b8sGHDYo+V9L\/wwgtDz6mPaGZwMADRa50GAiAAAQhAAAIQqCUCiN5aAs\/LQgACEIAABCCQG4EVK1aYzTbbLO2g\/fbbz6iu7ssvv5wmuCTr\/LqZOlDZjsqmVbkGlTuISjzF5CJ6p02bZgYPHhx7InGiVzWFlf0b\/Zm4fuatLMIxY8aYDz\/8MNSfSjKcd955qceUaaiaqz\/++KN59tlnY187F9FbG+eQ28zHR0vmSchFm0oTKFtVEnfu3Lle+QxJ3WhTiY+gEJwyZYq3JlT24KOPPsqYJZxk0fv3v\/\/d3HnnnaFT1TpUmQGdX1yZEGWCB+sOKxNXGbmu7eqrrzaHHnpoKvz3v\/+9t46DTax79erl9RvNfP\/HP\/7hlN3uOh5dP0cccUQoXOf\/z3\/+M7aLuPPNlgGsTrSugl+uqAbv7373uxRHSje4zhZxEIAABCAAAQjkmwCiN99E6Q8CEIAABCAAgXVCQLLulFNOCfWtEg7KYFT76quvzP777x96\/txzzw0do8w9ZfBla7mIXv1kXTI5rsWJ3rhsx0suuSRV31dZqkceeWSo5EO0xuiOO+4YK6iDY8hF9NbGOdR0gUjQi0O0qVasMlKjm9kpK\/pPf\/pTWvyTTz5pVNdZ7YUXXkjLbo0bp6vo1SZukvH616BBA9OpUyevfEA+SxVEx6cM52AZC33JMWrUqFR5hhdffNGcccYZocMkuyVi\/RasSZyt\/EgcG2WYb7fddqGnjj32WHPxxRd7jy1dutS7XoNfsESFe7TfiooKoy8jJE9btmxp+vXrl3WzRF1DO+ywQ6gusDLj\/\/e\/\/6WVqYj78kj1um3vEbb1axO92qxNmeilpaVetn69evVsXfI8BCAAAQhAAAIQcCKA6HXCRBAEIAABCEAAArVNQJI3mJmpzM3nn38+NCxJLMksv0l0BUVsPkVvtA6psgaVVey3OEkWfX2dgzZpkgj0mzZpU9ax3\/Sz9uDPzvMpemvrHGq6li6\/\/HJz\/\/33h7qRMFR92UzSTBvURddLsHRBvkSvMmeV5ZrpCwCJZZUFiG7mVVMmOl59Bzdfiwr\/OLEZzMhVyYpNNtkkNZTf\/OY3HlPXFpdlrfUsQeu3uFIJcRm0yrrXPAevZ78PjVFZ8JL3wb795y+77DLzwAMPhIatTHhlzQdbXA3mq666yhx22GFZT1lzfMABB4Ri9Hp+\/5lE76RJk7wN6sTEb5LQkuvKTg+WsJC0D24CqHMOrl+\/HnFwEFpT11xzTeohiXVJ72BTxvU555zjOqXEQQACEIAABCBQxwggeuvYhDFcCEAAAhCAQLESiEqsY445xigbNthUW1QZncGmDMcWLVp4D0kyffDBB6HnJZmCcswlo1fCTKLJz0xU+QgJlWCtzzjRG8yW1CDiNrKyza82ylJ5gWCLyjCXjN7aPAfbOdqeV6mA6EZ3EpISk5nahAkTjDJ+g2348OGp8g\/q75FHHgk9r6zLoGzTk9kyekePHm2OP\/542\/C95\/\/yl79YNyxz6igQFC2bcNRRR4U2VlPJAa3vYAsK0GhGrs4lWr8225iUQR8sJxL9okXHSnJG6+VK2u+yyy6prt9++22vfrBtQzldY\/qipEePHqFhaS6D5ST0ZFw9Yknde+65J3TsuHHjTMeOHbOir06NXm34Fi1pEXwRZfaKgy\/aoywVqy+AfBkcNwb1EXwNncvhhx8eOhfXDR5zXXvEQwACEIAABCCQDAKI3mTMA6OAAAQgAAEIQCALAdW2VY3PYIvLvIsrjfDuu++a7t27Z+xdwljH+c1F9EY3hdPx+pdN9MZlU0osLl++3KsJO378eC8bVaUaBg4c6GX5uf6ke+ONNw6dn4voTdo55HIBbLHFFiEJqHIIys5UrdR8tttvv91cd911oS4ziV7VTd5jjz2scjLYmb54UKmAfDXVob3hhhtS3Slb9L777jNbb721WbhwobnpppvSNioLfhHy5ZdfhjJV\/\/CHP3jr8+uvv\/aEt8pPaH0OHTrUi4vyjopmfQGi1ww2ZZkqkz3YgnV6Z8yYkVXYR1lJJmtDN9Xp9pvKPeg6Dn6Bs+mmm5pXXnkldLjka7BmsGsGc3VEr8scB0ttxJXZ0PuFX7JEQl0yONo++eQT065dO+\/hu+66K5Thq8c0x1oXNAhAAAIQgAAECpMAorcw55WzggAEIAABCBQUAdU7lfwMtltvvdXstddeocdUh1NZmsEmIbLllltm5JGr6NXPtrXZl99UEuDUU0\/1soWziV7Vag1mLep4STNljcY1SSdtruVS0zVX0ZvEc3BdsAsWLEj7Cb6EXfSn+q79ZYvLRfQqo1jZ1sGmn+MrE71Ro0ZGdYJHjhwZej7XjFnbOYmNWEQzYZX5GpSefj8qcaBNxPyWqZZx3OuqTMG1114b2uxw77339r6w8Fs0o9h\/PLpeg9nNupaiQnbIkCFeBr0k8d133512LpLJksrBpsx+Za8GW7BERFx5BZ1PNOs77txrIno1FxLd+nInLmNZa0RlG+LqHf\/5z382J598sjekuPIlejyY2R5lKY5RJrY1xfMQgAAEIAABCNQtAojeujVfjBYCEIAABCBQlASiYlIQ4n6CHCdg9NNsZSBmarmK3mC8JKxqsSqb0CZ64zaLs02m+n\/jjTesGXi5it4knoONhf+8fr5+4IEHhsL18\/RoyQ7X\/rLF5SJ6TzzxRG+u\/CahJ7EY3BjuhBNOMKqL7Le4LNOajluZt8oGtzXVs45uzBZX+iRbP8pAlZRt3LixFxYtryIm559\/floX0YxsPy7u+pU8Vqayn92usiXKUA62ONH\/6aefmoMPPjgUd\/3116fKRig7dsSIEaHndUzbtm1t6Ex1RW9QrKvGrv4fLRei0g3+OopurqcvmJSlq6byF8Fav\/6gg9n80fmIin3riRIAAQhAAAIQgECLine truncated
%---
%[output:5e5ac45c]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABPwAAAMeCAYAAACJFhrxAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQd4HMXdh0eyZFu23Kvk3rGNsU0xoSWYEiAQ\/BFTQk8IfOkJJAQSQodUSiBfQkhCIAQCARJaINTQHXoxxbgbI1tusmVbcpElS9\/zO7I7M6s93Z3KWeWd5+FJ5mZ2Z\/bd2T3d6\/\/M5NTV1dUZEgQgAAEIQAACEIAABCAAAQhAAAIQgAAEINAuCOQg\/NrFfeQiIAABCEAAAhCAAAQgAAEIQAACEIAABCCQIIDwYyBAAAIQgAAEIAABCEAAAhCAAAQgAAEIQKAdEUD4taObyaVAAAIQgAAEIAABCEAAAhCAAAQgAAEIQADhxxiAAAQgAAEIQAACEIAABCAAAQhAAAIQgEA7IoDwa0c3k0uBAAQgAAEIQAACEIAABCAAAQhAAAIQgADCjzEAAQhAAAIQaAMEVq9ebcrKysyoUaNM9+7dG9XjdevWhccVFBSYwsLCRp2nMQdVVlaakpISs379ejNgwAAzdOjQRl3HrrwGtV1aWmq2bNliioqKEteQn5\/fGByNPmbTpk3mzTffNAsWLDDz5s0zS5YsSXAcNGhQYmwccsghZo899jCdOnWKbUP34aGHHjI7d+4My4866qjEPUmW6urqzIoVK0xOTk7iupOdu9EXlcUDy8vLje6jrrdPnz5ZbNk21RzPcjodf+WVV8zChQu9qgcddFBinDSUHnjgAVNRUeFVOeGEE4zeGXFpw4YN5uabb\/aKTj755LCdpUuXmtdffz0s13vn6KOPTucSqAMBCEAAAhCAQBMIIPyaAI9DIQABCEAAAi1J4D\/\/+Y+56667zKuvvpoQZUHabbfdzJ577mnOPfdc079\/\/7S6IFk4Y8aMsO6nPvWpxLkzSS+++KI588wzvUMGDx5s1M9kSXLluuuuM\/fee2+9KhJTF110kdevhvqzq65h7ty5iWt46aWX6nVP4uIHP\/iBGT58eCYoG1X36aefNj\/60Y+8sRB3Igmdq666yuy\/\/\/71iiUIDz\/8cO\/zf\/zjH2b69OneZ9XV1eYvf\/lLYuy9\/PLLCcnpjr\/jjz\/enH766VkXno0BJ+l17bXX1rsOiVI9B+eff76ZMGFC7Kk1tq+++uq0mz3rrLOM2ERTcz7L6XbmhhtuML\/+9a+96v\/7v\/9rfvjDHzb4vO67775eucT2888\/nxC+cenDDz+sJ\/D+9re\/hc\/13\/\/+d3PBBRd4h0oCkiAAAQhAAAIQaFkCCL+W5cvZIQABCEAAAo0iILmjH+cNJYmdv\/71r0bSLVWK\/vjPVPhVVVUlRJEivdzUr18\/L3rHLVPkz0knnZSIQmsoffvb3zbnnXdeqkswu+Ia3nnnHfOFL3whZd\/+9Kc\/mZkzZ6as15gKisq79NJLzYMPPpjR4RI70TGUjvCrqalJ3I9HH320wfbGjBmTEEoTJ07MqF\/ZrPyHP\/zB\/PznP0\/ZpKTt17\/+9Xr1br\/9dnPFFVekPD6oICF7zjnnePWb+1lOtzNxIk7vjH\/\/+99JT6Ex9r3vfc8rT\/V8IvzSvSPUgwAEIAABCGSXAMIvu7xpDQIQgAAEIJCSQFwkXbKDFH3zyCOPmJ49e8ZWkaiTFIxGKWUq\/H7zm9+Y66+\/vl4byYSfpp6eeuqpiWmn6SSJmcMOO6xVXYNExoknnuhFtyW7FkWLPfbYY4lpvs2dFK132223Neq0imxzhWUq4VdbW5uIxrr\/\/vvTak\/Xq+tu7DTztBppZKVMniM1oYjGAw880GvtJz\/5iZHMTTdFhV8mfUj1LKfbB7feoYceapYtW+Yd+txzzyWNSP3ud79r\/vnPf3r1JX4bkroIv8bcGY6BAAQgAAEItDwBhF\/LM6YFCEAAAhCAQEYEvvSlL5kXXnjBO0YiYuzYsUbRQtEou6jU0dRTRaZpCuyTTz5ptGZYNGUi\/D7++GNz8MEHx15DMuGniLQ777zTO0ZTeCX1dD5N83OTytwItl19DRJfimiMyhIJlL322itxf7RGmpu+9rWv1Zu6mNGNj6n8\/vvvm2OPPbZeibgfd9xxZtq0aWbr1q3mgw8+MIpGiyaJOE0n7dGjR6IolfDTNZ1yyin1zqPxJ6msqZ3u9F5V\/PKXv2wuueSSpl5qsx\/\/P\/\/zP+bdd9\/1zquoRI1lSa9o5Kmmyv\/rX\/\/y6itCUs9cuulnP\/tZIqo1SE19ltNtN1m9\/\/u\/\/zO\/+tWvvGLJ\/7h7rMhOTe1272+qiECdeO3atebuu+8O28jNzTWnnXZauEYiU3qbehc5HgIQgAAEINA4Agi\/xnHjKAhAAAIQgECLENCad9E1tFyhoumdn\/3sZz2JJxmj6KQgaV08raHVUMpE+GmKYrJpgHHCTxsjSIq5SaJPUXxB0pp4v\/3tb7062owi2EhhV19DXGTWZZddFq5hKDmiCEZ3M4JJkyYloi2bK2ljjdmzZ9eTVmpHEX\/RjTYUaXXGGWfUW+NPUzS\/9a1vJbqVSvj9+Mc\/9uSNjtEmH1OmTEkcv3LlSnPkkUd6Uqihad0uC23+sWbNmsTmLdq4Ydy4cSYvL6+5cHnn0aYTU6dO9T7TRhKK2AvSxRdfXG8dS4lTd3MKSd9ADKZ7ncH5m+NZjsJRxK7WvxPDYcOGJf4RoKGNY7R+oe5XQ89iUKbnT5tzuMkdO429UamE36pVqxL\/CCAZm+6apI3tC8dBAAIQgAAEOhIBhF9HuttcKwQgAAEItHoCEneXX365109tGhFEaKlAMk9CzE2K4grW8mtOWRZdf0ybVLhru8VJkIcffjixoYibtPmDK6gUdfjEE0+EVbQhgKaeBjsH7+priLavCERtbuHuUKv7okjKICkCTlF3zZUUnamoQTcpYm\/OnDlJp3Dfc889iY093CT5et999yU+SiX8jjnmGG8a9tlnn11vrMVJwTfeeMP07ds30cbnPve5hJAK0i9\/+UszcODAxEYi0Yi7T3\/604nPJa+aMykyU9GYblIUmivTNSYlAd2k8T569OjERxKUklBB0g63cVGUyfrdHM9ycG7JXEXNSspFk+7v5z\/\/+YSAjttB2ZWW7vm6dOninUqRgIoIdJOeUYnZhpIE5KxZs7wqf\/7zn0PpHyf8tMu0lgjQu8SNWNY7TNGHWk\/RvRZFa7oRmbovbkRwEJ3odkLvKnf9Rv1jyX777ef1UxGY3\/\/+95tz6HEuCEAAAhCAQKshgPBrNbeCjkAAAhCAAARMYsdQd\/20uCl1Ek1RsaSIr8985jMJhBKC2lnVTRKC7k6\/6UT4bdu2LSFNginBkgr6wezKxjjhd+WVVxr94A+SpI6bT+c+7+priEqSuM0Y0rmOptS58cYbjf5z0ze+8Y3EGEmWFAEmaedO45ZEeeqppxKHpBJ+iuRzp3Rqo5TolGJJGm3k4CZ3p1\/db1fiaHpndHp3tP+K9jzqqKOagss7VgJo\/Pjx3mfRNh5\/\/HEjnm6aP3++6dy5c+KjaIRenPxsqMPN8Szr\/L\/73e\/MNddck5KNIn3\/+Mc\/mqjIi1t\/M269QolaXX+Q4qY4x3WiMWv46fkKxmTcOfXekRAM\/qEjylLHSLYHa5fG9UFrIrpLI8QJ3pbcbCflDaMCBCAAAQhAoIUJIPxaGDCnhwAEIAABCGRCILrmlyRbVPooUkURZ26KruMXbfPMM880mqYapHSEX3RXXB2v\/1IJP00LdCORvvOd7yTW7lP0lDbx0IYekgmamqoonCCqLxWnbF2DROfkyZO97khYaa281157LSFFFJGo\/mvNM8kL5Zs7xW2g0NCGC+m0n0r43XrrrZ7wkzyUdHaTpJLWqnPTM888Y0aOHJn4KCr80umX6ihysaioKN3qKet98YtfTNyvICkSTtGGuh5FAGoXY3dKthsJqWPee+89L3LtK1\/5SrheojgqalFj4JBDDknU09p1bmqOZ1kbonzzm99Mea1BheOPPz5xjW5SBF50Q5yovNS02gMOOMA7Tpu3RCNM4zrSGOGXzgUp0i\/YbEgbieh5cJOeyf333z\/xkf6RJE6Eu5GncTs26x63xg1n0uFDHQhAAAIQgEAqAgi\/VIQohwAEIAABCGSRQDTK5vTTTzdXXHFFvR4E0w6DAskLbTCQLGUqy6KSIFjLKzqdOC7CTz\/C3QgzRdpENxoJ+qkyCU2Js1QpW9eg6ahBtGTQJ4mdZDsOa6rnL37xi3BKdarrSLc8OhZ03OLFi+uJpXTPp3qphF+qc0nWSh650aI6RmvFBevxNST8Zs6caSSX3EiyoE1N6Za4bq4k2SfpF02KeIxuZCPpo6g3dxxmIttcmRi019RnORphG5xXEZMS0h999JH5\/e9\/X+\/6JOWHDBnifR7tSzRyOG7ardbtjMreuHvTFOGnqbma6h\/dACdoJxDccesh\/uAHP0hM\/VVKtpO1pmDr+VTSOpbupiwai5nswNxc45LzQAACEIAABLJFAOGXLdK0AwEIQAACEEiDwD777OPJlK9+9avmwgsvrHdkdOplsnrBgZnKMre+BIl+\/Gszg3SEX1RGpnHZibW8Jk6c2GDVbF1Dsp1xG+pcMG22uaKFtGFHdO206BTFdLhG6zRF+ElASZo8++yz3mkl1X7605+Gn8UJPwknTdEMpstKvAQbibgni6712JhrdI+Jm34cd06tcRjdaEYyyN3kI1VfJMd0XcGU2qY+y3FrAGp9T23MEiTdC0UeuilO\/sdNC3ajRaMyLJMNaBor\/B544IFwYxVFLWscRaW6u2FRdNdldyMgLXGgpQ6i6bzzzgunn0fvh5YekDwlQQLine truncated
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQeYVNX5hw+9LV1EQBQRREARG0asWBKNLYolxpYYEzX5x0hs0SjWqIndGGOK3diS2GI31qjEXlEUEZGm9I70\/\/O735zZe+7e2ZndnV0u8J7n8cEzt537nu\/O7r7zzXcarVq1apWjQQACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAwBpLoBGid42dOwYOAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQCAigOglECAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIrOEEEL1r+AQyfAhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACiF5iAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIDAGk4A0buGTyDDhwAEIAABCEAAAhCAAAQgAAEIQAACEIAABCCA6CUGIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQis4QQQvWv4BDJ8CEAAAhCAwLpE4KuvvnIzZsxwm2yyiWvTpk2tbn369On541q1auUqKipqdZ7aHLRgwQI3ceJEN3PmTNelSxe34YYb1uo+Vuc96NpTpkxxCxcudN26dYvuoVmzZrXBUetj5s6d69566y33ySefuI8++siNGzcu4ti1a9coNvbYYw83aNAg16RJk9RraB4efvhht2LFivz2fffdN5qTQm3VqlVu0qRJrlGjRtF9Fzp3rW+qAQ+cPXu20zzqfjt27NiAV668VDme5VIG\/r\/\/\/c99+umnwa677LJLFCfVtQcffNDNnz8\/2OWwww5zes9Ia7NmzXI33XRTsOnII4\/MX+fzzz93b7zxRn673nf222+\/Um6BfSAAAQhAAAIQgEDJBBC9JaNiRwhAAAIQgAAEVgeBV1991d19993utddeiwSpb5tvvrnbZptt3KmnnurWW2+9koYmSTxkyJD8vt\/61reic9ek\/fe\/\/3XHHXdccMgGG2zgNM5CTVLtqquucvfff3+VXSQkzznnnGBc1Y1ndd3De++9F93Dyy+\/XGV4ElZnnHGG22ijjWqCslb7\/uc\/\/3Fnn312EAtpJ5LIu\/jii93QoUOrbJYY3nvvvYPX\/\/Wvf7mtt946eG3ZsmXujjvuiGJv1KhRkdyOx9+hhx7qjjnmmAYX3bUBJ9l55ZVXVrkPCXI9B6effrrr169f6qkV25dccknJlz3++OOd2CRbOZ\/lUgdz7bXXuuuvvz7Y\/ac\/\/an79a9\/Xe3zusMOOwTb9YHGiy++GIn+tPbxxx9XEbf33ntv\/rn+5z\/\/6c4888zgUMlfGgQgAAEIQAACECgnAURvOWlyLghAAAIQgAAEykpAUk9Spromoff3v\/\/dSbYWa0npU1PRu2TJkkgQKrMz3jp37hxk68W3KdPviCOOiLJOq2u\/+MUv3IgRI4rdglsd9\/Duu++6Qw45pOjYbr75Zjds2LCi+9VmB2Xhjhw50j300EM1OlxCLxlDpYje5cuXR\/Px2GOPVXu9TTfdNBKJ\/fv3r9G4GnLnv\/zlL+7yyy8veknJ+pNPPrnKfrfffru78MILix7vd5CI\/8lPfhLsX+5nudTBpAlYvWc8++yzBU+hGPvVr34VbC\/2fCJ6S50R9oMABCAAAQhAoD4JIHrrky7nhgAEIAABCECg1gTSMmcLnUzZdo8++qhr165d6i4StJLByazEmoreG264wV199dVVrlFI9KrEwFFHHRWVFyilScjttddemboHCazDDz88yGYtdC\/KDn3iiSeicg7lbsrOvfXWW2t1WmWyxkV1MdG7cuXKKPvygQceKOl6ul\/dd23LiZR0kVruVJPnSJdQBvPOO+8cXO23v\/2tk8QvtSVFb03GUOxZLnUM8f323HNPN378+ODQF154oWAG+i9\/+Uv373\/\/O9hfwr86mY\/orc3McAwEIAABCEAAAuUmgOgtN1HOBwEIQAACEIBAWQj88Ic\/dC+99FJwLgmoPn36OGUHJrNqkzJPJQaUiapSB08\/\/bRTTdBkq4no\/fLLL93uu++eem+FRK8yUO+6667gGJVqkMzV+fR17njTtnjG6uq+BwlPZTAnJZnE2bbbbhvNj2qgxttJJ51U5SvqdQ2IDz\/80B144IFVTiPuBx98sBs8eLBbtGiRGz16tFP2abJJwKpsQNu2baNNxUSv7ukHP\/hBlfMo\/vRhgr7CHy\/joB1\/9KMfufPOO6+ut1r247\/3ve+5999\/PzivspAVy5KdyUxzlUR5\/PHHg\/2VEa1nrtR22WWXRVnsvtX1WS71uoX2+8Mf\/uCuueaaYLM+9EmbY2Vyq4RHfH6LZQDrxNOmTXP33HNP\/hqNGzd2Rx99dL4GMqUb6jqLHA8BCEAAAhCAQCkEEL2lUGIfCEAAAhCAAAQalIBq2iZrZMZFmr7G\/+1vfzuQt5Jwykb0TXVvVSOzulYT0auvohf6unea6NWCV5Kh8SbBq6xd31Tz9o9\/\/GOwjxYZ8wtkre57SMvEPP\/88\/M1iiXFlLEcX2RqwIABUXZ1uZoWTBs+fHgVWanrKMM3uYCaMiuPPfbYKjV89VX8\/\/u\/\/4uGVUz0\/uY3vwmknY7R4m1bbrlldPzkyZPdPvvsE8jA6sp3xFloUbevv\/46WpRPC3L17dvXNW3atFy4gvNoMbGtttoqeE0LhClD17dzzz23Sp1qCfP4omOS\/V4Il3qf\/vzleJaTcJShr\/q2YtizZ8\/ow5\/qFgRUfWLNV3XPot+m50+LrsVbPHZqO1HFRO\/UqVOjD38k4UutOV7bsXAcBCAAAQhAAAJrLwFE79o7t9wZBCAAAQhAYI0lIGF7wQUXBOPXYmA+I1MbJHElQuNNWZu+Vm85JWmyvqgWH4vXbk2TX4888ki0UFy8aVGvuJhUlvFTTz2V30ULPanEgASg2uq+h+T1lXGsRcuaNGmSH7PmRZnTvinjVVm25WrKxlaWcLwpQ\/eVV14pWKrjvvvuixZsizdJ93\/84x\/RS8VE7\/777x+U2zjhhBOqxFqaDH7zzTddp06domt897vfjUSkb7\/\/\/e\/d+uuvHy0Ql8yw3XXXXaPXJS3L2ZSJrezreFPWafxDFMWk5G+8Kd579+4dvSQxLfno2y677JKaNV1o3OV4lv25JfGVJS8Zm2ya3wMOOCD64CEen36\/uKyOn69FixbBqZT5qwzgeNMzKiFfXZN4Puigg4JdbrvttvyHPWmi95NPPolKwei9JP4NBb2HKdtY9ZLj96Ls7HgGtuYl\/g0An40cH4Teq+L1mfUh2Y477hiMUxnXp512WjlDj3NBAAIQgAAEILCaCCB6VxN4LgsBCEAAAhCAQGECp59+elAfNe2r0xKMSaGoDM\/ddtstOrFE8KhRo4KLSATPnDkz\/1opGb2LFy+OZJkv\/SCZJFESl8xpoveiiy5yEj2+SebF+6XM\/+q+h6QcS1tkq5T7qMs+1113ndN\/8fazn\/3MKUYKNWV8StbGy3VInj3zzDPRIcVErzJ341\/d1wJ4ydIRknNaoCveJMH1tX81zXdc3ulr\/MkyHsnxK7t73333rQuu4FiJv8022yx4LXmNJ5980olnvI0ZM8Y1b948eimZkZsmvasbcDmeZZ3\/T3\/6k7viiiuKslFm\/1\/\/+leXFLhp9bXT6hFL0Ov+fUsrZZE2iNrU6NXz5WMy7Zx635EI9h9wJVnqGH3I4muTp41BNY\/jJXDSxH59LqJYdMLYAQIQgAAEIACBshJA9JYVJyeDAAQgAAEIQKAcBJI1PSVXk7JPmWnKMI23ZJ3e5FiOO+44p3IEvpUieiX5rr\/++vwxOl7\/FRO9+vp3PPPwlFNOiWrzKltSi7NpoTZJJJUgUNadz+Itxq+h7kGCe+DAgcFwJCpVC\/f111+PZJgykDV+yU1JK\/XL3dIWxqpuIa1Srl9M9N5yyy2B6JU01ocN8SaZqFq08fbcc8+5Xr16RS8lRW8p49I+ylTu1q1bqbsX3e\/73\/9+NF++KfNV2cW6H2X8\/vrXvw5Kb8Qzn3XMBx98EGSq\/vjHP87XQxZHZSkrBvbYY49oP9WmjbdyPMta6O7nP\/950Xv1Oxx66KHRPcabMm6TCx0mpbXKJ+y0007BcVqUL5lRnjaQ2ojeUm5Imb1+EUktEKfnId70TA4dOjR6SYsHpn0AEs80V+mYeIavn+MsLiRYCh\/2gQAEIAABCEAgJIDoJSIgAAEIQAACEMgcgWRW3THHHOMuvPDCKuP0Xy\/3GySttHBUoVZTSZqUQ75WZ7JsRFpGr+RLPKNUmXXJBeT8OLVNIttng1Y3IQ11Dyo74LOj\/Xgk9CSp05q+0v+73\/0uXzqjXEGVjAWd97PPPqsiFGtyvWKit9i5JOklDePZ4TpGtWB9vd3qRO+wYcOcpGI8c9RfU6U79IFFuZokr2RvsinDOblAoWSfslzjcVgTyRqXyP56dX2Wkxn1\/rzKkNYHEV988YX785\/\/XOX+9GFMjx49gteTY0l+UyCtvILqciclf9rc1EX0qgSDSrokFzb01\/EfbKTVOz7jjDOiEg9qKv+hbzUkmxYo1POppjrV8cX2FIvK6KVBAAIQgAAEILB2EED0rh3zyF1AAAIQgAAE1ioC22+\/fSDRTjzxRHfWWWdVucfkV+wL7ecPrKkkje8vMSbpo0WqShG9SQldygSpHED\/\/v2r3bWh7uHDDz+sUq6g2D348gjlyg7UQmzJ2qjJr6IXG1Pa9rqIXolHybLnn38+OLVk6qWXXpp\/LU30SjTqq\/i+LIKEm18gLn6yZC3n2txj\/Line truncated
%---
%[output:244f5944]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABPwAAAMeCAYAAACJFhrxAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQeYZEW5hqt7pidt3mWBJbkiQUAQUKKiLEpGlCwiooiKGQRBkQyKqEQBQZQsIAqoREFJihJFUWAJorBL2gAbmNnpmenu+3yNZ+5JPec\/3b27091vPY\/PvUzXqVP1Vp0O7\/5Vf6ZUKpUcBQIQgAAEIAABCEAAAhCAAAQgAAEIQAACEGgKAhmEX1PMI4OAAAQgAAEIQAACEIAABCAAAQhAAAIQgECZAMKPhQABCEAAAhCAAAQgAAEIQAACEIAABCAAgSYigPBroslkKBCAAAQgAAEIQAACEIAABCAAAQhAAAIQQPixBiAAAQhAAAIQgAAEIAABCEAAAhCAAAQg0EQEEH5NNJkMBQIQgAAEIACB1iYwNDTk+vr63Pjx41sbBKOHAAQgAAEIQAACLU4A4dfiC4DhQwACEIBAYxJ49dVX3bx589zb3\/52N2bMmKoGMXfu3OHruru73dixY6tqp5qL3nzzTTdr1iw3f\/58N3XqVLfaaqtVNY5mGEM1\/LxrtA5+9atfuWeeecb9+9\/\/djNnziy\/pDWx\/vrru7XWWsttsskm7mMf+5hrb29PfavlyTd1Z2MueOONN5zGoDU2adKkejSZuo16PKuWmz7wwAPldeAv22yzTfk9YqRy4403usWLFweq7LPPPk7vCXHl73\/\/u7v11lsDLx199NGura2t\/Lfnn3\/ePfzww8Ov631l1113tQyBOhCAAAQgAAEI1JEAwq+OMGkKAhCAAAQgsDQJ\/OUvf3FXX321e\/DBB8uizCvvfOc73aabbuoOO+wwt8IKK5i6IFm4+eabD9fdcssty22nKRIp2223nevt7Q1cdtddd7np06fHNqVrzjjjDHfddddFXt9oo43cMcccE+jXSP2pxxj+9Kc\/uYMOOihwm5VXXtmJdaVSzzGk4e2vWywWywy\/+93vRvjHtSn59\/3vf9+9613vMt+yHnzNN6tjRUmvH\/3oR+6vf\/1rgI0kqNb5kUce6dZdd93YO1544YXud7\/7nbk3WsvrrbdepH49n1VrZ84++2x37rnnBqp\/\/vOfd9\/61rdGXMtbbLFF4HXJ93vvvddlMpnY66644gp34oknBl4Tc08o\/\/rXv3ZHHXVU4HVJQAoEIAABCEAAAsuWAMJv2fLmbhCAAAQgAIGqCPzhD39w+vE+UlEkzy9+8QsnYZVUwnKgGuEncXLDDTdEbvXHP\/4xNqro9ddfd\/vtt185Em2k8tWvftUdfvjhSUNwtY4hn8+77bff3s2ePTtwrylTpgQilPwv1nsMiYOMqTAwMOA+\/elPO0V0pS2nnHKKO+CAA0yX1crXdJM6V\/rpT39aFptJ5Zvf\/Kb74he\/GKn2hS98wd15551Jlw+\/fv3115cjKP2l3s+qtTNPPfVUJJJO7wl6HiuV3\/zmN+4b3\/hG4OWk5w\/hZ50R6kEAAhCAAASWLwGE3\/Llz90hAAEIQAACiQTiotAqXaTonJtvvrniGW6SXJKCp556aqCJtMJPUYb7779\/bDfihN\/ChQvLounJJ59MHK8qSNx8+MMfjq1brzGcd9557swzz4zco5Lwq+cYTBAqVFJU2fnnn191ExJa73jHOypeXy++VXewygvTPCe6hcTV+9\/\/\/sDddtlll+Ft0ZZuhIVfmj4kPauW+4frfOhDH3L\/+c9\/An++55573BprrBHb3Ne\/\/nV30003BV675ZZbYqMWvUoIv2pmhmsgAAEIQAACy54Awm\/ZM+eOEIAABCAAgVQEFM113333Ba6RqND5bIomCkeoaTvjnnvuOVz\/z3\/+s9O5W9qieccddzidKRYuaYTf4OCgkxipFKkXJ\/yOP\/54d9VVVwVuqy28knovvvii0zZAf9Frij7ySr3HoHtuu+22sfNQSfjVOoZUk16h8qOPPup0vlq4KKpTEZfasrvSSiuVz3ITsx\/\/+MeRuu9+97vL5\/75z\/SrN996jDVtGzqn8PHHHw9cJrGpeZb0Cq9XbYX3n0VXKpVGFKFx\/fn973\/v1l577eGXan1W0445XF\/zfdZZZwX+LLn\/iU98ItK0ErwoOtG\/JT8pIlCNPPbYY4H3I53Rd\/DBBw9vAWZLb62zyPUQgAAEIACB+hBA+NWHI61AAAIQgAAElgoBnRcXPmPrM5\/5jDvuuOPK91Pyix122CEg8SQDFYXjFZ2Ld+21147YvzTC75JLLolECPobDws\/JU54z3veE7i\/RJ+i+LwSF7UmueUlWqj3GD73uc9V3OoYJ\/zqMYZaF4gEzQc+8IGIsFViBm2\/jUtKobPktE01fM7iscceW5Y0S2uNKBpSSVn0PyVzWHHFFctbzS3bzavhpKQTEpn+oghUnXHoFY05fE7lE088MZycInxmoaS55Lm11ONZDd9L0ZY6\/04cV1999bLkz+VyFbsk0bvTTjuN+Kx5L8bJY23v\/cpXvmIdcmy9JOH3yiuvlCW\/ZKz1zNGaOsTFEIAABCAAgRYlgPBr0Yln2BCAAAQg0BgE4rbP\/eMf\/3Djxo0bHoBknoSYv0j0eHKlnrJMP9bf9773Dd9K2Te1BdBfwsJPSRCUUMRftCVYmVO9oqhDRUt5RQkDJFy8zMH1HEP4jLXwGOKEXz3GUOuKizujTYko7r\/\/\/opbuHVPnbOo6D9\/CScmqRdfyanTTjutokzdbLPN3Kc+9am6Z23VNlZtZ\/WXa665JiDL47ahay2sueaa5cv+9a9\/ud133324CSWeOPTQQ83TVo9n1buZ5loRpZJy4SJ5\/pGPfKS8Rd7LjOuvo3Mpw9GMaq+zszPQlCIBwxGg4YjFuMFL6J100kmBlxT1N1LSjqeffrq8fV7vFf6IZK1DRR\/qPEX\/WBSt6R+D5KA\/4teLTvR3Qs+x\/\/xG\/WPIVlttFeinIjCPOOII85xSEQIQgAAEINDIBBB+jTx79B0CEIAABJqeQDgxRtyWOwnAPfbYI8Di0ksvdR\/84AfLf5MQVMZSf5EQ9Gf6tUb46UB\/T\/Dpx7qi9PySRPcIC7+TTz7ZXXbZZcO3V5Sa\/78tk1ivMSxZsqQshrxtzRInkgJ+YRon\/OoxBss4R6qjbbhHH310oIqSm2hORiragq21EN7K7Y9uqwdfZWc+5JBDTMNU5tikJDSmhv5XSQJonXXWCVyicw533nnn4b\/dfvvt7ktf+lKgzsyZM11HR0f5b+HXRzpHMq5v9XhW1e5PfvIT98Mf\/jBx+IrkvfjiiyMiL+5sSst5heEtzpU6UM0ZfpKQIyVD0TMpIej9Q0ZcQiAdSzB+\/Phyt+Lkt85E9B99ECd4f\/7zn7sZM2YksqUCBCAAAQhAoBkIIPyaYRYZAwQgAAEINC2B8JlgElTnnHNOYLyKZNGZd\/4SPscvDOiggw5ySjDgFYvw0zlvis7yygUXXFA+v0w\/5v0lLPx05pw\/UulrX\/ta+ew+RVcpiYe2f0o2rL\/++uXILy+qL2lSqxlDOPOsGOh\/ScJvaY0haYz+17\/zne84Ra35i6L7pk2blthM3NluSckZ0vB9+eWX3Y477hjZOjxSxyQZN99888S+Wyt8\/OMfdw899NBwdUXC\/eAHPyhnjFYEoCTjww8\/HHhdEtUr4a3qJ5xwQrm+5JKu1\/rUGYl77bWXU6RiuNTjWb3tttvcl7\/8ZeuQ3d57710eo78oyjKc8EYi1r\/Gw5G6ut4a0ViN8LMMSJF+XjIhJRJRQhF\/0RmgW2+9dflPcVGr+vsjjzziJk+eXK4Tl7H5n\/\/8p1NULAUCEIAABCDQCgQQfq0wy4wRAhCAAAQalkA4a+iBBx4Y2U6nwXnbEr2BJkVQpZE5alNniakvXgZQTxBq212S8NOPdH90mSJxwolGvH7rNQlNJRNIKmnHEBYh3nll4S3RcRF+S2sMSWP0vx6XQfa5555z2Ww2sZm4LcnhCLhwI2n4Xn755ZF1eeKJJ5bFmCLoJLLCGZHDEipxEAkVJPsk\/cJFkajh6EZJH4kr\/zrTNlWNw1L23XdfpzMB\/XK61mc1HH3q9eOTn\/yk22CDDdx\/\/\/tfd9FFF0W6J2G96qqrBv4e7ks4MjjunL24ZDtxLGoRftqaq638DzzwQCxmL6Nw3HmI3\/zmN8tbf1VOOeUUpyjmcNH86UxLFZ1F6E\/Kosg+RfhRIAABCEAAAq1CAOHXKjPNOCEAAQhAoCEJSJj4t94qAUN4W6cGtuGGGwaiqyrV8yCkkTm6JrzN0IsOswi\/sIy0TERS9JnaSDsGf31JIAmO7u7u8pbnpAi\/pTUGCwuvTrgPloyq3rWKVNtvv\/0Ct0tK0JCGr9abf8umpKm2jfsTTGgLr6I6vWLdQpqGkdZN0hZntafIvnAimZESucT1QdLPf2Zcrc9qnEiTNPVH1d59993us5\/9bKA7cXI\/bluwJ9PiZJiiF2+++WYT6mqF34033jicWEVRyZKzivD1F39ConDWZX+iHx1hoKMMwsW\/xT08H9qWL3lKgQAEIAABCLQKAYRfq8w044QABCAAgYYkEJY8lc5sC\/+4DcuI8ODTyBxF4+ncPa9IQEhEqNQq\/CSG\/ELTu4cyrioKKS4pgVcnzRjCWyW1xVXbh1VqFX61jCHNogyvBW3j9icyGKmtcEIK1dUWVCWGqFTS8A1HU6lN9U9iRmJNcq+vr88tWrRo+HZdXV11zdKqCDltF5fITSp6XhTt5Y\/Q0zlyXgSrd73mdvr06eXourh16j8TrtZnVeLuuuuuC3T98ccfD\/SxWCw6nd3nj1iME79Line truncated
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQeYJEX5\/9+dTZe4yB1HRgROQJAgIP5AD5SMKFlERBGVoAiCJMkgQckiIkiOogKSg8KBShL+KBIOBBTuCN4RLnB7G2f+z7f3eunp6Zmq3p2dnZ351PPw6G3XVFd9qrpn+jPvvNWQy+VyRoEABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAIFhS6AB0Tts546OQwACEIAABCAAAQhAAAIQgAAEIAABCEAAAhAICCB6WQgQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABIY5AUTvMJ9Aug8BCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAANHLGoAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgMMwJIHqH+QTSfQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACiF7WAAQgAAEIQAACEIBATRHo7u62trY2Gzt2bE2Ni8FAAAIQgAAEIAABCECgFAFEL+sDAhCAAAQgAIFhS+Cdd96xd9991z72sY\/Z6NGj+zWOuXPn9r1u5MiRNmbMmH61058XffjhhzZr1ix77733bPLkybbCCiv0axy1MIb+8Atfo3Xwu9\/9zl5++WV79dVXbebMmcEhrYm11lrLVlttNVt\/\/fXtK1\/5ijU1NaU+1VDyTd3ZhBd88MEHpjFojU2YMKEcTaZuoxzXqs9JH3\/88WAdRMvmm28e3CNKlVtvvdUWLlyYV2X33Xc33ROSyj\/+8Q+7++678w4dddRR1tjYGPzttddes7\/\/\/e99x3Vf2WGHHXyGQB0IQAACEIAABCDQbwKI3n6j44UQgAAEIAABCAwFgUcffdRuuOEGe+KJJwJBGpZPfOITtsEGG9ihhx5qSy+9tFfXJIk33njjvrqf+cxngrbTFAm0Lbfc0hYtWpT3sgcffNBWWWWVxKb0mnPOOcduvvnmguPrrruuHXvssXn9KtWfcozhL3\/5i+277755p5k6daqJdbFSzjGk4R2tm81mA4Y\/\/elPC\/gntSnpe+aZZ9onP\/lJ71OWg6\/3ycpYUbLz7LPPtsceeyyPjeS31vkRRxxh06ZNSzzjJZdcYrfffrt3b7SW11xzzYL65bxWfTtz\/vnn24UXXphX\/bvf\/a4dffTRJdfyJptskndcX7o8\/PDD1tDQkPi6a665xk466aS8Y2IefpHw+9\/\/3o488si845K\/FAhAAAIQgAAEIDCYBBC9g0mXtiEAAQhAAAIQKCuBP\/3pTyZpU6oocu\/66683iUpXiUuh\/oheCbNbbrml4FR\/\/vOfE6MI33\/\/fdtzzz2DyNNS5Qc\/+IEddthhriHYQMfQ0dFhW221lc2ePTvvXJMmTcqLSIweLPcYnINMqNDZ2Wnf\/OY3TRGcacupp55qe++9t9fLBsrX6yRlrnTppZcGQttVfvzjH9uBBx5YUO173\/uePfDAA66X9x3\/wx\/+EERMR0u5r1Xfzrz44osFkbO6J+h6LFZuu+02+9GPfpR32HX9IXp9Z4R6EIAABCAAAQhUkgCit5K0ORcEIAABCEAAAv0mkBR1WqwxRePdeeedRXO0Sm5KBp922ml5TaQVvYoq3muvvRK7kSR658+fHwjGF154wYuDhN0Xv\/jFxLrlGsNFF11k5557bsE5ioneco7BC0KRSooi\/eUvf9nvJiQyP\/7xjxd9fbn49ruD\/XxhmutEp5Cw3GyzzfLOtv322\/elv\/DpRlz0pumD61r1OX+8zhe+8AX7z3\/+k\/fnGTNm2EorrZTY3A9\/+EO744478o7dddddiVHKYSVEb39mhtdAAAIQgAAEIDDYBBC9g02Y9iEAAQhAAAIQKAsBRW8+8sgjeW1JUCn\/qqIH4xGp+tn6Lrvs0lf\/r3\/9qymvpn6Kf\/\/995tyhsZLGtHb1dVlEmLFInOTRO8JJ5xg1113Xd5plapBMveNN94w\/dw7WnRM0YZhKfcYdM7p06cnzk8x0TvQMZRjMTz99NOm\/KnxoihuRVgrNcMyyywT5GoVs1\/84hcFdT\/1qU8FeX2jOXvLzbccY03bhvIQP\/vss3kvk9DWPEt2xterUp5Ec83mcrmSAjypP\/fdd5+tvvrqfYcGeq2mHXO8vub7vPPOy\/uzvtT52te+VtC0Nu5TNHI09YorAliNPPPMM3n3I+Xg3W+\/\/fpSPZC6YaCzyOshAAEIQAACEOgPAURvf6jxGghAAAIQgAAEKkpA+WDjOTS\/9a1v2fHHHx\/0Q5uabb311nnyVhJYUXdhUd7bm266qWS\/04jeK664oiAiONp4XPRqQ6wNN9ww7\/wSvIraDUtSlKqkZriBVrnH8J3vfKfoT9qTRG85xjDQhSMx97nPfa5A1GvDLaVZSNpsTLlilY4gnkf5uOOOC+TcYK0RRT9rsz39p026pkyZEqQU8Ukr0h9O2kxMAjtaFHGuHMZh0Zjjeaiff\/75vk3H4jmJ9WWJvjTxLeW4VuPnUnS18tuK44orrhh8udPc3Fy0SxL82267bclrLTyY9KWB0jh8\/\/vf9x1yYj2X6H377beDL3ck4X1zig+oQ7wYAhCAAAQgAIG6IIDorYtpZpAQgAAEIACB4U0g6WfS\/\/znP22ppZbqG5gkrkRotEjwhVKtnJJUkub\/\/u\/\/+k61ww47mH7qHS1x0avNrbRRXLQo9cPkyZP7\/qQoY0VHhkUbQUm0KVpQpZxjiOdQjY8hSfSWYwwDXYlJOVi1wdjf\/va3oqk6dE7lUVa0b7TEN5wrF19JyTPOOKOoRN9oo43sG9\/4RkEu2YGyUboCpS2IlhtvvDHvS5KkdCNaC6uuumrwsueee8522mmnvia0odgBBxzg3bVyXKvhyTTXiiCXjI0XfWnypS99KUiFIokeL8o7HY9eVnutra15VRX5G4\/4jkcoJw1eIvfkk0\/OO6Qo31Kbsb300ktBmhTdK6K\/QNA6VLSx8iVHx6Lo7OgYJIWjEf5hNHK0E7qOo\/mZ9SXYpptumtdPRVwffvjh3nNKRQhAAAIQgAAEhg8BRO\/wmSt6CgEIQAACEKhbAvENz5J+Wi3xu\/POO+cxuvLKK+3zn\/988DeJ4MceeyzvuETwe++91\/c334hebdQUil1JGkXlRuWYGoyL3lNOOcWuuuqqvnMpKjX6b5\/JLdcYFi9eHAjBMH2FhJlkUFSUJ4necozBZ5yl6ijdwlFHHZVXRZvWaU5KFaXa0FqIp+yIRrOWg++DDz5o+++\/v9cwjz76aOfmgl4NLakk8bfGGmvkvUR5jLfbbru+v91777120EEH5dWZOXOmtbS0BH+LHy+VJzqpb+W4VtXur371K\/v5z3\/uHL4i9y+77LICgZuUe9onH3E8lUWxDvQnR6\/kc6lN7nRNSgSHX2AlbfSo9DNjx44NupX0pYdyHkdT3CSJ\/csvv9y22GILJ1sqQAACEIAABCAw\/AggeoffnNFjCEAAAhCAQN0RiOf8lJi84IIL8jgock05baMlnqc3Dm7fffc1bRwVFh\/RqzyuisYMy8UXXxzkJ5XEiZa46FVO2Whk4iGHHBLk5lU0pTZn08\/8JZnWWmutINIzjOJ1TXZ\/xqAUBxdeeGFf02Kg\/1yid7DG4Bpj9PhPfvITU5RqtCiad9lll3U2k5S71bXpVhq+b731lm2zzTYFKSJKdUxyeeONN3b23bfCV7\/6VXvyySf7qivy9Wc\/+5npyxFF\/Eou\/\/3vf887LnkelnhKkhNPPDGoL6mo12t9KgfyrrvuaopMjpdyXKv33HOPHXzwwb5Dtt122y0YY7Qoqjq+kaEEfHSNxyPz9XrfCOb+iF6fASmyN9wkUhvEaaO4aFGO789+9rPBn5Ki1PX3p556yiZOnBjUkaiPRvjqb\/\/6179MUfAUCEAAAhCAAARqjwCit\/bmlBFBAAIQgAAEao6ANj1T1GFY9tlnn4KfTetY+PPzsJ4rYjKNxFObyhWqvkh4qYRiWD+vdoleyZloNKki7+IbyIX91jGJbG0S5SppxxAXYGE+0njqi6SI3sEag2uM0ePxtaBjr7zyimUyGWczSakn4hGv8UbS8L366qsL1uVJJ50UCFFFzEpgKmIzWuLy0TkIRwVJXsneeFHkeTyaWbJPwjK6zpSOQOPwKXvssYcp52\/0S4mBXqvxaPOwH1\/\/+tdt7bXXtv\/+97\/261\/\/uqB7+qJi+eWXz\/t7vC\/xXwIk5dFN2kQxicVARK9SMChly+OPP56IWZvmrbTSSpaU7\/jHP\/5xkOJB5dRTTzX9aiFeNH\/KWa2iXMPRzfYUyauIXgoEIAABCEAAArVJANFbm\/PKqCAAAQhAAAI1RUCiLJpiQRtrxX++rwGvs846edGUxeqFcNJIPL0m\/nPyMBrUR\/TGJbTPBLmiTdVG2jFE60v+SWyNHDkySG3hiugdrDH4sAjrxPuQlMajWHuKTN1zzz3zDrs23krDV+st+tN8yXKlB4luHPbd7343iOIOi2+qgDSMtG5cqSzUniJ54xsEltqgL6kPkr3RiNGBXqtJAlWyPBpF\/9BDD9m3v\/3tvO4kfamTlP4hlKh6cVyCKlr5zjvv9ELdX9F766239m2Yp18hSMoroj9aohtNKk\/vs88+23c4uoGjUtUoZU28RFOZxOdD6VckzSkQgAAEIAABCNQmAURvbc4ro4IABCAAAQjUFIG43CuWkzUuNeISKg4ljcRT9K3y6oZF4kkCSmWgoldCMCqyw3N86lOfMkUdJm02FdZJM4b4T+KVykBpIlQGKnoHMoY0izW+FpSuI7pBVLine truncated
%---
%[output:2f867eb6]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>__________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0146146_Al2p_850eV.ibw'} {'29-Nov-2025 15:25:25'} 50 \n\n","truncated":false}}
%---
%[output:30898c2d]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABPwAAAMeCAYAAACJFhrxAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Ql4XXWduPHfzd7QUqC0FWmhFilLBQVB2QcRLDgiIuIIMqOgIo4g4qPA8JcRXAZREUaRdQQFUaaDFGFmYHApyvKgLCLYsgkIRJYWaOma7eb+n3NCQ8IJzftNmqTtffM884xNvme57705ST6cc0+pUqlUkh8WGMUCN954Y3rve9+b78F5552XTjzxxFHcG77pd73rXelPd7+cdnrz9wsLlUq1fEWvTHZ1Lo8tE9xGTW1TbP2DmC53LAkvVappCC1TKbcG59tD89lwTcOGhWXaOhbmn2usnxheX38LRF8j0bb1zZuH97OrY2loma7yytB8NlzbuGlomXLbC6H5mtoxoflsuL\/vvbbO7u021vWzv6Wa8Daij7sSbBv9vshf53UbhB5HaRDHkJrmTULb6FrxUmh+MMM1jf18f7c92\/18N25WXOUgnu9Sc6xtiv4q1hg7bmYPqm3a+FCuFRvEfz1sHdcR2kbbJrFjzqPTngytPxuetsHThWU6F7yYf65u0oTC13bb4M7wNnbqeji0zH7LHwzNl0ul0Hw2PKkjdpyauGvwd5DsGPL82NB+1a+oC82nF4rfqwOtoKtSbNWysC1fbMrExsLitePjj\/srtdsOtBt9vl5XKYfmr2l9f2g+G56\/dEZomamL4r\/L1LfWh7Yx7vFJofmxy2Kv2Wzlzc91P7e9P1pXtOT\/bGqeUtx+V\/y4FnoQ2fCSFbFFumKvj2zl5Ze7fyelHzUNwZ9J2e9G7bHvjZr62O9flc747+dd7YsLD7mtY0H+ucb6fl5vwb+VsvWU6ppp1u65rtjPvUpwPrYz3dOVrkG0jf4dGtyx6N972eprGzYqPt\/tz3c\/3w2TC18L\/y09iN+Fw89f8PifP6jg38a1TcVOveOUBL\/gq9XxNV7g9NNPT1\/\/+tfz9Z5yyilp7NjV\/wI5ZsyYdNJJJ6WamvgvBmty5wW\/Ys0oSuU\/WIMHtShsVMrxH3qCH\/tOEfxYp\/yXliB0Cn68bXRS8GPFBD\/WKZsS\/FgrwY91EvxYp2xK8GOtBD\/WKf+7RPDjsQKT0b\/38t+dBT9UWPBDmRwazQJ77bVXuv3220O70Nramhobi\/+lNrSSIQ4LfoLfUF5CnuHH6nmGH+sUhfBsrZ7h92rbNs\/wK7zQBD\/2vSf48U6CH2sl+LFOgh\/vJPjxVoIfbxWZFPwCtYInwwh+gbaOjnyBzs7OVF8fu0Qg20vBL\/tPULHLhr2kl7++PcOPtfIMP9Ypm\/IMP9bKS3pZp+QlvTCUl\/TSUF7SS0ul5CW9rJWX9LJOyUt6YajsMmMv6SWxvKSXVOqeif7Hby\/p5W2dtMA6X8Az\/IpPoZf08pe1Z\/ixVp7hxzp5hh\/rlP9y53v4oVie4Ycy5UNe0staeYYf6+QZfqxTNuUlvayVZ\/ixTtmUZ\/jxVpFJz\/AL1PIMv0AsRy0wjAUEP8FvKC8vwY\/VE\/xYJ8GPdRL8eCfBj7cS\/FgrwY91EvxYJ8GPdxL8eCvBj7eKTAp+gVqCXyCWoxYYxgKCn+A3lJeX4MfqCX6sk+DHOgl+vJPgx1sJfqyV4Mc6CX6sk+DHOwl+vJXgx1tFJgW\/QC3BLxDLUQsMYwHBT\/AbystL8GP1BD\/WSfBjnQQ\/3knw460EP9ZK8GOdBD\/WSfDjnQQ\/3krw460ik4JfoJbgF4jlqAWGsYDgJ\/gN5eUl+LF6gh\/rJPixToIf7yT48VaCH2sl+LFOgh\/rJPjxToIfbyX48VaRScEvUEvwC8Ry1ALDWEDwE\/yG8vIS\/Fg9wY91EvxYJ8GPdxL8eCvBj7US\/FgnwY91Evx4J8GPtxL8eKvIpOAXqCX4BWI5aoFhLCD4CX5DeXkJfqye4Mc6CX6sk+DHOwl+vJXgx1oJfqyT4Mc6CX68k+DHWwl+vFVkUvAL1BL8ArEctcAwFhD8BL+hvLwEP1ZP8GOdBD\/WSfDjnQQ\/3krwY60EP9ZJ8GOdBD\/eSfDjrQQ\/3ioyKfgFagl+gViOWmAYCwh+gt9QXl6CH6sn+LFOgh\/rJPjxToIfbyX4sVaCH+sk+LFOgh\/vJPjxVoIfbxWZFPwCtQS\/QCxHLTCMBQQ\/wW8oLy\/Bj9UT\/FgnwY91Evx4J8GPtxL8WCvBj3US\/FgnwY93Evx4K8GPt4pMCn6BWoJfIJajFhjGAoKf4DeUl5fgx+oJfqyT4Mc6CX68k+DHWwl+rJXgxzoJfqyT4Mc7CX68leDHW0UmBb9ALcEvEMtRCwxjAcFP8BvKy0vwY\/UEP9ZJ8GOdBD\/eSfDjrQQ\/1krwY50EP9ZJ8OOdBD\/eSvDjrSKTgl+gluAXiOWoBYaxgOAn+A3l5SX4sXqCH+sk+LFOgh\/vJPjxVoIfayX4sU6CH+sk+PFOgh9vJfjxVpFJwS9QS\/ALxHLUAsNYQPAT\/Iby8hL8WD3Bj3US\/FgnwY93Evx4K8GPtRL8WCfBj3US\/HgnwY+3Evx4q8ik4BeoJfgFYjlqgWEsIPgJfkN5eQl+rJ7gxzoJfqyT4Mc7CX68leDHWgl+rJPgxzoJfryT4MdbCX68VWRS8AvUEvwCsRy1wDAWEPwEv6G8vAQ\/Vk\/wY50EP9ZJ8OOdBD\/eSvBjrQQ\/1knwY50EP95J8OOtBD\/eKjIp+AVqCX6BWI5aYBgLCH6C31BeXoIfqyf4sU6CH+sk+PFOgh9vJfixVoIf6yT4sU6CH+8k+PFWgh9vFZkU\/AK1BL9ALEctMIwFBD\/BbygvL8GP1RP8WCfBj3US\/HgnwY+3EvxYK8GPdRL8WCfBj3cS\/HgrwY+3ikwKfoFagl8glqMWGMYCgp\/gN5SXl+DH6gl+rJPgxzoJfryT4MdbCX6sleDHOgl+rJPgxzsJfryV4MdbRSYFv0AtwS8Qy1ELDGMBwU\/wG8rLS\/Bj9QQ\/1knwY50EP95J8OOtBD\/WSvBjnQQ\/1knw450EP95K8OOtIpOCX6CW4BeI5agFhrGA4Cf4DeXlJfixeoIf6yT4sU6CH+8k+PFWgh9rJfixToIf6yT48U6CH28l+PFWkUnBL1BL8AvEctQCw1hA8BP8hvLyEvxYPcGPdRL8WCfBj3cS\/HgrwY+1EvxYJ8GPdRL8eCfBj7cS\/HiryKTgF6gl+AViOWqBYSwg+Al+Q3l5CX6snuDHOgl+rJPgxzsJfryV4MdaCX6sk+DHOgl+vJPgx1sJfrxVZFLwC9QS\/AKxHLXAMBYQ\/AS\/oby8BD9WT\/BjnQQ\/1knw450EP95K8GOtBD\/WSfBjnQQ\/3knw460EP94qMin4BWoJfoFYjlpgGAsIfoLfUF5egh+rJ\/ixToIf6yT48U6CH28l+LFWgh\/rJPixToIf7yT48VaCH28VmRT8ArUEv0AsRy0wjAUEP8FvKC8vwY\/VE\/xYJ8GPdRL8eCfBj7cS\/FgrwY91EvxYJ8GPdxL8eCvBj7eKTAp+gVqCXyCWoxYYxgKCn+A3lJeX4MfqCX6sk+DHOgl+vJPgx1sJfqyV4Mc6CX6sk+DHOwl+vJXgx1tFJgW\/QC3BLxDLUQsMYwHBT\/AbystL8GP1BD\/WSfBjnQQ\/3knw460EP9ZK8GOdBD\/WSfDjnQQ\/3krw460ik4JfoJbgF4jlqAWGsYDgJ\/gN5eUl+LF6gh\/rJPixToIf7yT48VaCH2sl+LFOgh\/rJPjxToIfbyX48VaRScEvUEvwC8Ry1ALDWEDwE\/yG8vIS\/Fg9wY91EvxYJ8GPdxL8eCvBj7US\/FgnwY91Evx4J8GPtxL8eKvIpOAXqCX4BWI5aoFhLCD4CX5DeXkJfqye4Mc6CX6sk+DHOwl+vJXgx1oJfqyT4Mc6CX68k+DHWwl+vFVkUvAL1BL8ArEctcAwFhD8BL+hvLwEP1ZP8GOdBD\/WSfDjnQQ\/3krwY60EP9ZJ8GOdBD\/eSfDjrQQ\/3ioyKfgFagl+gViOWmAYCwh+gt9QXl6CH6sn+LFOgh\/rJPjxToIfbyX4sVaCH+sk+LFOgh\/vJPjxVoIfbxWZFPwCtQS\/QCxHLTCMBbrBb0naeesfFLZS6eoIb7lU2xRbplIOzXd1Lg\/NZ8OV4DbqmiaFtxFdINq2s3VBdBOppp\/noq1jYb6exvqJhfWFn7uUUhT8Uqk29jiCz91gnu+ujqWxfcpeU+X20DJ1zZuF5svti0Lz+ePu5\/u1rfOF7ue7btPi811TH95GXfPmoWW62l4KzZc7loTms+H+XuerXUn0NZhto37D0H6VSjWx+YaxoflsuFRTV1imre3Z7ue7sZ\/XW01sn\/JtNAaP59FH0dQYXSJ1bbJBaJklk4LHnNDau4cXvuWZ0FLlutjPvWzlT018uriNha\/8XJhY\/Jl12CY3hfYpG35Tagkt8\/lFd4fm547dODSfDR+63VOhZSorGkLz2XDzXyaElulsjW8jtIGU0tM13T+re388u7Az\/+dmE4vf+2+qjbe9fEzs+3t27f6hh\/G31mmh+Wy4pT32XCxvjf++tu0DM2L7VaqE5ic83Ryaf73htmXd34+NY6cURhqfjP+sTHXBY2Fb7G+AypKXw4+70tX9mqYfpbr4916lbQVdfT4X\/f08DeL31P5+72zr6D6eN9YXX9OVrtjvnNl6ahtj30vRx13TMD7UNW9bbgstU6qN\/47Qubyfn5Wr2WpNXex3itADeGW4v79DV\/d8DwYVo6\/D6N\/Gg9mn6N8yA70GS5VKJXY0Hsyz5TIWWA8LCH7FJ1Xw4y90wY+1EvxYJ8GPdcqLine truncated
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQe4HFX5h7\/dvSU9gZDQMSKEIiC9CUpVEQQpigiIIipYEKQJfyBSRJQqoqJIExREpAnSFAERAcWCGkoAKaGFUJKQ5Lbd\/T+\/uZnLzOzszjl7997cu\/c9z8PDk7vfnDnzzpnZ2Xe\/\/U6uXC6XjQYBCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAALDlkAO0Ttszx0DhwAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAQEED0MhEgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCAxzAojeYX4CGT4EIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAUQvcwACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAwDAngOgd5ieQ4UMAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQQPQyByAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIDHMCiN5hfgIZPgQgAAEIQGAkEXjllVds7ty59u53v9vGjh1b16G\/9tprfduNHj3axo0bV1c\/9Wz09ttv2wsvvGCvv\/66TZkyxVZZZZW6jmNpHoP2\/dJLL9nChQttxRVXDI6htbW1Hhz92kbjuO222yr6+NCHPmQrrLBCzb51Hm666SYrFot9cbvssktwTqq1crlss2fPtlwuFxx3oVDo1\/iX5sZvvvmmiZ+Od5llllkqQ2nEtewy8AcffNCefPLJWOi2224b3ENqtRtuuMEWLFgQC\/nEJz5humektTfeeMMuuuii2Ev77bdf336eeeYZ++tf\/9r3uu47u+66q8shEAMBCEAAAhCAAAScCSB6nVERCAEIQAACEIDA0iDwwAMP2C9\/+Ut76KGHAkEatrXXXts23nhjO+KII2y55ZZzGpok8eabb94Xu+WWWwZ9+7Q\/\/elPdtBBB8U2kVjUOKs1SbVzzjnHrr322oqQDTbYwE444YTYuGqNZ2kdw7\/+9a\/gGO6\/\/\/6K4UlYHXPMMbbaaqv5oOxX7MUXX2zf+c53Kvo48sgj7Wtf+1rNvp9++mnbeeedYzG\/+c1vbKONNor9rbu7237+858Hc+8vf\/lLILej82+fffaxAw88cKmIbl94kp1nn312xXHoCxNdB0cffbSttdZaqd1qbp9++unOuzz44INNbJKtkdey62DOP\/98u+CCC2LhX\/ziF+2b3\/xmzet1iy22iL2uLzTuvffeQPSntccee6xC3F5zzTV91\/V1111nxx57bGxTyV8aBCAAAQhAAAIQaCQBRG8jadIXBCAAAQhAAAINJfD73\/\/eJGVqNWXm\/eIXv8jM4lQfSenjK3o7OzsDQajMzmibPHlyLFsv+poy\/fbdd1+TXKzVJCclKbPa0jiGf\/7zn7bXXntlDc0uueQS23777TPjGhHw0Y9+1B5\/\/PGKriTk7rvvvpq7cBG9PT09wfm49dZba\/b1nve8JxCJ66yzTiMOa0D6+OlPf2pnnnlmZt+S9YcddlhF3BVXXGGnnHJK5vZhwPHHH29f+MIXYvGNvpZdB5MmYHXP+MMf\/lC1ixtvvNG+8Y1vxF7Puj4Rva5nhDgIQAACEIAABAaSAKJ3IOnSNwQgAAEIQAACdRNIy5yt1pnk3i233GITJkxIDZGglQxOZiX6it4LL7zQzj333Ip9VBO98+bNs\/33399mzpzpxEFCbqeddhpSxyCB9clPfjKWzVrtYJQdqnIKOh8D2dKkWnR\/+tn9+973vqpDyBK9pVIpyL68\/vrrnQ5Dx6vjrreciNNO6gzyuY60C2Uwb7PNNrG9ffvb3w4kvmtLil6fMWRdy65jiMbtuOOO9r\/\/\/S+26T333FM1A\/3rX\/+6\/fa3v43FS\/jXkvmI3nrODNtAAAIQgAAEINBoAojeRhOlPwhAAAIQgAAEGkLgs5\/9bEVmpgTUGmusYcoOTGbV6mfp0axTlRhQJqpKHdx5552mmqDJ5iN6n3\/+edtuu+1Sj62a6D355JPtqquuim2jUg2SuepPP+eONr2mbMKwLe1jkPBUBnNSkkmcbbLJJsH5UQ3UaDv00EMrfqLekAkR6UQlJH74wx9W7faQQw4JymFUa1miV8f06U9\/umJzzT99maCf8EfLOCjwc5\/7nJ100kmNPtR+9\/fxj3\/cHn300Vg\/ykLWXJbsTGaaqyTK7373u1i8sup1zbk2ldRQFnvY+nstu+63WtwPfvADO++882Iv60uftHOsTG6V8Iie36wMYHU8Z84cu\/rqq\/v2kc\/n7YADDuirgUzphv6eRbaHAAQgAAEIQMCFAKLXhRIxEIAABCAAAQgMKgHVtE3WyIyKNC2mpUW3ovJWEk7ZiGGT6FONzFrNR\/Tqp+jVfu6dJnq14JVkaLRJ8CprN2xpwvKRRx7pk0NL+xjSMjFnzJjRV6NYUkwZy9FFptZdd90gu3qgmuSz5ka0XnNyXzofqqnb0tKSOows0ft\/\/\/d\/MWmnTrR42\/rrrx\/09+KLL9pHPvKRmAysVb4jOggt6vbqq68Gi\/JpQa4111yz6jj7y1CLiSUzm7VAmDJ0w3biiSdW1Kn+73\/\/G1t0TLI\/FMKuxxn234hrOclBGfqqbyuGq666avDlT60FAVWfWOer1rUYvqbrT4uuRZvKOHz1q1\/t1+nIEr0vv\/xy8OWPJLxrzfF+DYiNIQABCEAAAhBoSgKI3qY8rRwUBCAAAQhAYHgTkLD91re+FTsILQY2fvz4vr9J4iazNrXYkxZGU2ukJE3WF9XiY9HarWny6+abbw4Wios2Leo1ZcqUvj9JVN9xxx19\/9ZCT8pKlgAcCseQZKiMYy1aVigU+sas86LM6bAp43XPPfccsAkohpKV0aYs1GS93rQSBOE2WaJ3t912i5XbSMsQTpPBf\/vb32zZZZcNdqMawhKRYfve975nU6dOtdNOO60iw\/YDH\/hA8HdJy0Y2ZWIr+zralHUa\/RIljafm++qrrx5sJjEt+Ri2bbfd1lSz17U14loO96XyCMqSl4xNNn2p8rGPfSz44iE6P8O4qKyO9tfe3h7rSpm\/ygCONl2jEvK1msTzHnvsEQu5\/PLL+77sSRO9TzzxRFAKRveS6C8UdA9TtrHqJUePRdnZ0QxsnZfoLwDCbOToIHSvitZn1pdkW221VWycyrg+6qijXE8pcRCAAAQgAAEIDGECiN4hfHIYGgQgAAEIQGCkEjj66KNj9VHTfjotwZgUipdddpl98IMfDLBJBCurM9okgqOZoC4ZvYsXLw5kWZg9LJkkURKVzGmi99RTTzWJnrBJ5kX\/7XJul\/YxJOVY2iJbLsfRyJi0DFSJMgmtaFNd4WoLkGWJXmXuRn+6rwXwdt9991j\/2qcW6Io2SXD97F9N5zsq7\/Qz\/mQZjyQXlaPYZZddGoZL4m\/69Omx\/pL7uP322+3LX\/5yLEbSvK2tLfhbMiM3qyxGcvCNuJbV549\/\/GM766yzMtkos\/\/iiy+2pMBNq6+d9mVAcpG\/tFIWaYOop0avrq+77rqr6jHpviMRHH7BlWSpDfUlS1ibPG0MycUJ08T+YC6imHkCCYAABCAAAQhAoF8EEL39wsfGEIAABCAAAQgMBIFkTU\/J1e9\/\/\/uxXSkzTRmm0Zas05sc20EHHWQqRxA2F9EryXfBBRf0baPt9V+W6NXPv6OZh4cffnhQm1fZklqcTQu1SSKp1IEkZZjFm8VzsI5Bgvu9731vbDgSlYsWLbKHH344yKBVBrLGL7kpaaV\/D2TTT\/Y33XTTmITdfvvtg4XC0mrRJksQhGPLEr2XXnppbB\/K8NWXDdEmmahatNF2991327Rp04I\/JUWvK5c\/\/\/nPtuKKK7qGZ8Z96lOfCs5X2JT5quxiHY8yfr\/5zW\/GSm\/o9V\/\/+td98f\/+979jmaqf\/\/zngzkgtuKoLGXNgR122CGIU23aaGvEtayF7r7yla9kHmsYsM8++wTHGG3KuE0udJiU1iqf8P73vz+2nRblU93prFaP6M3qU68rszdcRFILxGmhuGjTNbn11lsHf9LigZLByRbNNFfpmOQXIDrHQ3EhQRc+xEAAAhCAAAQgECeA6GVGQAACEIAABCAw5Agks+oOPPBAO+WUUyrGGf68PHxB0koLR1VrvpI0KYfCWp3JshFpGb2SL9EawsqsSy4gF45Tr0lkh9mgtU7IYB2Dyg6E2dHheCT0JKnTmn7S\/93vfrevdMZATKpkCQ3tQ0JPYi9NYP3oRz+qqM2qbbJEb9bYJeklDZN1glULNqwLXEv0Sk5LKibLTWi\/Kt2hLywa1SR5JXuTTeUBkgsUSvYpyzU6D30ka1Qih\/vr77WczKgP+1WGtL6IePbZZ+0nP\/lJxfHpy5iVV1459vfkWJK\/FEgrr6C63EnJn3Zu+iN6VYJBJV2SCxuG+9GieauttlpFdrVeP+aYY4ISD2oq\/6FfNSSbSm3o+lRTreHoYnvhFyWNmm\/0AwEIQAACEIDA0iWA6F26\/Nk7BCAAAQhAAAIpBDbbbLOYRPvSl75kxx13XEVk8if21eLCDX0laTReYkzSZ\/To0UFZiKyM3qSEdjnRKgewzjrr1AwdrGP4z3\/+U1GuIOsYxEg\/RR+o7MCkpNJ4wmzFNHmrBbgke5OtP6JX4lHj+OMf\/xjrVjL1jDPO6PtbmuiVaNRP8cOyCBJuaYt8JWs5Z3HPej2tzETaNsrkTS4gqGzp6OJtWfuSFNVxhaUT+nstp9X4Vf3uz3zmM31D0blQpnG0pX3pk1b+IZSo2jY5v3wWFqxX9N5wwLine truncated
%---
%[output:0b22a369]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQv8VGP+xx8Km7so11xWV5K7Wkskt5bCslqXpCxyyV1kicLK2hC5ZW0REbYIyf26LiUUUUshUkpC4e9S\/V+fs3tmnzlzZubMmTMz55x5P69XL34zz+X7vL\/f+f3mfM73fJ+VVqxYscLQIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAILEEVkLoTazvMBwCEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAgEMAoZdAgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCCQcAIIvQl3IOZDAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEEDoJQYgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCCScAEJvwh2I+RCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEEHqJAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACCSeA0JtwB2I+BCAAAQhAoJ4IzJ8\/33z55Zdmq622MmussUaorS9cuDAzrlGjRmbNNdcMNU+YQUuXLjWffvqpWbRokWnSpInZbLPNQu2jlnvQ2p9\/\/rn57rvvzMYbb+zsYZVVVgmDo6wxsuPxxx\/PmWP\/\/fc3G220UcG55YeHH37YLFu2LNOvS5cujk\/ytRUrVpjPPvvMrLTSSs6+GzRoUJb9tRy8ePFiI37a73rrrVcTU6L4LAcx\/LXXXjP\/\/ve\/s7ruueeezu+QQm3cuHFmyZIlWV3+8Ic\/GP3O8GtfffWVufXWW7PeOuqoozLrzJ4920yePDnzvn7vHHTQQUG2QB8IQAACEIAABCAQmABCb2BUdIQABCAAAQhAoBYEXnnlFTN69Gjz+uuvOwKp21q3bm122mknc9ZZZ5kNNtggkGkSiXfbbbdM3w4dOjhzl9Jeeukl07Nnz6whEhZlZ74mUW3IkCHm\/vvvz+nSrl07c9FFF2XZVcieWu1h6tSpzh5efvnlHPMkWJ1\/\/vlm8803LwVlWX1vv\/12c9VVV+XMcfbZZ5u+ffsWnHvWrFlmv\/32y+rzz3\/+0+y4445Zr\/3888\/mrrvucmLv1VdfdcRtO\/6OOOII06NHj5oI3aXCk9j5t7\/9LWcfumGiz8F5551nWrVq5TutYvuKK64IvGTv3r2N2HhblJ\/loMZcf\/315oYbbsjqftJJJ5kLL7yw4Oe1ffv2We\/rhsYLL7zgCP1+7f33388Rbu+7777M5\/rBBx80\/fr1yxoq8ZcGAQhAAAIQgAAEoiSA0BslTeaCAAQgAAEIQCBSAk8\/\/bSRKFOoKTPvnnvuKZrFqTm8ok+pQu+PP\/7oCITK7LTb+uuvn5WtZ7+nTL\/u3bsbiYuFmsRJiZTFWi328Pbbb5vf\/\/73xUwzd9xxh+nUqVPRflF0+N3vfmdmzJiRM5UEuRdffLHgEkGE3l9++cXxx2OPPVZwrq233toREtu0aRPFtioyx\/Dhw83gwYOLzi2x\/pRTTsnpd+edd5qBAwcWHe926N+\/vznxxBOz+kf9WQ5qjJ8Aq98ZzzzzTN4pHnroIXPOOedkvV\/s84nQG9Qj9IMABCAAAQhAoJIEEHorSZe5IQABCEAAAhAITcAvczbfZBL3Hn30UbP22mv7dpFAKzHYm5VYqtA7bNgwc+211+askU\/o\/eabb8wxxxxj3nvvvUAcJMjtu+++sdqDBKwjjzwyK5s132aUHapyCvJHJZufqGavp8fut99++7wmFBN6ly9f7mRfjh07NtA2tF\/tO2w5kUCLhOxUyudISyiDeY899sha7corr3RE\/KDNK\/SWYkOxz3JQG+x+nTt3Nh999FHW0Oeffz5vBvqZZ55pHnnkkaz+EvwLifkIvWE8wxgIQAACEIAABKImgNAbNVHmgwAEIAABCEAgEgLHH398TmamBKjmzZsbZQd6s2r1WLqddaoSA8pEVamDJ5980qgmqLeVIvTOmTPH7L333r57yyf0DhgwwNx9991ZY1SqQWKu5tPj3HbTe8omdFut9yDBUxnMXpFMwtnOO+\/s+Ec1UO3Wp0+fnEfUIwkIaxKVkLjpppvyTvunP\/3JKYeRrxUTerWno48+Ome44k83E\/QIv13GQR179eplLrnkkqi3WvZ8hx56qJk2bVrWPMpCVixL7PRmmqskyoQJE7L6K6ten7mgTSU1lMXutnI\/y0HXzdfvxhtvNNddd13W27rp4+djZXKrhIft32IZwJp4wYIF5t57782ssfLKK5tjjz02UwOZ0g3lepHxEIAABCAAAQgEIYDQG4QSfSAAAQhAAAIQqCoB1bT11si0hTQdpqVDt2zxViKcshHdJqFPNTILtVKEXj2Knu9xbz+hVwdeSQy1mwReZe26zU+wnDJlSkYcqvUe\/DIxL7300kyNYoliyli2D5naZpttnOzqSjWJz4oNu16zdy35QzV1GzZs6GtGMaH3z3\/+c5Zop0l0eNt2223nzDd37lxz4IEHZomBhcp32EboULcvvvjCOZRPB3K1aNEir53lMtRhYt7MZh0Qpgxdt1188cU5daqnT5+edeiYxH5XEA66T3f+KD7LXg7K0Fd9WzFs1qyZc\/On0IGAqk8sfxX6LLrv6fOnQ9fspjIOp59+elnuKCb0zps3z7n5IxE+aM3xsgxiMAQgAAEIQAACqSSA0JtKt7IpCEAAAhCAQLIJSLC97LLLsjahw8DWWmutzGsScb1ZmzrsSQejqUUpknrri+rwMbt2q5\/4NX78eOegOLvpUK8mTZpkXpJQ\/cQTT2R+1kFPykqWABiHPXgZKuNYh5Y1aNAgY7P8osxptynj9bDDDqtYAIqhxEq7KQvVW6\/XrwSBO6aY0HvwwQdnldvwyxD2E4PfeOMN07hxY2cZ1RCWEOm2v\/71r6Zp06bm8ssvz8mw7dixo\/O6RMsomzKxlX1tN2Wd2jdR\/Hgq3n\/96187wyRMS3x025577mlUszdoi+Kz7K6l8gjKkpcY6226qdK1a1fnxoMdn24\/W6y251tttdWyplLmrzKA7abPqAT5Qk3C8yGHHJLVZeTIkZmbPX5C78yZM51SMPpdYj+hoN9hyjZWvWR7L8rOtjOw5Rf7CQA3G9k2Qr+r7PrMukn2m9\/8JstOZVyfe+65QV1KPwhAAAIQgAAEYkwAoTfGzsE0CEAAAhCAQL0SOO+887Lqo\/o9Oi2B0Ssojhgxwuy1114ONgnByuq0m4RgOxM0SEbvDz\/84IhlbvawxCQJJbbI7Cf0Dho0yEjocZvEPPvnIL6t9R684pjfIVtB9hFlH78MVAllErTsprrC+Q4gKyb0KnPXfnRfB+B169Yta36tqQO67CYRXI\/9q8nftninx\/i9ZTy8XFSOokuXLpHhkvDXsmXLrPm8a0ycONGceuqpWX0kmq+66qrOa96M3GJlMbzGR\/FZ1py33HKLueaaa4qyUWb\/7bffbrwCrl99bb+bAd5D\/vxKWfgZEaZGrz5fTz31VN496feOhGD3BpeXpQbqJotbm9zPBu\/hhH7CfjUPUSzqQDpAAAIQgAAEIFAWAYTesvAxGAIQgAAEIACBShDw1vSUuDp06NCspZSZpgxTu3nr9Hpt69mzp1E5ArcFEXol8t1www2ZMRqvf8WEXj3+bWcennHGGU5tXmVL6nA2HdQmEUmlDiRSulm8xXhWaw8SuLfddtsscyRUfv\/992bSpElOBq0ykGW\/xE2JVvq5kk2P7O+yyy5ZImynTp2cg8L8atF6SxC4thUTev\/xj39kraEMX91ssJvERNWitduzzz5rttxyS+clr9AblMu\/\/vUvs\/HGGwftXrTfH\/\/4R8dfblPmq7KLtR9l\/F544YVZpTf0\/gMPPJDp\/84772Rlqp5wwglODIitOCpLWTGwzz77OP1Um9ZuUXyWddDdaaedVnSvbocjjjjC2aPdlHHrPejQK1qrfMJvf\/vbrHE6lE91p4u1MEJvsTn1vjJ73UMkdUCcDoqzmz6Tu+++u\/OSDg+UGOxtdqa5Ssd4b4DIx3E8SDAIH\/pAAAIQgAAEIJBNAKGXiIAABCAAAQhAIHYEvFl1PXr0MAMHDsyx03283H1DopUOjsrXShVJveKQW6vTWzbCL6NX4otdQ1iZdd4D5Fw79Z6EbDcbtJBDqrUHlR1ws6NdeyToSaT2a3qk\/+qrr86UzqhEUHlLaGgNCXoS9vwErJtvvjmnNqvGFBN6i9kukV6iobdOsGrBunWBCwm9EqclKnrLTWhdle7QDYuomkReib3epvIA3gMKJfYpy9WOw1JEVltEdtcr97Pszah351WGtG5EfPzxx+a2227L2Z9uxmy66aZZr3tt8T4p4FdeQXW5vSK\/n2\/KEXpVgkElXbwHG7rr6NC8zTffPCe7Wu+ff\/75TokHNZX\/0FMN3qZSG\/p8qqnWsH3YnnujJKp4Yx4IQAACEIAABGpLAKG3tvxZHQIQgAAEIAABHwK77rprloh28sknmwsuuCCnp\/cR+3z93IGliqR2fwljEn0aNWrklIUoltHrFaGDOFrlANq0aVOwa7X28O677+aUKyi2BzHSo+iVyg70ilSyx81W9BNvdQCXxF5vK0folfAoO5577rmsaSWm\/uUvf8m85if0SmjUo\/huWQQJbn6HfHlrORfjXux9vzITfmOUyes9QFDZ0vbhbcXWkiiqfbmlE8r9LPvV+FX97uOOOy5jinyhTGO7+d308Sv\/4IqoGuuNr1IOFgwr9I4bNy5zYJ6eUlAceW+m2AdRejPX7QMeVcpGJW287eyzz86UGfH6QyVmJJrTIAABCEAAAhBIBLine truncated
%---
%[output:27ab5aa8]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>__________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0067067_O1s_1000eV.ibw'} {'21-Aug-2021 18:05:35'} 50 \n {'0067067_O1s_1000eV.ibw'} {'25-Okt-2021 09:04:27'} 50 \n\n","truncated":false}}
%---
%[output:3f52d2f2]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQeYFMX69Ws2kkTJCqaLimJGxZwwi5hARS6YIwZMmMWsqJjTX6\/XnFHRK1fMCXNOqBivGEBRkSSbZ77v9HR1v1VTPdM7u7Px1PP4uHRXVVf9qjrM6bdPJVKpVEoxkQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJtFoCCQq9rXbs2HASIAESIAESIAESIAESIAESIAESIAESIAESIAES8AhQ6OVEIAESIAESIAESIAESIAESIAESIAESIAESIAESIIFWToBCbysfQDafBEiABEiABEiABEiABEiABEiABEiABEiABEiABCj0cg6QAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQCsnQKG3lQ8gm08CJEACJEACJEACJEACJEACJEACJEACJEACJEACFHo5B0iABEiABEiABEiABFoVgdraWrVkyRLVtWvXVtVuNpYESIAESIAESIAESIAECkmAQm8h6bJuEiABEiABEiCBBhH49ddf1R9\/\/KH+8Y9\/qM6dO9e7roULF6pZs2ap5ZZbTvXs2bNe5ZPJpJozZ46aPXu2V2755ZdXffr0UUVFRfWqp6GZ20IfGsoA8+CRRx5RX3\/9tfruu+\/UzJkzvSoxJ9Zcc0216qqrqkGDBqm99tpLlZSU1Ptwv\/\/+e1CmY8eOqkuXLvWuo7kLNKQPVVVV6vvvv\/f6jXmeSCTq1R2cKzjPampqVP\/+\/fMag4ae63Eb\/L\/\/\/U+99tprRvYBAwaoTTfdNGsVb775pvr222+NPFtvvbVaeeWVneXmzZunbrnlFmPfqFGjvGsZEni\/9957wX6w32233eJ2g\/lIgARIgARIgARIwEmAQi8nBgmQAAmQAAmQQIsiAEHlgQceUO+88476888\/g7atscYaaoMNNlAnnnhiVtH2559\/VjfeeKMnokDU0WnZZZdVgwcPVoceeqhab731svZ56tSp6tprrzXK6wLHHnusOvLII9VSSy0V1PHyyy+rSZMm5cVx5513VieccIJRti30IS8YViEIiJMnT1aXXHKJ+vvvv3NWCdH3sssuU2uvvXbOvDoDXiRsvPHGQX4Ifph\/rSnl04eKigp1\/fXXq7ffflt98sknQXchnoMHRPPdd989K4b7779fPffcc+rDDz80xgfn2ZZbbqnGjh2bVfRt6Lmezxi9\/vrr6sADDzSKYt7897\/\/zVrd9ttvn3E9gGDcr18\/Z7kvv\/wyQ7h96KGHgrn26KOPqtNOO80oC\/GXiQRIgARIgARIgAQaQoBCb0PosSwJkAAJkAAJkECjEnjhhRc8ETVbQkQcBCYIt3aCsLvffvsZArGrrgcffFBtsskmzsOg7gkTJmRtQ48ePdQTTzwRiDz4++STT86LBdoLcVKnttCHvEBYhaqrq9XBBx\/sCZH1TRdddJEaPXp0rGIQ9CF46tQahd769mHx4sXqmGOOURA9s6VzzjnHezFip1Qq5b3YsCNW7XxDhw5VV199tSorK8uoo6HneqzBdWSC7Qeiv+0XBxCdXdcUVIEXL4jelWnDDTf0osyjEoXefEeI5UiABEiABEiABBpCgEJvQ+ixLAmQAAmQAAmQQKMRQHTcQQcdFKs+fF6OCDzp0YpPvxGBKKOAs1X2+OOPZ0T2uqLsoupYd911vWhTiFhTpkxR48ePj9V2O5MUettCH\/KC4Ch01VVXqZtuuinv6p5\/\/nm1yiqrRJaHXQFE\/YsvvtjI05qE3nz6AJF2\/\/33N2wDskE+\/\/zzMyJgbWE5W3mIvYiwl6mh53rek8IviD7dc889RjWYb3vvvbezakTinnXWWcY+FxeZgUJvQ0eJ5UmABEiABEiABPIhQKE3H2osQwIkQAIkQAIk0OgEEL05ffp0o158\/g3\/VUT\/IapOpiuvvFINHz482PSvf\/3LiIzFDtg9bLbZZurTTz9VH3zwgVEeZVGHTr\/88ovaaqutjDz4jB2+mRCWIerabbjzzjvVNttsox5++GF15pln5sUE\/T733HO9sm2hD3lBsAphrPbdd9+MqhBxCUEd1gzwS4ZnL6JSb7jhhoy8sOdAxKX07EXejz\/+2PN9huUAhHU7tXSht6F9+Oijj9SIESOMbiNCHRYi8PmFQC4TmOOY2psalg9rrbVWBje8ZIG\/8VNPPZURLfviiy8G3rQo2NBzvaFzDFHi\/\/znP41qcJ675hEy4SsDXINkyhYBjHxz585V+HJAJ\/AbM2aM6tatm7eJ1g0NHUWWJwESIAESIAEScBGg0Mt5QQIkQAIkQAIk0OwEIDDZVgqHHHJIYKGAT8132mknQ5iDCCyj8nbccUdvoS6d4LsJSwUt9B133HFq2rRpRl8\/\/\/xzT5xCckWQyqhf2wdVC0BnnHGGwoJp2J8rnX766YbgDBsKRAMvvfTSXtG20IdcDHLtx6f1+EzeFmEhwiOSVAtlsh6IbkcddVSGwGhbDyAqE9GZ2VJcoReRsb\/99pvCCwIs2IfFtCCK9u3bNxjPXH3NZ39D+3DhhRequ+66yzi09JrFOYVoVZnwIgO+u0jPPPOMZ\/sgEywccH4izZgxQ+2xxx7GfojzukxjnOs2t7q6OvXjjz96Hrrwzh44cGDWBfUwx\/ACSEb\/46UORHB7MT+XsA0P41zzKNfY5hJ6sRAk+oSo9PouJJnr2NxPAiRAAiRAAiTQdglQ6G27Y8uekQAJkAAJkECrIeASl7BAlFzwzPX5tI6qc30mraNtNYRvvvnGi1qUCRF8eqX7zTff3BAXIRxCmJUJUaAQYHRabbXVFMrFSa4+Ikqwf\/\/+XvG20Ic4HHLlcXGACPfGG28YVh12PS77DAivmCM6NVQk1fUgwvWCCy4wXizI9iC6Nc6if7lYuPY3pA81NTXegobSn\/boo482FgWDaAqxW4qgWLxMi78QbCH26gQLE7xQkQmLC2JBQ53wQgNRvUgNPdflcfByBX7M8lh6PwRSLKCGxRPldUTvdwneiACH965MrsXbLr30Us\/+IlvCwmp77rmnkQUCu67fJfR+9dVXnqcxoqLl1wOYx4hAxuJ2xcXFQZ1YME++3EKf5VhoP2LZCFzvpCc4XqJB9JYJEdennHJKPtOTZUiABEiABEiABJqZAIXeZh4AHp4ESIAESIAESEB5n+NDqNNJCkN6G4Rf20NTi7kuke+dd95RvXr1CuqEgAVhViYtcrmiDB977DFv0abGSC7x0raeaAt9aAxWENtsgf2kk05Sxx9\/fNbqIWLCRsOOBJZR23hZ8NZbbxn1QAiWomauiF6M28033xyrq9kW\/YtVgSNTQ\/rwww8\/qO22286oFT7Iu+66q7HtiCOOCIRZ7JBiLiJ7JS\/4ap933nlG+dtvv11dcsklxjbYpyDquaHnuq705ZdfVuPGjcuI4raRwZYC5\/KKK65o7HrvvffUyJEjjW2o78QTTzS2QdT997\/\/bWyzry2usczHoxcR\/bZ1hqwbwjWEYC1c2yyRF9Yk2rvc1QbY0EiLHPRl1KhRGeM3ZMiQfKcoy5EACZAACZAACTQjAQq9zQifhyYBEiABEiABEkgTsD07ERF53XXXGXgQeQbBSSYtltretogA\/eyzzzLwIgIOgpNOeiE0V9QehGVE1qEeeMHCE3b11VdXsIyojwCMqLp99tnHOC5sCO6++26jfW2hD40xn88++2zD2xR1Ipp3ueWWy1k9IrSvueYaIx\/GEJ\/yRyUIlbAu0Cmb0PvSSy+pww8\/PGc7dAbMQwjJrojS2JXEyBi3Dy5\/XteidbaYrSOjk8mk55ktkyu61bXY2quvvqpWWGGFBp\/rOLbLTzsbJrw4wuKN2qYFeV2Ry\/D0tu1dYCMio2td567r2PkIvTGG2ovs1QsIIpIZ0dMy3XfffcFXBlGLRL7\/\/vuqe\/fuXjGXLziueZi7TCRAAiRAAiRAAq2PAIXe1jdmbDEJkAAJkAAJtDkCQ4cOVTNnzgz6dcABB3ifxttJ2xzo7fDHxUJJdtSdKyIYZWxBGVFriD50CSIQlaUoLNsCsQ+fNpeXl+cci9tuu01NnDjRyIdP3wcMGGBsawt9yAkjRgZ7LqDIt99+GywGlq2KJ598MiMi0xWxKuuIK5KijL0oF6JFMU8hJMMO4dZbb\/VeDsgEIW2HHXaI0fP8s8TtA6xC0AeZXNGpLvEPFgHworZfcrj4ugRlnGPrr7++aui5jra7\/LZxLiPiFS+EcM7JqGOUwYsjvECSCVHHOP9lkouswfMXdcp0xRVXeC9ucqWGCL2wYMDXCFg0zpVeeeUVL0LZ9SXCqaee6lk8IMHWAl892AkvmfTCkzZLfU3M1T\/uJwESIAESIAESaJkEKPS2zHFhq0iABEiABEigXRGwPwd3+eMCyDrrrGN8qq3znXzyyYY3pcs3FOVtUQMLtiHSD8KHS1jONggQrG688cas4+QSYqJE7LbQh8aYtLaYHyXau47l+hwfXDHuUSmuSIrydtvsOVBdXe15sEoPXLwUgK9uIVPcPmBRtTPPPNNoivzUX+9w+egiHzxxbdEaQqn9mb9L5IT9AWwjGnquu+rGOCCaO5FIeF2YN2+e2mijjYx+IjLXXoTugw8+UPvuu6+RD4syaosYRMeee+65xn6UcS0IaI9vvkKvXAASojW8gL\/44gujerlQpf2VAsYHQj0S+oEvE+wkrVDs8YB38ZgxYwo5XVk3CZAACZAACZBAAQlQ6C0gXFZNAiRAAiRAAiQQj4AtoEV5stqihLZesCN1N954YwUvUzvZnpb6k3RXBKMuqz9hluKd3mcv+GYfLine truncated
%---
%[output:2edd5c8e]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQecG8X5v9\/TNXfjQjPdgOkY0yFAYiAETAvFhGJIoRM6BEIxpoZeA4SE3gmh\/UIwBEINhNCS0IxD6BhMM+7lmvT\/f9desbtaaWd1Ovt098zn40+CNDs788ysTnr23XdqcrlczigQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCBQtQRqEL1VO3d0HAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEICARwDRy0KAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIFDlBBC9VT6BdB8CEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAKKXNQABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAoMoJIHqrfALpPgQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABRC9rAAIQgAAEIAABCECgqgi0trbanDlzrF+\/flXVbzoLAQhAAAIQgAAEIACBjiSA6O1IurQNAQhAAAIQgEC7CHzxxRf2zTff2EorrWS9e\/dO3daMGTPs448\/tqWXXtoGDx6c6vhsNmuTJ0+2zz\/\/3Dtu2WWXtSWXXNIymUyqdtpbuSuMob0MtA7+9Kc\/2bvvvmvvv\/++TZw40WtSa2LNNde0VVZZxUaMGGE\/\/vGPra6uLvXpvv766\/wxPXv2tD59+qRuY1Ef0J4xNDU12QcffOCNW+u8pqYm1XB0reg6a2lpsaFDh5Y1B+291l07\/OGHH9rf\/\/73UPVhw4bZpptuWrKJf\/zjH\/bee++F6my11Va24oorxh737bff2nXXXRd6b5999vE+y1TE+5VXXsm\/L\/Y77rij6zCoBwEIQAACEIAABGIJIHpZGBCAAAQgAAEIdCoCEip33XWXvfTSSzZlypR831ZffXVbf\/317dhjjy0pbSdNmmRXX321J1Ekdfyy1FJL2UYbbWS\/+MUvbPjw4SXH\/PDDD9sVV1wROt4\/4Je\/\/KUdcsgh1rdv33wbTz\/9tF188cVlcfzRj35kxxxzTOjYrjCGsmBEDpJAvPfee+28886z2bNnJzYp6XvBBRfY2muvnVjXr6AbCRtvvHG+voSf1l81lXLGMHfuXLvqqqvsn\/\/8p73++uv54Uqei4ek+c4771wSw5133mmPP\/64\/etf\/wrNj66zLbbYwg4\/\/PCS0re913o5c\/T888\/bAQccEDpU6+Yvf\/lLyea22Wabgs8DCeNlllkm9rh33nmnQNzec889+bV233332UknnRQ6VvKXAgEIQAACEIAABNpDANHbHnocCwEIQAACEIBARQn87W9\/8yRqqaKIOAkmidtokdjda6+9QoI4rq27777bNtlkk9jTqO2xY8eW7MOgQYPsoYceykse\/f\/jjz++LBbqr+SkX7rCGMoCETmoubnZfvazn3kiMm0555xzbL\/99nM6TEJfwtMv1Sh6045h1qxZdsQRR5ikZ6ly+umnezdGoiWXy3k3NqIRq9F6o0aNsssuu8waGhoK2mjvte40uTGVlPZD0d\/RGweSznGfKWpCN14UvRssG2ywgRdlXqwgesudIY6DAAQgAAEIQKA9BBC97aHHsRCAAAQgAAEIVIyAouN++tOfOrWnx8sVgRfM0apHvxWBGIwCLtXYgw8+WBDZGxdlV6yNdddd14s2lcR64IEH7MQTT3Tqe7RSUPR2hTGUBSHmoEsvvdSuueaaspt74oknbOWVVy56vNIVSOqfe+65oTrVJHrLGYMk7d577x1KG1AK8plnnlkQARsVy6WOl+xVhH2wtPdaL3tRLDhQY7rttttCzWi97bbbbrFNKxL31FNPDb0XxyVYAdHb3lnieAhAAAIQgAAEyiGA6C2HGsdAAAIQgAAEIFBxAorefO6550Lt6vFv5V9V9J+i6oLlkksusd133z3\/0h\/+8IdQZKzeULqHzTbbzN544w177bXXQsfrWLXhl88++8y23HLLUB09xq68mRLLkrrRPtx88832\/e9\/3\/74xz\/aKaecUhYTjfuMM87wju0KYygLQuQgzdXo0aMLmlLEpYS6UjMoX7Jy9ioq9be\/\/W1BXaXnUMRlMGev6v7nP\/\/x8j4r5YDEerR0dtHb3jH8+9\/\/tj322CM0bEWoK4WI8vxKkAeLmOucfm5qpXxYa621CrjpJovyGz\/yyCMF0bJPPvlkPjetDmzvtd7eNaYo8X333TfUjK7zuHWkSnrKQJ9BwVIqAlj1vvrqK9OTA34RvzFjxtiAAQO8l0jd0N5Z5HgIQAACEIAABOIIIHpZFxCAAAQgAAEILHICEkzRVAo\/\/\/nP8ykU9Kj5dtttFxJzksDBqLwf\/vCH3kZdflHeTaVU8EXfkUceaePHjw+N9e233\/bklEpcBGkw6jeaB9UXQL\/+9a9NG6bp\/aRy8sknh4Sz0lAoGrh\/\/\/7eoV1hDEkMkt7Xo\/V6TD4qYSXhFUnqi7JgO5Juhx56aIFgjKYeUFSmojNLFVfRq8jYL7\/80nSDQBv2aTMtSdEhQ4bk5zNprOW8394xnH322XbLLbeETh3MNatrStGqwaIbGcq7q\/LYY495aR+CRSkcdH2qvPXWW7bLLruE3pec94+pxLUe5dbW1maffPKJl0NXubPXWGONkhvqaY3pBlAw+l83dSTBo5v5xYlt5TBOWkdJc5skerURpMakqPS0G0kmnZv3IQABCEAAAhDougQQvV13bhkZBCAAAQhAoGoIxMklbRAV3PAs7vFpP6ou7jFpP9rWh\/C\/\/\/3Pi1oMFkXw+Tvdb7755iG5KHEoMRssigKVgPHLqquuajrOpcSNUVGCQ4cO9Q7vCmNw4ZBUJ46DJNwLL7wQStURbScufYbEq9aIX9orSf12FOF61llnhW4sBPuj6FaXTf+SWMS9354xtLS0eBsaBvPTHnbYYaFNwSRNJbuDElSbl\/nyV8JWstcvSmGiGyrBos0FtaGhX3RDQ1G9Ku291oPn0c0V5WMOnst\/X4JUG6hp88Tg54j\/fpzwVgS4cu8GS9zmbb\/5zW+89BelijZW23XXXUNVJNj99uNE73\/\/+18vp7GiooNPD2gdKwJZm9vV1tbm29SGecGbWxpzcC78fMTBTujzLpgTXDfRJL2DRRHXJ5xwQjnLk2MgAAEIQAACEFjEBBC9i3gCOD0EIAABCEAAAuY9ji9R55egGPJfk\/iN5tD0ZW6c5HvppZds8cUXz7cpgSUxGyy+5IqLMrz\/\/vu9TZsqUeLkZTT1RFcYQyVYSbZFBftxxx1nRx11VMnmJTGVRiMaCRyM2tbNghdffDHUjkRwUGomRfRq3q699lqnoZba9M+pgZhK7RnDRx99ZFtvvXWoVeVB3mGHHUKvHXzwwXkxqzeCMleRvUFeyqs9bty40PE33nijnXfeeaHXlD5FUc\/tvdb9Rp9++mk7+uijC6K4o8iUlkLX8vLLLx9665VXXrGf\/OQnodfU3rHHHht6TVL3hhtuCL0W\/WyJm8tycvQqoj+aOiPYtsS1RLAvrqMsVVepSfzc5XF9UBqaYIocjWWfffYpmL+RI0eWu0Q5DgIQgAAEIACBRUgA0bsI4XNqCEAAAhCAAATmE4jm7FRE5JVXXhnCo8gzCadg8WVpNLetIkDffPPNAryKgJNw8ou\/EVpc1J7EsiLr1I5ywSon7GqrrWZKGZFGACuqbs899wydV2kIbr311lD\/usIYKrGeTzvttFBuU7WpaN6ll146sXlFaF9++eWheppDPcpfrEhUKnWBX0qJ3qeeesoOOuigxH74FbQOJZLjIkqdG3Go6DqGuPy8cZvWRWW2HxmdzWa9nNnBEhfdGrfZ2rPPPmvLLbdcu691nTsun3YpTLpxpM0b\/TQtqhsXuayc3tH0LkojEoyujbt2485djuh1mGovstffQFCRzIqeDpY77rgj\/5RBsU0iX331VRs4cKB3WFxecH3mae1SIAABCEAAAhCoPgKI3uqbM3oMAQhAAAIQ6HIERo0aZRMnTsyPa\/\/99\/cejY8WP82B\/7ry42qjpGjUXVxEsI6JCmVFrSn6ME6ISCoHpXCwL5J9erS5sbExcS6uv\/56O\/\/880P19Oj7sGHDQq91hTEkwnCoEF0LOuS9997LbwZWqok\/\/\/nPBRGZcRGrwTZcJamOiW7KpWhRrVOJZKVD+P3vf+\/dHAgWibRtt93WYeTlV3Edg1KFaAzBEhedGif\/lCJAuaijNzni+MYJZV1j6623nrX3Wlff4\/Jt61pWxKtuCOmaC0Yd6xjdONINpGBR1LGu\/2AJbrKmnL9qM1guuugi78ZNUmmP6FUKBj2NoE3j4sozzzzjRSjHPYnwq1\/9ykvxoKK0FnrqIVp0k8nfeDLK0v9MTBof70MAAhCAAAQg0DkJIHo757zQKwhAAAIQgEC3IhB9HDwuP66ArLPOOqFHtf16xx9\/fCg3ZVzeUB0flRrasE2RfhIfcWK51CRIWF199dUl5ylOxBST2F1hDJVYtFGZX0zax50r7nF8cdW8FyuuklTHR\/sWXQPNzc1eDtZgDlzdFFBe3Y4srmPQpmqnnHJKqCvBR\/39N+Ly6KqecuJGpbVEafQx\/zjJqfQHShvR3ms9rm3Ng6K5a2pqvCF8++23tuGGG4bGqcjc6CZ0r732mo0ePTpUT5sy+iliFB17xhlnhN7XMXEbAkbnt1zRG9wAUtJauYAnTJgQaj64UWX0KQXNj0S9isahJxOiJZgKJTofyl08ZsyYjlyutA0BCEAAAhCAQAcSQPR2IFyahgAEIAABCEDAjUBUoBXLyRqVEn7qhWLine truncated
%---
%[output:9949b5fb]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>__________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0067067_O1s_1000eV.ibw'} {'25-Okt-2021 09:04:27'} 50 \n\n","truncated":false}}
%---
%[output:0ab749aa]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQecG8X5v9\/TNXfjQjPdgOkY0yFAYiAETAvFhGJIoRM6BEIxpoZeA4SE3gmh\/UIwBEINhNCS0IxD6BhMM+7lmvT\/f9desbtaaWd1Ovt098zn40+CNDs788ysTnr23XdqcrlczigQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCBQtQRqEL1VO3d0HAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEICARwDRy0KAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIFDlBBC9VT6BdB8CEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAKKXNQABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAoMoJIHqrfALpPgQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABRC9rAAIQgAAEIAABCECgqgi0trbanDlzrF+\/flXVbzoLAQhAAAIQgAAEIACBjiSA6O1IurQNAQhAAAIQgEC7CHzxxRf2zTff2EorrWS9e\/dO3daMGTPs448\/tqWXXtoGDx6c6vhsNmuTJ0+2zz\/\/3Dtu2WWXtSWXXNIymUyqdtpbuSuMob0MtA7+9Kc\/2bvvvmvvv\/++TZw40WtSa2LNNde0VVZZxUaMGGE\/\/vGPra6uLvXpvv766\/wxPXv2tD59+qRuY1Ef0J4xNDU12QcffOCNW+u8pqYm1XB0reg6a2lpsaFDh5Y1B+291l07\/OGHH9rf\/\/73UPVhw4bZpptuWrKJf\/zjH\/bee++F6my11Va24oorxh737bff2nXXXRd6b5999vE+y1TE+5VXXsm\/L\/Y77rij6zCoBwEIQAACEIAABGIJIHpZGBCAAAQgAAEIdCoCEip33XWXvfTSSzZlypR831ZffXVbf\/317dhjjy0pbSdNmmRXX321J1Ekdfyy1FJL2UYbbWS\/+MUvbPjw4SXH\/PDDD9sVV1wROt4\/4Je\/\/KUdcsgh1rdv33wbTz\/9tF188cVlcfzRj35kxxxzTOjYrjCGsmBEDpJAvPfee+28886z2bNnJzYp6XvBBRfY2muvnVjXr6AbCRtvvHG+voSf1l81lXLGMHfuXLvqqqvsn\/\/8p73++uv54Uqei4ek+c4771wSw5133mmPP\/64\/etf\/wrNj66zLbbYwg4\/\/PCS0re913o5c\/T888\/bAQccEDpU6+Yvf\/lLyea22Wabgs8DCeNlllkm9rh33nmnQNzec889+bV233332UknnRQ6VvKXAgEIQAACEIAABNpDANHbHnocCwEIQAACEIBARQn87W9\/8yRqqaKIOAkmidtokdjda6+9QoI4rq27777bNtlkk9jTqO2xY8eW7MOgQYPsoYceykse\/f\/jjz++LBbqr+SkX7rCGMoCETmoubnZfvazn3kiMm0555xzbL\/99nM6TEJfwtMv1Sh6045h1qxZdsQRR5ikZ6ly+umnezdGoiWXy3k3NqIRq9F6o0aNsssuu8waGhoK2mjvte40uTGVlPZD0d\/RGweSznGfKWpCN14UvRssG2ywgRdlXqwgesudIY6DAAQgAAEIQKA9BBC97aHHsRCAAAQgAAEIVIyAouN++tOfOrWnx8sVgRfM0apHvxWBGIwCLtXYgw8+WBDZGxdlV6yNdddd14s2lcR64IEH7MQTT3Tqe7RSUPR2hTGUBSHmoEsvvdSuueaaspt74oknbOWVVy56vNIVSOqfe+65oTrVJHrLGYMk7d577x1KG1AK8plnnlkQARsVy6WOl+xVhH2wtPdaL3tRLDhQY7rttttCzWi97bbbbrFNKxL31FNPDb0XxyVYAdHb3lnieAhAAAIQgAAEyiGA6C2HGsdAAAIQgAAEIFBxAorefO6550Lt6vFv5V9V9J+i6oLlkksusd133z3\/0h\/+8IdQZKzeULqHzTbbzN544w177bXXQsfrWLXhl88++8y23HLLUB09xq68mRLLkrrRPtx88832\/e9\/3\/74xz\/aKaecUhYTjfuMM87wju0KYygLQuQgzdXo0aMLmlLEpYS6UjMoX7Jy9ioq9be\/\/W1BXaXnUMRlMGev6v7nP\/\/x8j4r5YDEerR0dtHb3jH8+9\/\/tj322CM0bEWoK4WI8vxKkAeLmOucfm5qpXxYa621CrjpJovyGz\/yyCMF0bJPPvlkPjetDmzvtd7eNaYo8X333TfUjK7zuHWkSnrKQJ9BwVIqAlj1vvrqK9OTA34RvzFjxtiAAQO8l0jd0N5Z5HgIQAACEIAABOIIIHpZFxCAAAQgAAEILHICEkzRVAo\/\/\/nP8ykU9Kj5dtttFxJzksDBqLwf\/vCH3kZdflHeTaVU8EXfkUceaePHjw+N9e233\/bklEpcBGkw6jeaB9UXQL\/+9a9NG6bp\/aRy8sknh4Sz0lAoGrh\/\/\/7eoV1hDEkMkt7Xo\/V6TD4qYSXhFUnqi7JgO5Juhx56aIFgjKYeUFSmojNLFVfRq8jYL7\/80nSDQBv2aTMtSdEhQ4bk5zNprOW8394xnH322XbLLbeETh3MNatrStGqwaIbGcq7q\/LYY495aR+CRSkcdH2qvPXWW7bLLruE3pec94+pxLUe5dbW1maffPKJl0NXubPXWGONkhvqaY3pBlAw+l83dSTBo5v5xYlt5TBOWkdJc5skerURpMakqPS0G0kmnZv3IQABCEAAAhDougQQvV13bhkZBCAAAQhAoGoIxMklbRAV3PAs7vFpP6ou7jFpP9rWh\/C\/\/\/3Pi1oMFkXw+Tvdb7755iG5KHEoMRssigKVgPHLqquuajrOpcSNUVGCQ4cO9Q7vCmNw4ZBUJ46DJNwLL7wQStURbScufYbEq9aIX9orSf12FOF61llnhW4sBPuj6FaXTf+SWMS9354xtLS0eBsaBvPTHnbYYaFNwSRNJbuDElSbl\/nyV8JWstcvSmGiGyrBos0FtaGhX3RDQ1G9Ku291oPn0c0V5WMOnst\/X4JUG6hp88Tg54j\/fpzwVgS4cu8GS9zmbb\/5zW+89BelijZW23XXXUNVJNj99uNE73\/\/+18vp7GiooNPD2gdKwJZm9vV1tbm29SGecGbWxpzcC78fMTBTujzLpgTXDfRJL2DRRHXJ5xwQjnLk2MgAAEIQAACEFjEBBC9i3gCOD0EIAABCEAAAuY9ji9R55egGPJfk\/iN5tD0ZW6c5HvppZds8cUXz7cpgSUxGyy+5IqLMrz\/\/vu9TZsqUeLkZTT1RFcYQyVYSbZFBftxxx1nRx11VMnmJTGVRiMaCRyM2tbNghdffDHUjkRwUGomRfRq3q699lqnoZba9M+pgZhK7RnDRx99ZFtvvXWoVeVB3mGHHUKvHXzwwXkxqzeCMleRvUFeyqs9bty40PE33nijnXfeeaHXlD5FUc\/tvdb9Rp9++mk7+uijC6K4o8iUlkLX8vLLLx9665VXXrGf\/OQnodfU3rHHHht6TVL3hhtuCL0W\/WyJm8tycvQqoj+aOiPYtsS1RLAvrqMsVVepSfzc5XF9UBqaYIocjWWfffYpmL+RI0eWu0Q5DgIQgAAEIACBRUgA0bsI4XNqCEAAAhCAAATmE4jm7FRE5JVXXhnCo8gzCadg8WVpNLetIkDffPPNAryKgJNw8ou\/EVpc1J7EsiLr1I5ywSon7GqrrWZKGZFGACuqbs899wydV2kIbr311lD\/usIYKrGeTzvttFBuU7WpaN6ll146sXlFaF9++eWheppDPcpfrEhUKnWBX0qJ3qeeesoOOuigxH74FbQOJZLjIkqdG3Go6DqGuPy8cZvWRWW2HxmdzWa9nNnBEhfdGrfZ2rPPPmvLLbdcu691nTsun3YpTLpxpM0b\/TQtqhsXuayc3tH0LkojEoyujbt2485djuh1mGovstffQFCRzIqeDpY77rgj\/5RBsU0iX331VRs4cKB3WFxecH3mae1SIAABCEAAAhCoPgKI3uqbM3oMAQhAAAIQ6HIERo0aZRMnTsyPa\/\/99\/cejY8WP82B\/7ry42qjpGjUXVxEsI6JCmVFrSn6ME6ISCoHpXCwL5J9erS5sbExcS6uv\/56O\/\/880P19Oj7sGHDQq91hTEkwnCoEF0LOuS9997LbwZWqok\/\/\/nPBRGZcRGrwTZcJamOiW7KpWhRrVOJZKVD+P3vf+\/dHAgWibRtt93WYeTlV3Edg1KFaAzBEhedGif\/lCJAuaijNzni+MYJZV1j6623nrX3Wlff4\/Jt61pWxKtuCOmaC0Yd6xjdONINpGBR1LGu\/2AJbrKmnL9qM1guuugi78ZNUmmP6FUKBj2NoE3j4sozzzzjRSjHPYnwq1\/9ykvxoKK0FnrqIVp0k8nfeDLK0v9MTBof70MAAhCAAAQg0DkJIHo757zQKwhAAAIQgEC3IhB9HDwuP66ArLPOOqFHtf16xx9\/fCg3ZVzeUB0flRrasE2RfhIfcWK51CRIWF199dUl5ylOxBST2F1hDJVYtFGZX0zax50r7nF8cdW8FyuuklTHR\/sWXQPNzc1eDtZgDlzdFFBe3Y4srmPQpmqnnHJKqCvBR\/39N+Ly6KqecuJGpbVEafQx\/zjJqfQHShvR3ms9rm3Ng6K5a2pqvCF8++23tuGGG4bGqcjc6CZ0r732mo0ePTpUT5sy+iliFB17xhlnhN7XMXEbAkbnt1zRG9wAUtJauYAnTJgQaj64UWX0KQXNj0S9isahJxOiJZgKJTofyl08ZsyYjlyutA0BCEAAAhCAQAcSQPR2IFyahgAEIAABCEDAjUBUoBXLyRqVEn7qhWLine truncated
%---
%[output:26c3d5db]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQe8FNX5v9+7t1EuIGDFEiUqtojYNWqCGgu2WDAWNDH2XmNHrLHXqDExauzG2H5RscWuMbYYuxKsoNgA6dy6\/\/93YNaZ2dmdM3v3wr13n\/P58Em8e+bMOc85s+WZd95Tlc1ms0aBAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIACBLkugCtHbZeeOjkMAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQ8AggelkIEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAS6OAFEbxefQLoPAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQADRyxqAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEINDFCSB6u\/gE0n0IQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAohe1gAEIAABCEAAAhCAQJci0NLSYrNnz7a+fft2qX7TWQhAAAIQgAAEIAABCHQkAURvR9KlbQhAAAIQgAAE2kXgq6++su+++85WWGEF6927d+q2pk+fbp999pkttdRStuiii6Y6vq2tzSZNmmRffvmld9wyyyxjSyyxhGUymVTttLdydxhDexloHfz973+3cePG2UcffWQffPCB16TWxGqrrWYrrriiDRs2zH75y19aTU1N6tN9++23uWN69uxpDQ0NqdtY2Ae0ZwyNjY328ccfe+PWOq+qqko1HF0rus6am5tt8ODBJc1Be6911w5\/8skn9vzzz4eqr7zyyrbhhhsWbeJf\/\/qXjR8\/PlRns802s+WXXz72uClTpth1110Xem3PPff03stUxPvVV1\/NvS722223neswqAcBCEAAAhCAAARiCSB6WRgQgAAEIAABCHQqAhIqd9xxh7388ss2efLkXN9WWWUVW3vtte2YY44pKm0nTpxoV199tSdRJHX8suSSS9p6661nv\/3tb23o0KFFx\/zggw\/aFVdcETreP+Dwww+3gw46yPr06ZNr4+mnn7aLL764JI5bb721HX300aFju8MYSoIROUgC8e6777bzzjvPZs2aldikpO8FF1xga6yxRmJdv4JuJKy\/\/vq5+hJ+Wn9dqZQyhjlz5thVV11l\/\/73v+3NN9\/MDVfyXDwkzXfYYYeiGG6\/\/XZ7\/PHH7T\/\/+U9ofnSdbbLJJnbooYcWlb7tvdZLmaMXXnjB9t1339ChWjcPPfRQ0ea22GKLvPcDCeOll1469rj3338\/T9zeddddubV2zz332Iknnhg6VvKXAgEIQAACEIAABNpDANHbHnocCwEIQAACEIBAWQn885\/\/9CRqsaKIOAkmidtokdjdfffdQ4I4rq0777zTNthgg9jTqO3Ro0cX7cPAgQPtgQceyEke\/f\/jjjuuJBbqr+SkX7rDGEoCETmoqanJfvOb33giMm0555xzbO+993Y6TEJfwtMvXVH0ph3DzJkz7bDDDjNJz2Ll9NNP926MREs2m\/VubEQjVqP1RowYYZdddpnV1dXltdHea91pcmMqKe2Hor+jNw4knePeU9SEbrwoejdY1llnHS\/KvFBB9JY6QxwHAQhAAAIQgEB7CCB620OPYyEAAQhAAAIQKBsBRcf9+te\/dmpPj5crAi+Yo1WPfisCMRgFXKyx+++\/Py+yNy7KrlAba665phdtKol133332QknnODU92iloOjtDmMoCULMQZdeeqldc801JTf3xBNP2I9\/\/OOCxytdgaT+ueeeG6rTlURvKWOQpN1jjz1CaQOKQT7zzDPzImCjYrnY8ZK9irAPlvZe6yUvivkHaky33HJLqBmtt5133jm2aUXinnrqqaHX4rgEKyB62ztLHA8BCEAAAhCAQCkEEL2lUOMYCEAAAhCAAATKTkDRm88991yoXT3+rfyriv5TVF2wXHLJJbbLLrvk\/vTnP\/85FBmrF5TuYaONNrK33nrLXn\/99dDxOlZt+OWLL76wTTfdNFRHj7Erb6bEsqRutA833XST\/exnP7O\/\/e1vdsopp5TEROM+44wzvGO7wxhKghA5SHM1cuTIvKYUcSmhrtQMypesnL2KSv3DH\/6QV1fpORRxGczZq7r\/\/e9\/vbzPSjkgsR4tnV30tncMb7zxhu26666hYStCXSlElOdXgjxYxFzn9HNTK+XD6quvnsdNN1mU3\/jhhx\/Oi5Z98sknc7lpdWB7r\/X2rjFFie+1116hZnSdx60jVdJTBnoPCpZiEcCq980335ieHPCL+I0aNcr69+\/v\/YnUDe2dRY6HAAQgAAEIQCCOAKKXdQEBCEAAAhCAwEInIMEUTaWw33775VIo6FHzrbbaKiTmJIGDUXm\/+MUvvI26\/KK8m0qp4Iu+I444wsaOHRsa67vvvuvJKZW4CNJg1G80D6ovgE4++WTThml6PamcdNJJIeGsNBSKBu7Xr593aHcYQxKDpNf1aL0ek49KWEl4RZL6oizYjqTbwQcfnCcYo6kHFJWp6MxixVX0KjL266+\/Nt0g0IZ92kxLUnTQoEG5+Uwaaymvt3cMZ599tv31r38NnTqYa1bXlKJVg0U3MpR3V+XRRx\/10j4Ei1I46PpUeeedd2zHHXcMvS457x9Tjms9yq21tdU+\/\/xzL4eucmevuuqqRTfU0xrTDaBg9L9u6kiCRzfzixPbymGctI6S5jZJ9GojSI1JUelpN5JMOjevQwACEIAABCDQfQkgervv3DIyCEAAAhCAQJchECeXtEFUcMOzuMen\/ai6uMek\/WhbH8L\/\/vc\/L2oxWBTB5+90v\/HGG4fkosShxGywKApUAsYvK620kuk4lxI3RkUJDh482Du8O4zBhUNSnTgOknAvvvhiKFVHtJ249BkSr1ojfmmvJPXbUYTrWWedFbqxEOyPoltdNv1LYhH3envG0Nzc7G1oGMxPe8ghh4Q2BZM0lewOSlBtXubLXwlbyV6\/KIWJbqgEizYX1IaGftENDUX1qrT3Wg+eRzdXlI85eC7\/dQlSbaCmzROD7yP+63HCWxHgyr0bLHGbt\/3+97\/30l8UK9pYbaeddgpVkWD3248TvR9++KGX01hR0cGnB7SOFYGsze2qq6tzbWrDvODNLY05OBd+PuJgJ\/R+F8wJrptokt7Boojr448\/vpTlyTEQgAAEIAABCCxkAojehTwBnB4CEIAABCAAAfMex5eo80tQDPl\/k\/iN5tD0ZW6c5Hv55ZdtscUWy7UpgSUxGyy+5IqLMrz33nu9TZvKUeLkZTT1RHcYQzlYSbZFBfuxxx5rRx55ZNHmJTGVRiMaCRyM2tbNgpdeeinUjkRwUGomRfRq3q699lqnoRbb9M+pgZhK7RnDp59+aptvvnmoVeVB3nbbbUN\/O\/DAA3NiVi8EZa4ie4O8lFd7zJgxoeNvuOEGO++880J\/U\/oURT2391r3G3366aftqKOOyovijiJTWgpdy8stt1zopVdffdV+9atfhf6m9o455pjQ3yR1\/\/KXv4T+Fn1viZvLUnL0KqI\/mjoj2LbEtUSwL66jLFVXqUn83OVxfVAammCKHI1lzz33zJu\/4cOHl7pEOQ4CEIAABCAAgYVIANG7EOFzaghAAAIQgAAE5hGI5uxUROSVV14ZwqPIMwmnYPFlaTS3rSJA33777Ty8ioCTcPKLvxFaXNSexLIi69SOcsEqJ+yQIUNMKSPSCGBF1e22226h8yoNwc033xzqX3cYQznW82mnnRbKbao2Fc271FJLJTavCO3LL788VE9zqEf5CxWJSqUu8Esx0fvUU0\/ZAQcckNgPv4LWoURyXESpcyMOFV3HEJefN27TuqjM9iOj29ravJzZwRIX3Rq32dqzzz5ryy67bLuvdZ07Lp92MUy6caTNG\/00LaobF7msnN7R9C5KIxKMro27duPOXYrodZhqL7LX30BQkcyKng6W2267LfeUQaFNIl977TUbMGCAd1hcXnC952ntUiAAAQhAAAIQ6HoEEL1db87oMQQgAAEIQKDbERgxYoR98MEHuXHts88+3qPx0eKnOfD\/rvy42igpGnUXFxGsY6JCWVFrij6MEyKSykEpHOyLZJ8eba6vr0+ci+uvv97OP\/\/8UD09+r7yyiuH\/tYdxpAIw6FCdC3okPHjx+c2AyvWxD\/+8Y+8iMy4iNVgG66SVMdEN+VStKjWqUSy0iH86U9\/8m4OBItE2pZbbukw8tKruI5BqUI0hmCJi06Nk39KEaBc1NGbHHF844SyrrG11lrL2nutq+9x+bZ1LSviVTeEdM0Fo451jG4c6QZSsCjqWNd\/sAQ3WVPOX7UZLBdddJF34yaptEf0KgWDnkbQpnFx5ZlnnvEilOOeRPjd737npXhQUVoLPfUQLbrJ5G88GWXpvycmjY\/XIQABCEAAAhDonAQQvZ1zXugVBCAAAQhAoKIIRB8Hj8uPKyA\/+clPQo9q+\/WOO+64UG7KuLyhOj4qNbRhmyL9JD7ixHKxSZCwuvrqq4vOU5yIKSSxu8MYyrFoozK\/kLSPO1fc4\/jiqnkvVFwlqY6P9i26BpqamrwcrMEcuLopoLy6HVlcx6BN1U455ZRQV4KP+vsvxOXRVT3lxI1Ka4nS6GP+cZJT6Q+UNqK913pc25oHRXNXVVV5Q5gyZYqtu+66oXEqMje6Cd3rr79uI0eODNXTpox+ihhFx55xxhmh13VM3IaA0fktVfQGN4CUtFYu4Pfeey\/UfHCjyuhTCpofiXoVjUNPJkRLMBVKdD6Uu3jUqFEduVxpGwIQgAAEIACBDiSA6O1AuDQNAQhAAAIQgIAbgahAK5STNSol\/NQL0Ujd9ddf35TLNLine truncated
%---
%[output:6c799ef9]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQncVmP+\/68oNJQkS9n\/Ik2hxKjs2UnWGIwlwthLxr4NIoxk32WZkX0nuywl+5CoKRoaIrsYW\/i\/3pffdc91n+ec+z7Pfc5zeu5zPt\/Xy0vPfa71c13nWd7nez5Xi19\/\/fVXo5ACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIgbpVoIVAb92unQYuBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUsAoI9GojSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBepcAYHeOl9ADV8KSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkg0Ks9IAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFKhzBQR663wBNXwpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAQK\/2gBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUqDOFRDorfMF1PClgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACAr3aA1JACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSIE6V0Cgt84XUMOXAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKCPRqD0gBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAXqXAGB3jpfQA1fCkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpINCrPSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSocwUEeut8ATV8KSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgECv9oAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlKgzhUQ6K3zBdTwpYAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAgK92gNSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkiBOldAoLfOF1DDlwJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACgj0ag9IASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAF6lwBgd46X0ANXwpIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSDQqz0gBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUqHMFBHrrfAE1fCkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIBAr\/aAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSoM4VEOit8wXU8KWAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAICvdoDUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIgTpXQKC3zhdQw5cCUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQAoI9GoPSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBepcAYHeOl9ADV8KSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkg0Ks9IAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFKhzBQR663wBNXwpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAQK\/2gBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUqDOFRDorfMF1PClgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACAr3aA1JACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSIE6V0Cgt84XUMOXAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKCPRqD0gBKSAFpIAUmMcKfPfdd6Z169bzeBTqXgpIASkgBaSAFJACUkAKSAEpIAXqWQGB3npePY1dCkgBKVAgBd5\/\/30zbty4qjNeZJFFzHLLLWeWXXZZs\/TSS5sWLVqE1nnllVfM5MmTq7YXVWCLLbaw7Tc2fvzxR3PbbbeZiRMnmnfffddMmTLFNrHwwgub1VZbzayyyipmjz32MN27d29s0yovBaSAFJACUkAKSAEpIAWkgBSQAgVWQKC3wIuvqUsBKSAF6kmBxx9\/3Bx44IGNGnKvXr3MCSecYHr27Nmg3t\/+9jdz2WWXNao9v\/Ctt95q1llnnUbVf\/TRR82ZZ55p\/vOf\/1Stt80225hjjz3WQus8x5w5c8ynn35amiLAe8kll8zzlDU3KSAFpIAUkAJSQApIASkgBaRAkygg0NsksqpRKSAFpIAUSFuBWkCvG8Opp55q9tlnn7IhZQ16n3zySTN48OBGyUJW8v33328WXXTRRtWrp8JHHnmknaOLbbfd1lx88cX1NAWNVQpIASkgBaSAFJACUkAKSAEp0CwUEOhtFsugQUgBKSAFpEA1BZKAXtp++OGHzaqrrlrqJkvQ+9FHH5nNN9\/cfPvtt9Wm2eD6+uuvb6677jrTsmXLRtethwqHHXaYeeihhwR662GxNEYpIAWkgBSQAlJACkgBKSAFmrUCAr3Nenk0OCkgBaSAFHAKhIHeTTfd1HTp0qUkEkD1kUceCQWqW221VZlVQxjo3WmnncyCCy4YS3Syc1daaaVYZW+88UZz2mmnlZUF4O6www7mD3\/4g2nXrp15++23zXPPPReazXr33XebNddcM1Zf9VZIoLfeVkzjlQJSQApIASkgBaSAFJACUqC5KiDQ21xXRuOSAlJACkiBMgXCQO\/IkSMtLPXj559\/Nk899VQDP18OTpswYUKpaBjoffHFF02HDh1SV\/6ggw4yjz32WKndlVde2Tz44INmgQUWaNAX3r\/HH3982edA4r333rvquH799Vfz8ccfm5kzZxoOpeNgt8ZkAuOXO336dPPZZ5+Zzp07mxVWWCHyMLuowXzzzTe2Df7fsWNHe2AdvrtRkRT0fvLJJ4aD+ubOnWvWXXfdBt2gCWXee+8988MPP1j\/X8bUtm3bqnqqgBSQAlJACkgBKSAFpIAUkAJSoJ4UEOitp9XSWKWAFJACBVYgLuh1Eh1wwAHmiSeeKFNs8uTJpnXr1vazLEEvmcczZswojWW77bYzF154Yehqfvfdd6Zbt25l14DZQG0XHNQGzHVx7rnnWoB5xhlnmDfeeKOs7oYbbmg\/r3SoG9YJI0aMaHBIHICWjONBgwYZMpCj4pdffjGjR482N9xwQ+hBcxtssIFhPdZbb70SOAbwcijdO++8U5aBTZ+AcOL888+3\/8a64oILLih1j4\/viSeeaIYPH25uu+02+znlfJj+wQcf2Czq4B5wjTAfMriDDwoKfItp6lJACkgBKSAFpIAUkAJSQArUuQICvXW+gBq+FJACUqAoCjQW9J5yyinm73\/\/e5k848aNM8svv7z9LEvQu\/\/++9ssYxfAzDFjxpju3buHLh8Zqj\/99FPp2mKLLWbat29f+hp4CyR18ac\/\/anBXIMNX3rppWbrrbcu+\/jrr782J598ctlhaFH76dBDDzXDhg1rcHn27NnmL3\/5i3n22WerbkUOXuM\/IjiHsMr33Xef1Si4VoDuzz\/\/3EycOLFUzQe9Y8eONcccc0wsT2TW5oQTTmh05nLVyaqAFJACUkAKSAEpIAWkgBSQAlIgYwUEejMWXN1JASkgBaRAbQo0FvRidYDnrR+AQTJfiTDQS0ZqnFf6sTWoZEcQnOGoUaPMRRdd1GDiwM5+\/fqZ3r17W6uE+eabL5Y4cSBpWEPjx4+3dgou\/vrXv9os3LhBhu2OO+5YVnyPPfYoA67V2rrqqqvMZpttlgj0hvXhQC8+zX379q02jLLr11xzjV0HhRSQAlJACkgBKSAFpIAUkAJSoJ4VEOit59XT2KWAFJACBVIgLujFhxUrgmD2KWAWW4MWLVpY1cJAb1w5L7vsMsPhbnEDwAwQrRSMD4sDfGaxS+jatWtk8Uqgd5NNNjGzZs0yU6ZMaVAfqwLmTXD4GxYIfjCGAw880MJw\/Izvv\/\/+suvLLrusefrpp0sakqVMRmwwGN9qq61mnnnmmQbjWGeddQw+xLRNRjGZzW+99VapCfrA03j++ec322+\/vbXaiLNWDvRecsklZTYXNLz55pvbbOZvv\/3WPP\/883Z\/+HH44YeboUOHxl1OlZMCUkAKSAEpIAWkgBSQAlJACjRLBQR6m+WyaFBSQApIASkQVCAM9Pbq1cusvfbapaIffvhhpA1B0Bc3DjyMWoXGgl7aCQOQlVaZuR188MFm4403bpDpGwZ6sTPAx9cd8AbMxAc3GC+88IJZYokl7LUg8OSAOB8wn3POOebKK68sa+LOO+80PXv2tJ\/RZxAo+9mxQHdsJV555ZWyNiZNmlTKiI5zGFvUWgFwgdXYcQCpOXwuePAdwNmfJ4e2oR+Zvy6A49dee61uOikgBaSAFJACUkAKSAEpIAWkQF0rINBb18unwUsBKSAFiqNAGOhtzOzx6\/Vf6c8a9P76668Gn1zAKZmlcQNbB+wVWrVqVaoSBL2LL764efLJJ02bNm3KmuXAMjJm\/XCgFi182Ek\/N998c1lZvIIBzX5gicEhZ2GHxgFdL7744rLyZO46X153wYfFtYLeXXfd1Zx11lkNIDhewe+9915pDBxs58A0kPe1114z++23X9kahM097vqonBSQAlJACkgBKSAFpIAUkAJSoLkoINDbXFZC45ACUkAKSIGKCiQBvf4hYK6TMNC75pprmgUXXLDqShx11FHWXqGWmDNnjmEuHAwHnI0DfQcNGmQPTXMRBL077LBDA7sCypJJO3DgwLJhXnjhhWaLine truncated
%---
%[output:644d063f]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQm8VtP+\/1cUQkllyvwXSUmJqzJnuIYkQ1zcEOGaS655uohMyTzLcK\/MZMosQ8l8SdQVXbpEkiGuoeT\/ei93Pb\/17LP38+zz7H2ezrP35\/t69arz7DW+19rndD77uz+ryW+\/\/fabUYiACIiACIiACIiACIiACIiACIiACIiACIiACIiACNQsgSYSemt27TRwERABERABERABERABERABERABERABERABERABEbAEJPRqI4iACIiACIiACIiACIiACIiACIiACIiACIiACIhAjROQ0FvjC6jhi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiICEXu0BERABERABERABERABERABERABERABERABERABEahxAhJ6a3wBNXwREAEREAEREAEREAEREAEREAEREAEREAEREAERkNCrPSACIiACIiACIiACIiACIiACIiACIiACIiACIiACNU5AQm+NL6CGLwIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISerUHREAEREAEREAEREAEREAEREAEREAEREAEREAERKDGCUjorfEF1PBFQAREQAREQAREQAREQAREQAREQAREQAREQAREQEKv9oAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAI1DgBCb01voAavgiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhI6NUeEAEREAEREAEREAEREAEREAEREAEREAEREAEREIEaJyCht8YXUMMXAREQAREQAREQAREQAREQAREQAREQAREQAREQAQm92gMiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiUOMEJPTW+AJq+CIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgoVd7QAREQAREQAREQAREQAREQAREQAREQAREQAREQARqnICE3hpfQA1fBERABERABERABERABERABERABERABERABERABCT0ag+IgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQI0TkNBb4wuo4YuACIiACIiACIiACIiACIiACIiACIiACIiACIiAhF7tAREQAREQAREQAREQAREQAREQAREQAREQAREQARGocQISemt8ATV8ERABERABERABERABERABERABERABERABERABEZDQqz0gAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAjVOQEJvjS+ghi8CIiACIiACIiACIiACIiACIiACIiACIiACIiACEnq1B0RABERABERABERABERABERABERABERABERABESgxglI6K3xBdTwRUAEREAEREAEREAEREAEREAEREAEREAEREAEREBCr\/aACIiACIiACIiACIiACIiACIiACIiACIiACIiACNQ4AQm9Nb6AGr4IiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISOjVHhABERABERABERABERABERABERABERABERABERCBGicgobfGF1DDFwEREAEREAEREAEREAEREAEREAEREAEREAEREAEJvdoDIiACIiACIiACIiACIiACIiACIiACIiACIiACIlDjBCT01vgCavgiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIKFXe0AEREAEREAEREAEREAEREAEREAEREAEREAEREAEapyAhN4aX0ANXwREQAREQAREQAREQAREQAREQAREQAREQAREQAQk9GoPiIAIiIAIiMBCJvDjjz+a5s2bL+RRqHsREAEREAEREAEREAEREAEREIFaJiCht5ZXT2MXAREQgRwR+OSTT8y4cePKznjppZc2q666qllllVXMiiuuaJo0aRJa54033jCTJ08u215Uge233962X9\/45ZdfzN13320mTpxoPvroIzNlyhTbxFJLLWXWXXdds\/baa5t9993XdO7cub5Nq7wIiIAIiIAIiIAIiIAIiIAIiECOCUjozfHia+oiIAIiUEsEnn76aXPooYfWa8jdu3c3p5xyiunWrVudehdffLG5+uqr69WeX\/iuu+4yG2+8cb3qP\/nkk+bcc881\/\/nPf8rW22mnncyJJ55oRessx9y5c83s2bMLU0TwXn755bM8Zc1NBERABERABERABERABERABBqEgITeBsGqRkVABERABNImUInQ68Zw5plnmgMOOKBoSNUWep999lkzaNCgemEhK\/nhhx82yyyzTL3q1VLhY4891s7Rxc4772yuuOKKWpqCxioCIiACIiACIiACIiACIiACjYKAhN5GsQwahAiIgAiIQDkCSYRe2n788cfNOuusU+immkLv559\/brbbbjvzww8\/lJtmneubbbaZufnmm03Tpk3rXbcWKhx11FHmsccek9BbC4ulMYqACIiACIiACIiACIiACDRqAhJ6G\/XyaHAiIAIiIAKOQJjQu80225gOHToUICGoPvHEE6GC6g477FBk1RAm9O6+++5m8cUXjwWd7Nw111wzVtnbbrvNnHXWWUVlEXD79etn\/vCHP5hWrVqZ999\/37z00kuh2awPPPCA2WCDDWL1VWuFJPTW2oppvCIgAiIgAiIgAiIgAiIgAo2VgITexroyGpcIiIAIiEARgTChd8SIEVYs9ePXX381zz33XB0\/Xw5OmzBhQqFomND76quvmrZt26ZO\/rDDDjNPPfVUod211lrLPProo2axxRar0xfevyeffHLR54jE+++\/f9lx\/fbbb+aLL74wM2bMMBxKx8Fu9ckExi932rRp5quvvjLt27c3q6++euRhdlGD+f77720b\/L3SSivZA+vw3Y2KpELvl19+aTiob\/78+WaTTTap0w1MKPPxxx+bn3\/+2fr\/MqaWLVuW5akCIiACIiACIiACIiACIiACIlBLBCT01tJqaawiIAIikGMCcYVeh+iQQw4xzzzzTBGxyZMnm+bNm9vPqin0knk8ffr0wlh22WUXc9lll4Wu5o8\/\/mg6depUdA0xG1HbBQe1Iea6uPDCC62Aec4555h33nmnqO4WW2xhPy91qBvWCcOHD69zSBwCLRnHAwcONGQgR8WCBQvMqFGjzK233hp60Nzmm29uWI9NN920IBwj8HIo3YcffliUgU2fCOHEJZdcYv+NdcWll15a6B4f31NPPdUMGzbM3H333fZzyvli+qeffmqzqIN7wDXCfMjgDj4oyPEtpqmLgAiIgAiIgAiIgAiIgAjUOAEJvTW+gBq+CIiACOSFQH2F3jPOOMP8\/e9\/L8Izbtw4s9pqq9nPqin0HnzwwTbL2AVi5ujRo03nzp1Dl48M1Xnz5hWuLbvssqZ169aFrxFvEUld\/PnPf64z12DDV111ldlxxx2LPv7uu+\/M6aefXnQYWtR+OvLII83QoUPrXJ41a5b561\/\/al588cWyW5GD1\/hDBOcQVvmhhx6yjIJrhdA9Z84cM3HixEI1X+gdO3asOeGEE2J5IrM2p5xySr0zl8tOVgVEQAREQAREQAREQAREQAREoMoEJPRWGbi6EwEREAERqIxAfYVerA7wvPUDYZDMVyJM6CUjNc4r\/dgalLIjCM5w5MiR5vLLL68zccTO3r17mx49elirhEUWWSQWnDgiaVhD48ePt3YKLv72t7\/ZLNy4QYbtbrvtVlR83333LRJcy7V1\/fXXm2233TaR0BvWhxN68Wnu1atXuWEUXb\/xxhvtOihEQAREQAREQAREQAREQAREoJYJSOit5dXT2EVABEQgRwTiCr34sGJFEMw+RZjF1qBJkyaWWpjQGxfn1VdfbTjcLW4gMCOIlgrGh8UBPrPYJXTs2DGyeCmhd+uttzYzZ840U6ZMqVMfqwLmTXD4GxYIfjCGQw891Irh+Bk\/\/PDDRddXWWUV8\/zzzxcYkqVMRmwwGN+6665rXnjhhTrj2HjjjQ0+xLRNRjGZze+9916hCfrA03jRRRc1u+66q7XaiLNWTui98sori2wuaHi77baz2cw\/\/PCDefnll+3+8OPoo482Q4YMibucKicCIiACIiACIiACIiACIiACjZKAhN5GuSwalAiIgAiIQJBAmNDbvXt3s9FGGxWKfvbZZ5E2BEFf3DjiYdQq1FfopZ0wAbLUKjO3ww8\/3Gy11VZ1Mn3DhF7sDPDxdQe8IWbigxuMV155xSy33HL2WlDw5IA4X2C+4IILzHXXXVfUxH333We6detmP6PPoKDsZ8ciumMr8cYbbxS1MWnSpEJGdJzD2KLWCgEXsRo7DkRqDp8LHnyH4OzPk0Pb4EfmrwvE8Ztuukk3nQiIgAiIgAiIgAiIgAiIgAjUNAEJvTW9fBq8CIiACOSHQJjQW5\/Z49frv9JfbaH3t99+M\/jkIpySWRo3sHXAXqFZs2aFKkGht02bNubZZ581LVq0KGqWA8vImPXDCbWw8MVO+rnjjjuKyuIVjNDsB5YYHHIWdmgcousVV1xRVJ7MXefL6y74YnGlQu9ee+1lzjvvvDoiOF7BH3\/8cWEMHGznhGlE3rfeesscdNBBRWsQNve466NyIiACIiACIiACIiACIiACItBYCEjobSwroXGIgAiIgAiUJJBE6PUPAXOdhAm9G2ywgVl88cXLrsRxxx1n7RUqiblz5xrmwsFwiLNxRN+BAwfaQ9NcBIXefv361bEroCyZtP379y8a5mWXXWa23377OtYQiMXYKgTj8ccfL\/qoS5cu5sEHHzQfffSR9dr147TTTrMian2iUqEXQXfllVcu2RX2FFhNTJs2zYq\/wcxiV1lCb31WTGVFQAREQAREQAREQAREQAQaKwEJvY11ZLine truncated
%---
%[output:1cf215b8]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} {'27-Feb-2022 19:46:48'} 50 \n\n","truncated":false}}
%---
%[output:22c700e4]
% data: {"dataType":"text","outputData":{"text":"Fitting row 1685 of DataTable...\nValidating FitParameter structure...\n Number of peaks detected: 1\n Checking core parameters (required for all modes)...\n Checking mode-specific parameters for mode 'unconstrained'...\n Checking background model parameters for 'linear'...\n✓ FitParameter validation successful for 1 peak(s) in 'unconstrained' mode with 'linear' background.\n\n","truncated":false}}
% data: {"dataType":"text","outputData":{"text":"Validating FitParameter structure...\n Number of peaks detected: 1\n Checking core parameters (required for all modes)...\n Checking mode-specific parameters for mode 'unconstrained'...\n Checking background model parameters for 'linear'...\n✓ FitParameter validation successful for 1 peak(s) in 'unconstrained' mode with 'linear' background.\n\n","truncated":false}}
%---
%[output:3b9a689c]
% data: {"dataType":"warning","outputData":{"text":"Warning: Data sizes do not match. Converting all data to column vectors."}}
%---
%[output:712f3db2]
% data: {"dataType":"text","outputData":{"text":"\nGlobalSearch stopped because it analyzed all the trial points.\n\nAll 37 local solver runs converged with a positive local solver exit flag.\n <strong>name<\/strong> <strong>peakPosition<\/strong> <strong>peakArea<\/strong> <strong>peakFWHM<\/strong> \n <strong>_________________________<\/strong> <strong>_________________________________________<\/strong> <strong>__________________________________________________________________<\/strong> <strong>______________________________________________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} 363.6 NaN NaN NaN NaN 5.8028e+05 NaN NaN NaN NaN 1.9598 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakBackground<\/strong> \n <strong>_________________________<\/strong> <strong>__________________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} -34.061 17280\n\n <strong>name<\/strong> <strong>peakEta<\/strong>\n <strong>_________________________<\/strong> <strong>_______<\/strong>\n\n {'0035035_O1s_900eV.ibw'} NaN \n\n <strong>name<\/strong> <strong>peakShirleyK<\/strong>\n <strong>_________________________<\/strong> <strong>____________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} NaN \n\nFound 1 valid peaks (non-NaN)\n","truncated":false}}
% data: {"dataType":"text","outputData":{"text":"\nGlobalSearch stopped because it analyzed all the trial points.\n\n29 out of 30 local solver runs converged with a positive local solver exit flag.\n <strong>name<\/strong> <strong>peakPosition<\/strong> \n <strong>_________________________<\/strong> <strong>_________________________________________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} 363.6 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakArea<\/strong> \n <strong>_________________________<\/strong> <strong>__________________________________________________________________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} 5.8028e+05 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakFWHM<\/strong> \n <strong>_________________________<\/strong> <strong>______________________________________________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} 1.9598 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakBackground<\/strong> \n <strong>_________________________<\/strong> <strong>__________________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} -34.088 17290\n\nFound 1 valid peaks (non-NaN)\n","truncated":false}}
%---
%[output:8f9f23b4]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} {'28-Feb-2022 12:15:48'} 50 \n\n","truncated":false}}
%[output:7541066b]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABGAAAAKiCAYAAACZ\/qosAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQe4FsX59h8UUT5iQWLUIBawYNcQBQVRo8beGzZs2EEsRFFUsCtiQcVesAQLBg0odo2CRiX8ETWChRIbaiDYiBFBv+vekzmZd86WmW1nd997ritX8LyzM8\/8ZnZ35t5nnmnx888\/\/yxMJEACJEACJEACJEACJEACJEACJEACJEACmRFoQQEmM7YsmARIgARIgARIgARIgARIgARIgARIgAQ8AhRgOBBIgARIgARIgARIgARIgARIgARIgARIIGMCFGAyBsziSYAESIAESIAESIAESIAESIAESIAESIACDMcACZAACZAACZAACZAACZAACZAACZAACWRMgAJMxoBZPAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlQgOEYIAESIAESIAESIAESIAESIAESIAESIIGMCVCAyRgwiycBEiABEiABEiABEiABEiABEiABEiABCjAcAyRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQMQEKMBkDZvEkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAGGY4AESIAESIAESIAESIAESIAESIAESIAEMiZAASZjwCyeBEiABEiABEiABEiABEiABEiABEiABCjAcAyQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQMYEKMBkDJjFkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAFGI4BEiABEiABEiABEiABEiABEiABEiABEsiYAAWYjAGzeBIgARIgARIgARIgARIgARIgARIgARKgAMMxQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIZE6AAkzFgFk8CJEACJEACJEACJEACJEACJEACJEACFGA4BkiABEiABEiABEiABEiABEiABEiABEggYwIUYDIGzOJJgARIgARIgARIgARIgARIgARIgARIgAIMxwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJZEyAAkzGgFk8CZAACZAACZAACZAACZAACZAACZAACVCA4RggARIgARIgARIgARIgARIgARIgARIggYwJUIDJGDCLJwESIAESIAESIAESIAESIAESIAESIAEKMBwDJEACJEACJEACJEACJEACJEACJEACJJAxAQowGQNm8cUhMG3aNHn11VflmGOOkRYtWhTHMFpCAiRAAiRAAiRAAiRAAiRAAiRQeQIUYCrfxWwgCHzzzTeyyy67yOeffy4ffvihLLHEEgRDAiRAAiRAAiRAAiRAAiRAAiRAArkRoACTG2pW1JwE+vfvL+PGjfNMoADTnD3BukmABEiABEiABEiABEiABEigPglQgKnPfq+rVj\/66KNy5plnykEHHSQPP\/wwBZi66n02lgRIgARIgARIgARIgARIgASKQYACTDH6gVZkRGDWrFmyww47yOWXXy4LFiyQSy65hAJMRqxZLAmQAAmQAAmQAAmQAAmQAAmQQDABCjAcHYUi8N1338m+++4r6623ntx4442+ti1atEgee+wxeeSRR+Sjjz6StddeW7bcckvZa6+9ZPXVV2+8ZuHChZ7Xy8orryy33nqr3HXXXRRgCtXbNIYESIAESIAESIAESIAESIAE6ocABZj66etStHTUqFFy3nnnySabbOKJLGb66aef5KyzzpIxY8Y0+a1du3be3zt06OD9NnToUBk9erQ8\/fTTsuKKK1KAKcUIoJEkQAIkQAIkQAIkQAIkQAIkUE0CFGCq2a+latU\/\/\/lPmTlzpkyYMEFuuukmz\/YgAWb8+PHSt29fL8+gQYM8r5e5c+d6W4wmTpwoq622mrzwwgvSsmVL6dixo7Rp00Y6derk5f\/0009l3rx5XtmHHHKIHHzwwaXiRGNJgARIgARIgARIgARIgARIgATKS4ACTHn7rjKWI0YLYrXoKUiAwfakqVOnyhFHHCEXXnhh4yUQcX73u995cV7uvfde6dGjh+fxgu1KKv3tb3+T5557TgYOHChdunTx\/sdEAiRAAiRAAiRAAiRAAiRAAiRAAnkQoACTB+U6qgPeKBA+TjvtNGnVqlWTlr\/zzjvyxhtvyDHHHNP4G2K9wDMFadq0ad7vfgIMth8h3gsSthptttlmNeWfcMIJ8uyzz0rv3r1lyJAhTeqGMIO\/8xjqOhqQbCoJkAAJkAAJkAAJkAAJkAAJFIQABZiCdERVzOjVq5cnoOyyyy5y3XXX1YgwEF+w9QdeKvgN24fMhMC6iPHiJ8BgC9E222zjXfLBBx\/IkksuWXP57bff7m1F6tmzp4wcObJJ2ffff79ccMEFMmPGDGnRokVVkLMdJEACJEACJEACJEACJEACJEACJSBAAaYEnVQmE7E96PDDD\/dEFl2E0cUXCCQ333yztG7d2kmAefXVV72yV1llFcG\/zQSvmAEDBkjnzp0FsWKYSIAESIAESIAESIAESIAESIAESKAoBCjAFKUnKmSHKcIcd9xx3rYgiDJh4gsQhHnAPPjgg3LuuefKBhtsII8\/\/ngTYk8++aSccsopgQJNhRCzKSRAAiRAAiRAAiRAAiRAAiRAAiUjQAGmZB1WFnN1EUbZHCW+RAkwOFL67LPPDhRgHn30UTnzzDPpAVOWQUI7SYAESIAESIAESIAESIAESKCOCFCAqaPOzrupymNF1fvmm2\/KcsstF2pGmAcMjpfu06dPoIcLgv9ecskl3glICLjLRAIkQAIkQAIkQAIkQAIkQAIkQAJFIUABpig9UTE79Jgvqmk4bhonHi299NKBrQ0TYOBVg2OokfzEnIsuusgLvotAv5deemnFiLI5JEACJEACJEACJEACJEACJEACZSZAAabMvVdQ282Au\/BaQQwYpCgRJkyAWbhwoXTp0sWLJXPDDTfI7rvv3khg0aJFstVWW3nHWd9yyy3y+9\/\/vqB0aBYJkEAQgVdmfCXdO61AQCRAAiRAAiRAAiRAAiRQSQIUYCrZrc3XqKDTjiZPniwHHnhgpAgTJsDg4sGDB8t9990n7dq1E2xJWnbZZb0yIboMHTpU2rRpI6+88krkVqfmI8SaSaDaBFxFlCufni1XPj2rBkqPtRtEmLN3XouCTLWHC1tHAiRAAiRAAiRAAnVFgAJMXXV39o09+OCDZdKkSb6nHekizLBhw2S\/\/fZrYlCUADNnzhzZf\/\/95fPPP\/fElp122kk+++wzeeONN7yyEPsFMWCYSIAE8iMQR0TRr4HQokQXWD3xw6\/klRnzvf\/Hb2fvvGZ+jWFNJEACJEACJEACJEACJJARAQowGYGt12K\/\/PJLuemmm7zTilq3bt0Ew5QpUzwPlb59+\/oiUicZbbrppoJ\/+6XZs2fLscceK7Nm\/e+rOTxicAJSr1696hU9200CuROIK6Ko66LEFdt8uTecFZIACZAACZAACZAACZBADAIUYGJA4yXFIPDpp5\/KW2+9JWuuuaZ39HSLFi2KYRitIIE6IGArjpj51H+PO2Vzq+1F2NK054gp9ISpgzHFJpIACZAACZAACZBA1QlQgKl6D7N9JEACJJAygbgiCrYZxdlWpOr71zXbp9wSFkcCJEACJEACJEACJEAC+RGgAJMfa9ZEAiRAAqUnENcjRYkoEGHGnry5M4cVz3iRXjDO1HgBCZAACZAACZAACZBAkQhQgClSb9AWEiABEig4gb1umuJZmLeIQi+Ygg8MmkcCJEACJEACJEACJBBJgAJMJCJmIAESIIH6IxB0nDQEmO6d2sY6mQheLEhxthIpz5s419Zf77HFJEACJEACJEACJEACRSRAAaaIvVIim15\/\/XU55JBDSmQxTSUBEggi8J\/Oe8t\/Ou9V83PLue95\/73M9D8L\/v3VPnfKLyYO9f5tmxb9cj0v63c9zvpvWWNrLsXvKBO\/q3rMspEHv7vWbWsj85EACZAACZAACZBAmQnMnDmzzObXje0UYOqmq7NpqBJgHnjggWwqYKmVJzB8+HCvjf379698W4vawCufniV\/+WplzzwcDY04LSohaO4rM+Z7wXO3W+ELL9+gLj9Ij7XbNmkOykFSZQW1V5UPTxo96fXADj1N\/HC+XDp5aXny4P\/XpNgD+w2RMw\/bRbp161ZUxLSrwARee+01wXOI77ECd1LBTeN7rOAdVALz8DET8yC+x0rQWQU0Ub3HKMAUsHN8TKIAU45+KqyVSoDhDV\/YLiq8YYceeqhn46hRowpva9kMDNpGpLfD9ThpXGseIa3KwG+6cPI\/oaVB0LHZgqS2GuFalNW9U8O1+DsEHhV7Rq9TtUfVp19Xtj6jvfkT4Hssf+ZVq5Hvsar1aP7t6dixoycCd+3aNf\/KWWPpCfA9Vq4upABTrv7Kzdqvv\/5avvjiC+nQoYO0bt06sF7e8Ll1SWUr4sQ13a51ESbiHicNgePsndcUU3jB38KSbSBdJbboR1ar4L\/wmlGeNspbR305XPTLzo3eOsrGdOmytCoS4Husir2ab5v4HsuXdxVrowBTxV7Nr018j+XHOo2aKMCkQbEiZfz0009y\/fXXy7hx42TWrIatBEhrrbWWXHzxxbL11ls3aSlv+Ip0fjM2gxPXdOCbYkjQNiIlTCQ9TlpZ7SJ0QETRRZWolutHV+M6tMnvenPiauvVE1U\/f68PAnyP1Uc\/Z9lKvseypFsfZVOAqY9+zqqVfI9lRTabcinAZMO1dKUuXrxYBg0aJA8\/\/LBne5s2bWTZZZeVzz\/\/vLEtI0aMkF133bWmbbzhS9fVhTOYE9fkXWIrOOj5EG8FyfY4aVyLpLxPIIbYXttw3WzvWiWimNuYgiiYHj1+1\/lNXOMKTMl7gyWUjQDfY2XrseLZm+Q9ZrNVtHgtpkVpLine truncated
%---
%[output:969d4f09]
% data: {"dataType":"text","outputData":{"text":"Fitting row 1750 of DataTable...\nValidating FitParameter structure...\n Number of peaks detected: 1\n Checking core parameters (required for all modes)...\n Checking mode-specific parameters for mode 'unconstrained'...\n Checking background model parameters for 'linear'...\n✓ FitParameter validation successful for 1 peak(s) in 'unconstrained' mode with 'linear' background.\n\n","truncated":false}}
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} {'28-Feb-2022 12:15:48'} 50 \n\n","truncated":false}}
%---
%[output:880f99d8]
% data: {"dataType":"text","outputData":{"text":"Validating FitParameter structure...\n Number of peaks detected: 1\n Checking core parameters (required for all modes)...\n Checking mode-specific parameters for mode 'unconstrained'...\n Checking background model parameters for 'linear'...\n✓ FitParameter validation successful for 1 peak(s) in 'unconstrained' mode with 'linear' background.\n\n","truncated":false}}
%---
%[output:608e038f]
% data: {"dataType":"warning","outputData":{"text":"Warning: Data sizes do not match. Converting all data to column vectors."}}
%---
%[output:598292bc]
% data: {"dataType":"text","outputData":{"text":"\nGlobalSearch stopped because it analyzed all the trial points.\n\nAll 21 local solver runs converged with a positive local solver exit flag.\n <strong>name<\/strong> <strong>peakPosition<\/strong> <strong>peakArea<\/strong> <strong>peakFWHM<\/strong> \n <strong>_________________________<\/strong> <strong>_________________________________________<\/strong> <strong>__________________________________________________________________<\/strong> <strong>______________________________________________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} 363.2 NaN NaN NaN NaN 2.6848e+05 NaN NaN NaN NaN 2.1012 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakBackground<\/strong> \n <strong>_________________________<\/strong> <strong>________________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} 54.159 -15426\n\n <strong>name<\/strong> <strong>peakEta<\/strong>\n <strong>_________________________<\/strong> <strong>_______<\/strong>\n\n {'0056056_O1s_900eV.ibw'} NaN \n\n <strong>name<\/strong> <strong>peakShirleyK<\/strong>\n <strong>_________________________<\/strong> <strong>____________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} NaN \n\nFound 1 valid peaks (non-NaN)\n","truncated":false}}
% data: {"dataType":"text","outputData":{"text":"\nGlobalSearch stopped because it analyzed all the trial points.\n\nAll 18 local solver runs converged with a positive local solver exit flag.\n <strong>name<\/strong> <strong>peakPosition<\/strong> \n <strong>_________________________<\/strong> <strong>_________________________________________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} 363.2 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakArea<\/strong> \n <strong>_________________________<\/strong> <strong>__________________________________________________________________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} 2.6848e+05 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakFWHM<\/strong> \n <strong>_________________________<\/strong> <strong>______________________________________________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} 2.1012 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakBackground<\/strong> \n <strong>_________________________<\/strong> <strong>________________<\/strong>\n\n {'0056056_O1s_900eV.ibw'} 54.186 -15436\n\nFound 1 valid peaks (non-NaN)\n","truncated":false}}
%---
%[output:0ab41352]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} {'28-Feb-2022 12:47:15'} 50 \n\n","truncated":false}}
%[output:342429e8]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABGAAAAKiCAYAAACZ\/qosAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQnYHUPa\/guxTRBBMIIhscY+GWIkYgzGThBr7GJNJHbBDLEMEpEIQmIZsYxYRswIsceQMCFfPowlGSNiZ3wxQcS+\/K+78q+j3nq7u5buPqe7z93X5fLmdHV11e+prq66+6mnFvrxxx9\/FDxIgARIgARIgARIgARIgARIgARIgARIgARyI7AQBZjc2DJjEiABEiABEiABEiABEiABEiABEiABEpAEKMCwIZAACZAACZAACZAACZAACZAACZAACZBAzgQowOQMmNmTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAUYtgESIAESIAESIAESIAESIAESIAESIAESyJkABZicATN7EiABEiABEiABEiABEiABEiABEiABEqAAwzZAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAjkToACTM2BmTwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIUYNgGSIAESIAESIAESIAESIAESIAESIAESCBnAhRgcgbM7EmABEiABEiABEiABEiABEiABEiABEiAAgzbAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnkTIACTM6AmT0JkAAJkAAJkAAJkAAJkAAJkAAJkAAJUIBhGyABEiABEiABEiABEiABEiABEiABEiCBnAlQgMkZMLMnARIgARIgARIgARIgARIgARIgARIgAQowbAMkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkDMBCjA5A2b2JEACJEACJEACJEACJEACJEACJEACJEABhm2ABEiABEiABEiABEiABEiABEiABEiABHImQAEmZ8DMngRIgARIgARIgARIgARIgARIgARIgAQowLANkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEDOBCjA5AyY2ZMACZAACZAACZAACZAACZAACZAACZAABRi2ARIgARIgARIgARIgARIgARIgARIgARLImQAFmJwBM3sSIAESIAESIAESIAESIAESIAESIAESoADDNkACJEACJEACJEACJEACJEACJEACJEACOROgAJMzYGZPAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhRg2AZIgARIgARIgARIgARIgARIgARIgARIIGcCFGByBszsSYAESIAESIAESIAESIAESIAESIAESIACDNsACZAACZAACZAACZAACZAACZAACZAACeRMgAJMzoCZPQmQAAmQAAmQAAmQAAmQAAmQAAmQAAlQgGEbIAESIAESIAESIAESIAESIAESIAESIIGcCVCAyRkwsycBEiABEiABEiABEiABEiABEiABEiABCjBsAyRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQMwEKMDkDZvYkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAGGbYAESIAESIAESIAESIAESIAESIAESIAEciZAASZnwMyeBEiABEiABEiABEiABEiABEiABEiABCjAsA2QAAmQAAmQAAmQAAmQAAmQAAmQAAmQQM4EKMDkDJjZkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAFGLYBEiABEiABEiABEiABEiABEiABEiABEsiZAAWYnAEzexIgARIgARIgARIgARIgARIgARIgARKgAMM2QAIkQAIkQAIkQAIkQAIkQAIkQAIkQAI5E6AAkzNgZk8CJEACJEACJEACJEACJEACJEACJEACFGDYBkiABEiABEiABEiABEiABEiABEiABEggZwIUYHIGzOxJgARIgARIgARIoMwEnp71iejeedkyV4FlJwESIAESIIFCEKAAUwgzsBAkQAIkQAIkQAIkUBwCQx5+Uwx5eHaLAvVYa4EIc+aOa1KQKY6pWBISIAESIIESEaAAUyJjsagkQAIkQAIkQAIkkCcBXXiB0KJEF9xzyuufiKdnzZX\/x7kzd1wjz6IwbxIgARIgARKoHAEKMJUzKStEAiRAAiRAAiRAAv4ElPhiE1dc0\/mXgFeQAAmQAAmQQLUJUICptn1ZOxIgARIgARIggZwIVCk2ihJVJvTbzGl5Eeq++6jn6QmTU9titiRAAiRAAtUkQAGmmnZlrUiABEiABEiABHIgUMXYKKFiimLx3+Hb5kCaWZIACZAACZBA9QhQgKmeTVkjEiCBHAlU6Yt3jpiYNQlUjkBRYqPk0Qftcc3z0l73nbCZt92WO+UJesF4U+MFJEACJEACzUqAAkyzWp71JgEScCZQxS\/ezpVnQhIgAeEa88Q1nS\/SvPsgCDDdO7cPCqpLLxhfazI9CZAACZBAMxOgANPM1mfdSSBDAnl8lc2weEFZFeWLd1DheREJkEAmBBoZG6VefRC8WFxjv5hQ1fIlLkPKpLkxExIgARIggYoToABTcQPnXb1nn31WHHjggXnfhvkXlMBX6+0pvlpvjxalazPnX\/LfS8z8m1B\/F7T4icVSdVti5n2yLnGHa7oyMmCZSaDZCXy3wrri8x5nCFs\/YHJS\/cKyfz0qGKFr3+KaLqkgn\/S6USw1ZWhsn43zcQwUo6TrgyHwQhIgARIgAWcCb7zxhnNaJmwcAQowjWOf+s7z5s0TX331lejQoYM1rx9\/\/FHMmTNHLLHEEmLppZfOLL0SYMaNG2fNkwmqQ2DIw7PF3z9ZSVYI25X2WGvZWuWmvP6JeHrWXIH\/\/2bZ\/8jzScfIkSPl6YEDBxYGkKrfOV2\/Fj3Wam8tFyYg2A3Epb7WzJjAmwBEYLSfLbfc0vtaXkACU6dOFeiHot5jf5y+mAR0TtdvvEHtfOcXwX1CvfsglDWuv5vy+lzxx+mLx9ZFnX9w\/595M6rKBUV8j1WFbbPUg++xZrF0PvVU7zEKMPnwzTpXCjBZE\/XMb8qUKeLkk0+OvWq77bYTl156aYvzTz75pLjooovErFmz5O8rr7yy2GqrrcSgQYPECius0CIthJebbrpJjBgxQsyfP1+eW2+99cQOO+wgTjzxRNGmTZtU6ZUAwwfe0\/AlTu4a48A13UEHHSRp3H777YWgwt1ACmEGr0J06tRJTp67devmdR0TkwAIJL3HGhEbpRF9UFIgXTCAoA4x\/cwd12jVaFBeCEYhAXyr0gKL9h6rCtdmqgffY81k7ezryvlY9kzzzJECTJ50HfK+5ZZbxODBg2NTbrvttuLGG2+snZ80aZLo27dv7d+rrrqqePfdd+W\/u3TpIiexyyyzTO38kCFDxJgxY2r\/Xn755cXHH38s\/73ffvuJSy65RCy00ELB6fnAOxi5QknyiIVQtIErdwMpX4PlwLV8NitSiZPeY7bYKOgv4oSH0NgojeiD4gLpqjooL8eouqYpb5HaQZqyFO09lqYuvLYxBPgeawz3qtyV87FyWZICTIPtdcEFF4ixY8eKiy++WHTv3r1VabBkSC0x+vrrr0WPHj2kgAJX+9GjR0ux5b333hO9evWSv++9995i2LBhMp\/XXntN7LTTTvLvfv36iQEDBohFF11UTJ48WRx22GHy96FDh4revXsHpcdFfOAb3IDqePu8vsoWbeDaiC\/edTRjJW\/FgWslzVq3SqURYCDQ4IgKQKv6TN\/gto3qg6K8YPR+H14uZj19Rfm6GbXONyrae6zO1eftMiDA91gGEJs4C87HymV8CjANttfhhx8unnrqKfHQQw+JddZZJ7E0jz32mDjmmGNkmunTp4v27X+KTaGfe+mll0Tbtm2lqHPDDTeIjTfeWIwfP14svPDCtfzVOQg5aumHb3oKMA1uPHW+fZqvnEnu7UUbuDbii3edTVm523HgWjmT1rVCoQKMEidQ2KjlOaEeMLY+KAlO6D2RZ5SYovp91A9xrnQxKVSUr6tx63Szor3H6lRt3iZDAnyPZQizCbOiAFMuo1OAabC9ELvlww8\/FK+88opYcsklE0tz\/fXXyyVD5rIkXIT4LhtttJG8HkuWkEaJO4gNo4QbdQPEnjn00EPlP1944QXpSeObngJM\/o2nSFs75\/VVtmgD16TJj4qFAHf8KFf80C\/e+bekat+BA9dq2zfv2tkEmLjYJ0qc6N65vYyBYnqHhMZGsQkwLsuefL1uFGM9dhf6OV100YV01xhfeduuKPkX7T1WFC4shzsBvsfcWTFlawIUYMrVKijANNBeWFK0\/vrrS28VBMSdNm2aQDBbxHX55S9\/KY488sgWOxZBSLnrrrvE6aefLo4\/\/vhWJd9ll13EzJkzpUiz\/\/77y8C8EHfuvvtu0bVr1xbp586dW\/sN3jPo+H3TU4DJp\/Goga2eu1p\/j4lA984\/7TiUTwmic7VNCpLKkvRVtmgD17h66oEoMdmKEmHSfH3Ow5ZFEvDyqJ\/KkwPXPOlWP++kgWtcbBRQ0UXpKC+\/UK\/BpL7WJnxk0Qfp7yD0c2onO\/R7OBCQF0ecMFX9FtO6hkV7jzWjDcpeZ77Hym7BxpafAkxj+fvenQKMI7Fvv\/1Weqm88847Ys0115Q7CZk7CDlmVUs2e\/ZsgV2O4g4EzEWQXog0OPbdd1+59EgJLOZ18GiBZ8spp5wijjrqKLHBBhvIJEpg0dN\/\/\/33Yu2115Y\/3XnnnWLDDTf0Sr\/55pvLa9UDb9tCGEuduENJcgvRB71JWzs3atCbNCmwuaIneYYUbeAaNZEyXfPVl21YVPeECf3i7dt3JKVvtIDXCNGHA9csW1Dz5WUbuCbFRlGeJmYfkSY2StySTT0gLkSQuLgzWexIpC+vMltEo95BRW6ZRXuPFZkVyxZNgO8xtowkAmqre1sa7kpbjnZEAcawE5by3HPPPeLee+8VhxxyiAxq+\/nnn8slPNhjXR3wKLniiitEx44dgy2tB8M94ogjxB57Line truncated
%---
%[output:326c5622]
% data: {"dataType":"text","outputData":{"text":"Fitting row 1756 of DataTable...\nValidating FitParameter structure...\n Number of peaks detected: 1\n Checking core parameters (required for all modes)...\n Checking mode-specific parameters for mode 'unconstrained'...\n Checking background model parameters for 'linear'...\n✓ FitParameter validation successful for 1 peak(s) in 'unconstrained' mode with 'linear' background.\n\n","truncated":false}}
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>scientaPassEnergy_eV<\/strong>\n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>____________________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} {'28-Feb-2022 12:47:15'} 50 \n\n","truncated":false}}
%---
%[output:7f2dd5ee]
% data: {"dataType":"text","outputData":{"text":"Validating FitParameter structure...\n Number of peaks detected: 1\n Checking core parameters (required for all modes)...\n Checking mode-specific parameters for mode 'unconstrained'...\n Checking background model parameters for 'linear'...\n✓ FitParameter validation successful for 1 peak(s) in 'unconstrained' mode with 'linear' background.\n\n","truncated":false}}
%---
%[output:5bd5684a]
% data: {"dataType":"warning","outputData":{"text":"Warning: Data sizes do not match. Converting all data to column vectors."}}
%---
%[output:42116ac3]
% data: {"dataType":"text","outputData":{"text":"\nGlobalSearch stopped because it analyzed all the trial points.\n\n40 out of 41 local solver runs converged with a positive local solver exit flag.\n <strong>name<\/strong> <strong>peakPosition<\/strong> <strong>peakArea<\/strong> <strong>peakFWHM<\/strong> \n <strong>_________________________<\/strong> <strong>______________________________________________<\/strong> <strong>__________________________________________________________________<\/strong> <strong>_________________________________________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} 363.34 NaN NaN NaN NaN 2.6879e+05 NaN NaN NaN NaN 2.119 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakBackground<\/strong> \n <strong>_________________________<\/strong> <strong>________________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} 201.93 -68421\n\n <strong>name<\/strong> <strong>peakEta<\/strong>\n <strong>_________________________<\/strong> <strong>_______<\/strong>\n\n {'0060060_O1s_900eV.ibw'} NaN \n\n <strong>name<\/strong> <strong>peakShirleyK<\/strong>\n <strong>_________________________<\/strong> <strong>____________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} NaN \n\nFound 1 valid peaks (non-NaN)\n","truncated":false}}
% data: {"dataType":"text","outputData":{"text":"\nGlobalSearch stopped because it analyzed all the trial points.\n\nAll 28 local solver runs converged with a positive local solver exit flag.\n <strong>name<\/strong> <strong>peakPosition<\/strong> \n <strong>_________________________<\/strong> <strong>______________________________________________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} 363.34 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakArea<\/strong> \n <strong>_________________________<\/strong> <strong>__________________________________________________________________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} 2.6879e+05 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakFWHM<\/strong> \n <strong>_________________________<\/strong> <strong>_________________________________________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} 2.119 NaN NaN NaN NaN\n\n <strong>name<\/strong> <strong>peakBackground<\/strong> \n <strong>_________________________<\/strong> <strong>________________<\/strong>\n\n {'0060060_O1s_900eV.ibw'} 201.94 -68423\n\nFound 1 valid peaks (non-NaN)\n","truncated":false}}
%---
%[output:0e8d0cec]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>sample<\/strong> \n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>_______________<\/strong>\n\n {'0035035_C1s_900eV.ibw'} {'27-Feb-2022 19:46:48'} {'Ice with N2'}\n {'0056056_C1s_900eV.ibw'} {'28-Feb-2022 12:15:48'} {'Ice with N2'}\n {'0060060_C1s_900eV.ibw'} {'28-Feb-2022 12:47:15'} {'Ice with N2'}\n\n","truncated":false}}
%[output:31491535]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABGAAAAKiCAYAAACZ\/qosAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQn8V1P+\/09KIkWIRjKSJSFME0bJGIydJNnLkrXNLsyQNNKihCjLiDGSRuYnskcLE379aSw1RrJk+ZkI2UP\/x+s05+N87\/fee8652+fe+3mdx8ND38899yzPc+6557zu+7xPg1WrVq0SDCRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAqkRaEABJjW2TJgESIAESIAESIAESIAESIAESIAESIAEJAEKMOwIJEACJEACJEACJEACJEACJEACJEACJJAyAQowKQNm8iRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAYZ9gARIgARIgARIgARIgARIgARIgARIgARSJkABJmXATJ4ESIAESIAESIAESIAESIAESIAESIAEKMCwD5AACZAACZAACZAACZAACZAACZAACZBAygQowKQMmMmTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAUY9gESIAESIAESIAESIAESIAESIAESIAESSJkABZiUATN5EiABEiABEiABEiABEiABEiABEiABEqAAwz5AAiRAAiRAAiRAAiRAAiRAAiRAAiRAAikToACTMmAmTwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIUYNgHSIAESIAESIAESIAESIAESIAESIAESCBlAhRgUgbM5EmABEiABEiABEiABEiABEiABEiABEiAAgz7AAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmkTIACTMqAmTwJkAAJkAAJkAAJkAAJkAAJkAAJkAAJUIBhHyABEiABEiABEiABEiABEiABEiABEiCBlAlQgEkZMJMnARIgARIgARIgARIgARIgARIgARIgAQow7AMkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkDIBCjApA2byJEACJEACJEACJEACJEACJEACJEACJEABhn2ABEiABEiABEiABEiABEiABEiABEiABFImQAEmZcBMngRIgARIgARIgARIgARIgARIgARIgAQowLAPkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEDKBCjApAyYyZMACZAACZAACZAACZAACZAACZAACZAABRj2ARIgARIgARIgARIgARIgARIgARIgARJImQAFmJQBM3kSIAESIAESIAESIAESIAESIAESIAESoADDPkACJEACJEACJEACJEACJEACJEACJEACKROgAJMyYCZPAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhRg2AdIgARIgARIgARIgARIgARIgARIgARIIGUCFGBSBszkSYAESIAESIAESIAESIAESIAESIAESIACDPsACZAACZAACZAACZAACZAACZAACZAACaRMgAJMyoCZPAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlQgGEfIAESIAESIAESIAESIAESIAESIAESIIGUCVCASRkwkycBEiABEiABEiABEiABEiABEiABEiABCjDsAyRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQMgEKMCkDZvIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAGGfYAESIAESIAESIAESIAESIAESIAESIAEUiZAASZlwEyeBEiABEiABEiABEiABEiABEiABEiABCjAsA+QAAmQAAmQAAmQAAmQAAmQAAmQAAmQQMoEKMCkDJjJkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAFGPYBEiABEiABEiABEiABEiABEiABEiABEkiZAAWYlAEzeRIgARIgARIgARIggfwTeHbxZ6JLu\/XzX1CWkARIgARIoLAEKMAUtulYcBIgARIgARIgARIggTgERjz2thjx2JI6SXTdarUIc\/H+bSnIxIHLe0mABEiABOoRoADDTkECJEACJEACJEACJFBTBHThBUKLEl0AYe6bn4lnFy+X\/8e1i\/ffoqbYsLIkQAIkQALpEaAAkx5bpkwCJEACJEACJEACuSHALTarm0KJLyZxxTZebhqYBSEBEiABEsg9AQowuW8iFpAESIAESIAESIAEohHgFpu63BSP6f12sdpeBNHq0PEv0RImWvfjXSRAAiRAAh4CFGDYJUiABEiABEiABEigZAS4xaZ+g0YVUxTLT8fsXbJewuqQAAmQAAlkTYACTNbEmR8JkEBNEqDpf002OytNAlUhYLt1xjZeWcavw256SbbHg2fv4twuG5z3NK1gnKnxBhIgARIgAS8BCjDsEyRAAiSQEgGa\/qcElsmSAAkEEkhqi00Zxy8IMF3atYjkVJdWMHzoSIAESIAEkiBAASYJikyDBEiABDQCNP1ndyABEqgGgSS22JR5\/IIVi63vF2\/7KbbchlSNns08SYAESKA8BCjAlKctq1KT559\/Xhx77LFVyZuZkkAeCXzb\/nDxbfvDRJNFD4omi\/4nsIi28fJYR5aJBEggnwS+7HqRLNi6c0c6F\/Cz7reLRsv+JX7YaNvSjl+oI9ignt6AeoPf+n8\/1Zeduh50vzNw3kACJEACCRN46623Ek6RyaVBgAJMGlQzSnPFihXi22+\/FS1btjTmuGrVKrFs2TLRpEkT0axZs8TiKwFm8uTJxjQZgQT8CIwbN07+PGjQoMIDGvHYEvHMZ5uIyzp9J7pu1cJYH0zocbrGb9f\/P+lbIOkw983lVuXwyzfOvUnXw5QeRGD0n913390UlddJoB6BefPmCYxDZXiP\/Wl+YykuRBlPcO\/cNz\/LzfiVRlc9cMrXgfVT9Q8ajzEm\/mn+WuKRo9epV7QyvcfS4M40zQT4HjMzYoxgAuo9RgGmGL2EAkyV22nu3Lni3HPPDSzFPvvsI6655po612fNmiWGDRsmFi9eLH9v1aqV2GOPPcTgwYPFRhttVCcuhJc77rhDjB07Vnz11VfyWvv27cV+++0nBgwYIBo1ahQrvhJg+MBXuSMVOPvjjjtOlv6ee+4pcC2ESML0PwkAcfw2xLk3ibJHTWPLLbeUi+fddtstahK8r4YJlOk9FnWLjRq\/0A1cttgUzS9KkCNdVf+uW60vnwQ\/J72IA5Hd71pZ3mM1PAxUvep8j1W9CQpdgDK9xwrdEJaFpwBjCSqtaHfddZcYMmRIYPJ77723uP322yvXZ86cKfr27Vv5e7PNNhNLly6Vf3fo0EEuYps3b165PmLECDFx4sTK3xtuuKH45JNP5N+9evUSw4cPFw0aNIgcnw98Wj2jdtIty8S12qdrxPHbEOfePPRUTlzz0ArFLUOZ3mNhAox6zpXIAGe06t8QFmD9guDqI6VIpwMFCUZq\/AYTsPATocLG+LK8x4r7FBe\/5HyPFb8Nq1mDMr3Hqskxq7wpwGRFOiCfoUOHikmTJomrr75adOnSpV4sbBlSW4y+++470bVrVymgwNR+woQJUmx5\/\/33Rffu3eXvPXr0EKNHj5bpvPHGG+KAAw6Q\/+7Xr58YOHCgWHPNNcWcOXNEnz595O8jR44UPXv2jBQfNxXtgS\/LUZpV7raJZl+WiWuap2uY+q3tUbJ+8eLcm2hHiJEYJ64x4PHWwr3HwposSIDRLfRw\/7OLl8tklOiCf0OMwd8QYBC6tFttDWIKRbeCUWyU8OQnKJlOlirLe8zU1ryeHgG+x9JjWwspF209VgttElZHCjBV7gEnnXSSmD17tnj00UfFNttsE1qaJ598Upx++ukyzvz580WLFj\/7mNCvvfLKK6Jp06ZS1LnttttEx44dxbRp08Qaa6xRSV9dg5Cjtn64xi+KAFPUbRVV7pqZZV+WiWtU0\/\/Vi6HPpC8Y\/aurbb81LQy8DeldiOFrr+0X76jbrNLuTJy4pk243OmXaeIaZI0SZr2hb7\/RBRnV6hBmwo5uLtrpQN4x08vGK6bbjHtleY+V+0nPd+34Hst3++S9dGV6j+WddRLlowCTBMUYacB3y0cffSRee+01sfbaa4emdOutt8otQ95tSbgJ\/l123HFHeT+2LCGOEnfgG0YJNyoD+J7p3bu3\/PPll1+WljSu8fMuwBR9W0WMblWoW8sycTUJMGqSD+eY3i\/L+hdYLIAgiiAgrtoigL9xDV+u8X91DcIN\/n3x\/ltYt7v32Yhyr4ufCOuCRYzIiWtEcLxNEijTxNXPGsVr4eHX7Bi\/EDDeKB8nuM875viNFTbp562r6duxlNWPGpdxDeMsONhaCJblPZa3dqql8vA9VkutnXxdy\/QeS55O\/lKkAFPFNsGWou22205aq8Ah7osvvijgzBZ+XX71q1+JU045pc6JRRBS7rvvPnHhhReKs846q17JDzroILFo0SIp0hx99NHSMS\/EnalTp4pOnTrVib98+fLKb7CewcDvGj\/PE1fbSZNtvCp2k9JnXZaJq63vBUz2scjRhRj9CyvEF5Ogogso+oLJpbOgvHHuNZXRpSxx43LiGpdgbd9ftomr1wrGxj+VEmCCrOHCthkVzQJG9XZ9HFXbrnBN94ejhHCTSF2W91htjwTVrT3fY9XlX\/Tcy\/YeK3p7mMpfswLMypUrpdXJe++9J9q2bStPBvKeCGSCF\/f6kiVLBE45CgpwmAsnvRBpEI466ii59UgJLN77YNECy5bzzjtPnHrqqWL77beXUZTAosf\/8ccfxdZbby1\/mjJlithhhx2c4nfu3Fneqx540xHC2OqU1QklcbZkmCZZcduc99cnUJaJa5Dpv1fkUydp6EIMqMCSBSGr7UBYlKEMUSxZ8ubzgRNXjixxCJRt4qq\/A9XYEjau6FuQ\/E74UWzDThAKOh0oTrukfa\/XCsabn4tAXZb3WNrMmX4wAb7H2DvCCKij7k1xeCptMfpR6QUYbM25\/\/77xQMPPCBOPPFE6aT2yLine truncated
%---
%[output:65618880]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>sampleTemp_dC<\/strong> <strong>cellPressure_mbar<\/strong>\n <strong>_________________________<\/strong> <strong>_____________<\/strong> <strong>_________________<\/strong>\n\n {'0035035_C1s_900eV.ibw'} -22.031 1.4358 \n {'0056056_C1s_900eV.ibw'} -39.039 1.4357 \n {'0060060_C1s_900eV.ibw'} -39.003 1.4216 \n\n","truncated":false}}
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>sample<\/strong> \n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>_______________<\/strong>\n\n {'0035035_C1s_900eV.ibw'} {'27-Feb-2022 19:46:48'} {'Ice with N2'}\n {'0056056_C1s_900eV.ibw'} {'28-Feb-2022 12:15:48'} {'Ice with N2'}\n {'0060060_C1s_900eV.ibw'} {'28-Feb-2022 12:47:15'} {'Ice with N2'}\n\n","truncated":false}}
%---
%[output:9c77f960]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>sample<\/strong> \n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>_______________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} {'27-Feb-2022 19:46:48'} {'Ice with N2'}\n {'0056056_O1s_900eV.ibw'} {'28-Feb-2022 12:15:48'} {'Ice with N2'}\n {'0060060_O1s_900eV.ibw'} {'28-Feb-2022 12:47:15'} {'Ice with N2'}\n\n","truncated":false}}
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>sampleTemp_dC<\/strong> <strong>cellPressure_mbar<\/strong>\n <strong>_________________________<\/strong> <strong>_____________<\/strong> <strong>_________________<\/strong>\n\n {'0035035_C1s_900eV.ibw'} -22.031 1.4358 \n {'0056056_C1s_900eV.ibw'} -39.039 1.4357 \n {'0060060_C1s_900eV.ibw'} -39.003 1.4216 \n\n","truncated":false}}
%---
%[output:43e6e41e]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQe0FUXW\/QvFgAoqRswBRQQVRSUYB9QxIJhzwpwFcdAxo6KICph1zGFEncGsKCYMoJ9xFFEcEUYZRcERFR0z\/Nevvq\/6X7df9719w7uvu98+a7Hk3a6uOrXPucy83bt3tZg\/f\/58oxACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIgcwi0EJEb2Zrp8SFgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACFgERvWoEISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEQMYRENGb8QIqfSEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhICIXvWAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCIOMIiOjNeAGVvhAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkBEr3pACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhkHEERPRmvIBKXwgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISCiVz0gBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQyDgCInozXkClLwSEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBDRqx4QAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAIZBwBEb0ZL6DSFwJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACIjoVQ8IASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEMo6AiN6MF1DpCwEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBET0qgeEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACGUdARG\/GC6j0hYAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAiJ61QNCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAiBjCMgojfjBVT6QkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIARG96gEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBIRAxhEQ0ZvxAip9ISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgIhe9YAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkIg4wiI6M14AZW+EBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQESvekAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASGQcQRE9Ga8gEpfCAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIKJXPSAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBDIOAIiejNeQKUvBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQENGrHhACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAhkHAERvRkvoNIXAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAIiOhVDwgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIAQyjoCI3owXUOkLASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAERPSqB4SAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAIZR0BEb8YLqPSFgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACInrVA0JACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICIGMIyCiN+MFVPpCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBEb3qASEgBISAEBACdUDgxx9\/NK1atarDSlpCCAgBISAEhIAQEAJCQAgIASEgBJojAiJ6m2PVtWchIASEQEoR+PTTT8348eNLZrfEEkuYVVdd1ayyyipmxRVXNC1atIi858033zSTJ08uOV\/cgB122MHOX2788ssv5v777zevvvqqmTZtmpkyZYqdYvHFFzfrrbeeWWeddcwBBxxgOnfuXO7UGi8EhIAQEAJCQAgIASEgBISAEBACQiASARG9agwhIASEgBBIDQLPPPOMOfroo8vKp2vXrubMM880G2+8cYP7Lr\/8cnPdddeVNZ8\/+L777jObbbZZWfePGzfOXHTRRebf\/\/53yft23nlnc\/rpp1vSOs8xd+5c89VXXwVbhPBefvnl87xl7U0ICAEhIASEgBAQAkJACAgBIVB3BET01h1yLSgEhIAQEAJxCFRC9Lq5zjvvPHPooYcWTF1vove5554zRx55ZFkFRpX86KOPmiWXXLKs+7I0+JRTTrF7dLHLLruYq6++OktbUK5CQAgIASEgBISAEBACQkAICIHUIyCiN\/UlUoJCQAgIgeaDQDVELyg9+eSTZt111w0AqyfR+8UXX5jtt9\/e\/PDDD2UXbMsttzS33nqradmyZdn3ZuGGE0880TzxxBMierNQLOUoBISAEBACQkAICAEhIASEQGYRENGb2dIpcSEgBIRA\/hCIInp79+5tOnToEGwWQvWpp56KJFR33HHHAquGKKJ3jz32MIssskgi8FDnrrnmmonG3nnnneb8888vGAuBu9tuu5nNN9\/cLLXUUuaDDz4wL7\/8cqSa9cEHHzQbbbRRorWyNkhEb9YqpnyFgBAQAkJACAgBISAEhIAQyCICInqzWDXlLASEgBDIKQJRRO+IESMsWerH77\/\/bp5\/\/vkGfr4cnDZx4sRgaBTR+9prr5lll1225ggec8wx5umnnw7mXXvttc3jjz9uFl544QZr4f375z\/\/ueBzSOJDDjmkZF7z5883X375pZkxY4bhUDoOditHCYxf7tSpU81\/\/vMf0759e7P66qvHHmYXl8z3339v5+C\/7dq1swfW4bsbF9USvbNnzzYc1Pfbb7+Zbt26NVgGTBjzySefmJ9\/\/tn6\/5JTmzZtSuKpAUJACAgBISAEhIAQEAJCQAgIgbwgIKI3L5XUPoSAEBACOUAgKdHrtnrUUUeZZ599tmDnkydPNq1atbKf1ZPoRXk8ffr0IJddd93VXHnllZFV+fHHH02nTp0KrkFmQ2q74KA2yFwXw4cPtwTmhRdeaN59992Ce7feemv7ebFD3bBOGDZsWIND4iBoURz379\/foECOi3nz5pnbbrvN3HHHHZEHzW211VaGemyxxRYBcQzBy6F0H3\/8cYECmzUhwokrrrjC\/h3ripEjRwbL4+N71llnmaFDh5r777\/ffs44n0z\/7LPPrIo63ANuEvaDgjv8oCAHXxVtQQgIASEgBISAEBACQkAICAEh0AABEb1qCiEgBISAEEgNAuUSveeee665++67C\/IfP368WW211exn9SR6jzjiCKsydgGZOXr0aNO5c+dIfFGo\/vrrr8G1pZde2rRt2zb4GfIWktTFQQcd1GCv4YmvvfZas9NOOxV8\/N1335lzzjmn4DC0uIKfcMIJZtCgQQ0uz5o1y\/zpT38yL730Usle4eA1\/hDhPUTd\/Mgjj1iMwrWC6P7666\/Nq6++GtzmE71jx441gwcPTuSJTG3OPPPMspXLJTerAUJACAgBISAEhIAQEAJCQAgIgRQhIKI3RcVQKkJACAiB5o5AuUQvVgd43voBMYjylYgielGkJnmlH1uDYnYE4VqNGjXKXHXVVQ1KCNnZq1cv0717d2uVsMACCyQqcxKSNGqiCRMmWDsFF0OGDLEq3KSBwnb33XcvGH7AAQcUEK6l5vrLX\/5itttuu6qI3qg1HNGLT3PPnj1LpVFw\/eabb7Z1UAgBISAEhIAQEAJCQAgIASEgBPKKgIjevFZW+xICQkAIZBCBpEQvPqxYEYTVpxCz2Bq0aNHC7j6K6E0Ky3XXXWc43C1pQDBDiBYL8sPiAJ9Z7BI6duwYO7wY0fuHP\/zBzJw500yZMqXB\/VgVsG+Cw9+wQPCDHI4++mhLhuNn\/OijjxZcX2WVVcwLL7wQYIhKGUVsOMhvvfXWMy+++GKDPDbbbDODDzFzoyhG2fz+++8HU7AGnsYLLrig6devn7XaSFIrR\/Rec801BTYXTLz99ttbNfMPP\/xgXnnlFdsffpx00klm4MCBScupcUJACAgBISAEhIAQEAJCQAgIgcwhIKI3cyVTwkJACAiB\/CIQRfR27drVbLrppsGmP\/\/881gbgrAvbhLyMA7Ncole5okiIItVi70dd9xxZtttt22g9I0ierEzwMfXHfAGmYkPbjj+53\/+xyy33HL2Wpjw5IA4n2C+9NJLzY033lgwxZgxY8zGG29sP2PNMKHsq2Mh3bGVePPNNwvmmDRpUqCITnIYW1ytIHAhq7HjgKTm8LnwwXcQzv4+ObQN\/FD+uoAcv+WWW\/L75dHOhIAQEAJCQAgIASEgBISAEGj2CIjobfYtIACEgBAQAulBIIroLSc7\/Hr9V\/rrTfTOnz\/f4JMLcYqyNGlg64C9wkILLRTcEiZ6l1lmGfPcc8+Z1q1bF0zLgWUoZv1wRC1Y+GQn69xzzz0FY\/EKhmj2A0sMDjmLOjQO0vXqq68uGI9y1\/nyugs+WVwp0bvPPvuYiy++uAEJjlfwJ598EuTAwXaOmIbkffvtt83hhx9eUIOovSetj8YJASEgBISAEBACQkAICAEhIASygICI3ixUSTkKASEgBJoJAtUQvf4hYA6uKKJ3o402MossskhJRE899VRrr1BJzJ0717AXDoaDnE1C+vbv398emuYiTPTutttuDewKGIuSdu+99y5I88orrzQ77LBDA2sIyGJsLine truncated
%---
%[output:8d96736e]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQncVmP+\/68oNJQkS9n\/Ik2hxKjs2UnWGIwlwthLxr4NIoxk32WZkX0nuywl+5CoKRoaIrsYW\/i\/3pffdc91n+ec+z7Pfc5zeu5zPt\/Xy0vPfa71c13nWd7nez5Xi19\/\/fVXo5ACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIgbpVoIVAb92unQYuBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUsAoI9GojSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBepcAYHeOl9ADV8KSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkg0Ks9IAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFKhzBQR663wBNXwpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAQK\/2gBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUqDOFRDorfMF1PClgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACAr3aA1JACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSIE6V0Cgt84XUMOXAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKCPRqD0gBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAXqXAGB3jpfQA1fCkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpINCrPSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSocwUEeut8ATV8KSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgECv9oAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlKgzhUQ6K3zBdTwpYAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAgK92gNSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkiBOldAoLfOF1DDlwJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACgj0ag9IASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAF6lwBgd46X0ANXwpIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSDQqz0gBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUqHMFBHrrfAE1fCkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIBAr\/aAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSoM4VEOit8wXU8KWAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAICvdoDUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIgTpXQKC3zhdQw5cCUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQAoI9GoPSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBepcAYHeOl9ADV8KSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkg0Ks9IAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFKhzBQR663wBNXwpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAQK\/2gBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUqDOFRDorfMF1PClgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACAr3aA1JACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSIE6V0Cgt84XUMOXAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKCPRqD0gBKSAFpIAUmMcKfPfdd6Z169bzeBTqXgpIASkgBaSAFJACUkAKSAEpIAXqWQGB3npePY1dCkgBKVAgBd5\/\/30zbty4qjNeZJFFzHLLLWeWXXZZs\/TSS5sWLVqE1nnllVfM5MmTq7YXVWCLLbaw7Tc2fvzxR3PbbbeZiRMnmnfffddMmTLFNrHwwgub1VZbzayyyipmjz32MN27d29s0yovBaSAFJACUkAKSAEpIAWkgBSQAgVWQKC3wIuvqUsBKSAF6kmBxx9\/3Bx44IGNGnKvXr3MCSecYHr27Nmg3t\/+9jdz2WWXNao9v\/Ctt95q1llnnUbVf\/TRR82ZZ55p\/vOf\/1Stt80225hjjz3WQus8x5w5c8ynn35amiLAe8kll8zzlDU3KSAFpIAUkAJSQApIASkgBaRAkygg0NsksqpRKSAFpIAUSFuBWkCvG8Opp55q9tlnn7IhZQ16n3zySTN48OBGyUJW8v33328WXXTRRtWrp8JHHnmknaOLbbfd1lx88cX1NAWNVQpIASkgBaSAFJACUkAKSAEp0CwUEOhtFsugQUgBKSAFpEA1BZKAXtp++OGHzaqrrlrqJkvQ+9FHH5nNN9\/cfPvtt9Wm2eD6+uuvb6677jrTsmXLRtethwqHHXaYeeihhwR662GxNEYpIAWkgBSQAlJACkgBKSAFmrUCAr3Nenk0OCkgBaSAFHAKhIHeTTfd1HTp0qUkEkD1kUceCQWqW221VZlVQxjo3WmnncyCCy4YS3Syc1daaaVYZW+88UZz2mmnlZUF4O6www7mD3\/4g2nXrp15++23zXPPPReazXr33XebNddcM1Zf9VZIoLfeVkzjlQJSQApIASkgBaSAFJACUqC5KiDQ21xXRuOSAlJACkiBMgXCQO\/IkSMtLPXj559\/Nk899VQDP18OTpswYUKpaBjoffHFF02HDh1SV\/6ggw4yjz32WKndlVde2Tz44INmgQUWaNAX3r\/HH3982edA4r333rvquH799Vfz8ccfm5kzZxoOpeNgt8ZkAuOXO336dPPZZ5+Zzp07mxVWWCHyMLuowXzzzTe2Df7fsWNHe2AdvrtRkRT0fvLJJ4aD+ubOnWvWXXfdBt2gCWXee+8988MPP1j\/X8bUtm3bqnqqgBSQAlJACkgBKSAFpIAUkAJSoJ4UEOitp9XSWKWAFJACBVYgLuh1Eh1wwAHmiSeeKFNs8uTJpnXr1vazLEEvmcczZswojWW77bYzF154Yehqfvfdd6Zbt25l14DZQG0XHNQGzHVx7rnnWoB5xhlnmDfeeKOs7oYbbmg\/r3SoG9YJI0aMaHBIHICWjONBgwYZMpCj4pdffjGjR482N9xwQ+hBcxtssIFhPdZbb70SOAbwcijdO++8U5aBTZ+AcOL888+3\/8a64oILLih1j4\/viSeeaIYPH25uu+02+znlfJj+wQcf2Czq4B5wjTAfMriDDwoKfItp6lJACkgBKSAFpIAUkAJSQArUuQICvXW+gBq+FJACUqAoCjQW9J5yyinm73\/\/e5k848aNM8svv7z9LEvQu\/\/++9ssYxfAzDFjxpju3buHLh8Zqj\/99FPp2mKLLWbat29f+hp4CyR18ac\/\/anBXIMNX3rppWbrrbcu+\/jrr782J598ctlhaFH76dBDDzXDhg1rcHn27NnmL3\/5i3n22WerbkUOXuM\/IjiHsMr33Xef1Si4VoDuzz\/\/3EycOLFUzQe9Y8eONcccc0wsT2TW5oQTTmh05nLVyaqAFJACUkAKSAEpIAWkgBSQAlIgYwUEejMWXN1JASkgBaRAbQo0FvRidYDnrR+AQTJfiTDQS0ZqnFf6sTWoZEcQnOGoUaPMRRdd1GDiwM5+\/fqZ3r17W6uE+eabL5Y4cSBpWEPjx4+3dgou\/vrXv9os3LhBhu2OO+5YVnyPPfYoA67V2rrqqqvMZpttlgj0hvXhQC8+zX379q02jLLr11xzjV0HhRSQAlJACkgBKSAFpIAUkAJSoJ4VEOit59XT2KWAFJACBVIgLujFhxUrgmD2KWAWW4MWLVpY1cJAb1w5L7vsMsPhbnEDwAwQrRSMD4sDfGaxS+jatWtk8Uqgd5NNNjGzZs0yU6ZMaVAfqwLmTXD4GxYIfjCGAw880MJw\/Izvv\/\/+suvLLrusefrpp0sakqVMRmwwGN9qq61mnnnmmQbjWGeddQw+xLRNRjGZzW+99VapCfrA03j++ec322+\/vbXaiLNWDvRecsklZTYXNLz55pvbbOZvv\/3WPP\/883Z\/+HH44YeboUOHxl1OlZMCUkAKSAEpIAWkgBSQAlJACjRLBQR6m+WyaFBSQApIASkQVCAM9Pbq1cusvfbapaIffvhhpA1B0Bc3DjyMWoXGgl7aCQOQlVaZuR188MFm4403bpDpGwZ6sTPAx9cd8AbMxAc3GC+88IJZYokl7LUg8OSAOB8wn3POOebKK68sa+LOO+80PXv2tJ\/RZxAo+9mxQHdsJV555ZWyNiZNmlTKiI5zGFvUWgFwgdXYcQCpOXwuePAdwNmfJ4e2oR+Zvy6A49dee61uOikgBaSAFJACUkAKSAEpIAWkQF0rINBb18unwUsBKSAFiqNAGOhtzOzx6\/Vf6c8a9P76668Gn1zAKZmlcQNbB+wVWrVqVaoSBL2LL764efLJJ02bNm3KmuXAMjJm\/XCgFi182Ek\/N998c1lZvIIBzX5gicEhZ2GHxgFdL7744rLyZO46X153wYfFtYLeXXfd1Zx11lkNIDhewe+9915pDBxs58A0kPe1114z++23X9kahM097vqonBSQAlJACkgBKSAFpIAUkAJSoLkoINDbXFZC45ACUkAKSIGKCiQBvf4hYK6TMNC75pprmgUXXLDqShx11FHWXqGWmDNnjmEuHAwHnI0DfQcNGmQPTXMRBL077LBDA7sCypJJO3DgwLJhXnjhhWaLine truncated
%---
%[output:506ce9c9]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>lastModifiedDatestr<\/strong> <strong>sample<\/strong> \n <strong>_________________________<\/strong> <strong>________________________<\/strong> <strong>_______________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} {'27-Feb-2022 19:46:48'} {'Ice with N2'}\n {'0056056_O1s_900eV.ibw'} {'28-Feb-2022 12:15:48'} {'Ice with N2'}\n {'0060060_O1s_900eV.ibw'} {'28-Feb-2022 12:47:15'} {'Ice with N2'}\n\n","truncated":false}}
%---
%[output:5432d349]
% data: {"dataType":"text","outputData":{"text":" <strong>name<\/strong> <strong>sampleTemp_dC<\/strong> <strong>cellPressure_mbar<\/strong>\n <strong>_________________________<\/strong> <strong>_____________<\/strong> <strong>_________________<\/strong>\n\n {'0035035_O1s_900eV.ibw'} -22.031 1.4358 \n {'0056056_O1s_900eV.ibw'} -39.039 1.4357 \n {'0060060_O1s_900eV.ibw'} -39.003 1.4216 \n\n","truncated":false}}
%---
%[output:15414432]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQncTVX7\/m+hPAoPiUqKKEQkFUVlqDQhQkWS5gyFhqdJhlSUKEU08Da8Kc0kSUkZXqnQQPoZ4y0l8YTelMr\/fy3v2u86++x9zj7DPufsfa778\/Ep56y9hute+8F33\/taJfbs2bNHGFSAClABKkAFqAAVoAJUgApQASpABagAFaACVIAKUAEqEFgFShD0BjZ3nDgVoAJUgApQASpABagAFaACVIAKUAEqQAWoABWgAlRAKUDQy41ABagAFaACVIAKUAEqQAWoABWgAlSAClABKkAFqAAVCLgCBL0BTyCnTwWoABWgAlSAClABKkAFqAAVoAJUgApQASpABagAFSDo5R6gAlSAClABKkAFqAAVoAJUgApQASpABagAFaACVIAKBFwBgt6AJ5DTpwJUgApQASpABagAFaACVIAKUAEqQAWoABWgAlSAChD0cg9QASpABagAFaACVIAKUAEqQAWoABWgAlSAClABKkAFAq4AQW\/AE8jpUwEqQAWoABWgAlSAClABKkAFqAAVoAJUgApQASpABQh6uQeoABWgAlSAClABKkAFqAAVoAJUgApQASpABagAFaACAVeAoDfgCeT0qQAVoAJUgApQASpABagAFaACVIAKUAEqQAWoABWgAgS93ANUgApQASpABagAFaACVIAKUAEqQAWoABWgAlSAClCBgCtA0BvwBHL6VIAKUAEqQAWoABWgAlSAClABKkAFqAAVoAJUgApQAYJe7gEqQAWoABWgAlSAClABKkAFqAAVoAJUgApQASpABahAwBUg6A14Ajl9KkAFqAAVoAJUgApQASpABagAFaACVIAKUAEqQAWoAEEv9wAVoAJUgApQASpABagAFaACVIAKUAEqQAWoABWgAlQg4AoQ9AY8gZw+FaACVIAKUAEqQAWoABWgAlSAClABKkAFqAAVoAJUgKCXe4AKUAEqQAWoABWgAlSAClABKkAFqAAVoAJUgApQASoQcAUIegOeQE6fClABKkAFqAAVoAJUgApQASpABagAFaACVIAKUAEqQNDLPUAFqAAVoAJUgApQASpABagAFaACVIAKUAEqQAWoABUIuAIEvQFPIKdPBagAFaACVIAKUAEqQAWoABWgAlSAClABKkAFqAAVIOjlHqACVIAKUAEqQAWoABWgAlSAClABKkAFqAAVoAJUgAoEXAGC3oAnkNOnAlSAClABKkAFqAAVoAJUgApQASpABagAFaACVIAKEPRyD1ABKkAFqAAVoAJUgApQASpABagAFaACVIAKUAEqQAUCrgBBb8ATyOlTASpABagAFaACVIAKUAEqQAWoABWgAlSAClABKkAFCHq5B6gAFaACVIAKUAEqQAWoABWgAlSAClABKkAFqAAVoAIBV4CgN+AJ5PSpABWgAlSAClABKkAFqAAVoAJUgApQASpABagAFaACBL3cA1SAClABKkAFqAAVoAJUgApQASpABagAFaACVIAKUIGAK0DQG\/AEcvpUgApQASpABagAFaACVIAKUAEqQAWoABWgAlSAClABgl7uASpABagAFaACVIAKUAEqQAWoABWgAlSAClABKkAFqEDAFSDoDXgCOX0qQAWoABWgAlSAClABKkAFqAAVoAJUgApQASpABagAQS\/3ABWgAlSAClABKkAFqAAVoAJUgApQASpABagAFaACVCDgChD0BjyBnD4VoAJUgApQASpABagAFaACVIAKUAEqQAWoABWgAlSAoJd7gApQASpABagAFaACVIAKUAEqQAWoABWgAlSAClABKhBwBQh6A55ATp8KUAEqQAWoABWgAlSAClABKkAFqAAVoAJUgApQASpA0Ms9QAWoABWgAlQgzQr89ttvUlBQkOZe2R0VoAJUgApQASpABagAFaACVIAKUAF3BQh6uTuoABWgAlQgKwps2LBB5s6dG3fsAw44QKpXry6HHXaYHHzwwVKiRAnHaz777DNZvnx53P7cGpx11lmq\/0Tjjz\/+kKlTp8qiRYtk7dq1snLlStXF\/vvvL3Xr1pWjjjpKunXrJg0aNEi0a7anAlSAClABKkAFqAAVoAJUgApQASrgWQGCXs9SsSEVoAJUgAqkU4H33ntPrrnmmoS6bNKkidxxxx3SuHHjqOtGjRol48ePT6g\/s\/FLL70kJ554YkLXv\/vuuzJ8+HD597\/\/Hfe6c889V4qKihS0DnPs2LFDtmzZYi0RwLtKlSphXjLXRgWoABWgAlSAClABKkAFqAAVyAkFCHpzIg2cBBWgAlQg\/xRIBvRqlQYPHiw9e\/aMEC3ToHfOnDly1VVXJZQ4VCVPnz5dKlSokNB1QWp84403qjXqOO+88+TRRx8N0hI4VypABagAFaACVIAKUAEqQAWoQCAVIOgNZNo4aSpABahA8BVIBfRi9e+8844cffTRlhCZBL0\/\/PCDnHnmmfLrr78mnIgWLVrIpEmTpFSpUglfG4QL+vbtK2+\/\/TZBbxCSxTlSASpABagAFaACVIAKUAEqECoFCHpDlU4uhgpQASoQHAWcQG+bNm2kTp061iIAVGfNmuUIVM8+++wIqwYn0NupUyfZb7\/9PImC6tyaNWt6avvss8\/KkCFDItoC4F5wwQVy0kknSWFhoXz99dcyf\/58x2rW119\/XRo1auRprKA1IugNWsY4XypABagAFaACVIAKUAEqQAXCogBBb1gyyXVQASpABQKmgBPoHT16tIKlZvz111\/ywQcfRPn54uC0hQsXWk2dQO\/ixYulcuXKaVfm2muvldmzZ1v91qpVS2bMmCH77rtv1Fjw\/r399tsjPgckvuyyy+LOa8+ePfLjjz\/Kxo0bBYfS4WC3RCqB4Ze7evVq+fnnn6V27dpyxBFHuB5m5zaZnTt3qj7w30MOOUQdWAffXbdIFfT+9NNPgoP6\/vzzT2natGnUMNAEbb799lv5\/ffflf8v5lS+fPm4erIBFaACVIAKUAEqQAWoABWgAlQgzAoQ9IY5u1wbFaACVCCHFfAKevUSrr76ann\/\/fcjVrR8+XIpKChQn2US9KLyeN26ddZc2rVrJ4888oij2r\/99pvUr18\/4jvAbEBtHTioDTBXxwMPPKAA5j333CNffPFFxLWnnXaa+jzWoW6wThgxYkTUIXEAtKg47tWrl6AC2S3+\/vtvmTx5sjzzzDOOB82deuqpgnw0b97cAscAvDiUbs2aNREV2BgTIBzx0EMPqf+HdcWYMWOs4eHje+edd8q9994rU6dOVZ+jnQnTv\/vuO1VFbd8DuhOsBxXc9gcFOXwLcGpUgApQASpABagAFaACVIAKUIG0KkDQm1Y52RkVoAJUgAp4VSBR0Hv33XfL888\/H9H93Llz5fDDD1efZRL0XnnllarKWAdg5pQpU6RBgwaOy0eF6u7du63vKlasKJUqVbJ+D3gLSKrj0ksvjVqrveNx48bJOeecE\/Hx9u3bZdCgQRGHobnlo0+fPnLTTTdFfb1582a55ZZbZN68eXFTiYPX8AthX4PTxdOmTVMa2XMF0L1161ZZtGiRdZkJemfOnCm33nqrJ09k5OaOO+5IuHI57mLZgApQASpABagAFaACVIAKUAEqkOMKEPTmeII4PSpABahAWBVIFPTC6gCet2YADKLyFeEEelGR6uWVftgaxLIjsOfg4YcflrFjx0alBrCzdevW0qxZM2WVsM8++3hKnxdI6tTRggULlJ2CjqFDh6oqXK+BCtuOHTtGNO\/WrVsEcI3X1xNPPCFnnHFGSqDXaQwNeuHTfMopp8SbRsT3Tz31lMoDgwpQASpABagAFaACVIAKUAEqkE8KEPTmU7a5VipABahADingFfTChxVWBPbqU4BZ2BqUKFFCrcoJ9Hpd7vjx4wWHu3kNAGYA0ViB+cHiAD6zsEuoV6+ea\/NYoLdVq1ayadMmWblyZdT1sCrAuhE4\/A0WCGZgDtdcc42C4fAznj59esT3hx12mHz44YeWhqhSRkWsPTC\/unXrykcffRQ1jxNPPFHgQ4y+UVGMyuYVK1ZYXWAMeBqXLFlSOnTooKw2vORKg97HHnsswuYCHZ955pmqmvnXX3+Vf\/3rX2p\/mNGvXz8ZMGCA13SyHRWgAlSAClABKkAFqAAVoAJUIBQKEPSGIo1cBBWgAlQgeAo4gd4mTZrICSecYC3m+++\/d7UhsPvieoGHbiolCnrRjxOAjJUFrO3666+Xli1bRlX6OoFe2BnAx1cf8AaYCR9ce3z88cdy0EEHqe\/swBMHxJmAeeTIkTJx4sSILl599VVp3Lix+gxj2oGyWR0L6A5bic8++yyijy+\/\/NKqiPZyGJtbrgBwAathxwFIjcPn7AffATib68ShbdAPlb86AMeffvrp4N0UnDEVoAJUgApQASpABagAFaACVCAFBQh6UxCPl1IBKkAFqEDyCjiB3kR6g1+v+Up\/pkHvnj17BD65AKeoLPUasHWAvULp0qWtS+yg98ADD5Q5c+ZIuXLlIrrFgWWomDVDg1poYcJOjPPCCy9EtIVXMECzGbDEwCFnTofGAbo++uijEe1Ruat9efUXJixOFvR27dpV7rvvvigIDq\/gb7\/91poDDrbTYBqQd+nSpXLFFVdE5MBp7V7zw3ZUgApQASpABagAFaACVIAKUIGgKkDQG9TMcd5UgApQgYArkAroNQ8B0zI4gd5GjRrJfvvtF1epgQMHKnuFZGLHjh2CteBgOMBZL9C3V69e6tA0HXbQe8EFF0TZFaAtKmm7dOkSMc1HHnlEzjrrrChrCMBi2CrY45133on4qGHDhvLGG2\/I2rVrldeuGXfddZeCLine truncated
%---
%[output:93ebe7fc]
% data: {"dataType":"image","outputData":{"dataUri":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAABXoAAANsCAYAAADlaRC9AAAAAXNSR0IArs4c6QAAIABJREFUeF7snQfYFNX5vo8CKhqlqNh7A8GCJaioEEvQqFgi9t6lxBbFhoqigg3FEksUWyzYxQYoooIaa+wYii2WnxJALLH7v+6T\/5mcnW9md7bP7D7vdXEpu3Pa8575gHveec58v\/76669GIQWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACmVVgPoHezOZOE5cCUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApYBQR6tRGkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACGVdAoDfjCdT0pYAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAgK92gNSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkiBjCsg0JvxBGr6UkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIAYFe7QEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaRAxhUQ6M14AjV9KSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgECv9oAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlIg4woI9GY8gZq+FJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQKBXe0AKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASmQcQUEejOeQE1fCkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpINCrPSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBTIuAICvRlPoKYvBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUEOjVHpACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApkXAGB3ownUNOXAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKCPRqD0gBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAUyroBAb8YTqOlLASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFBHq1B6SAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAIZV0CgN+MJ1PSlgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACAr3aA1JACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKSIGMKyDQm\/EEavpSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBgV7tASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpEDGFRDozXgCNX0pIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAQK\/2gBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACUiDjCgj0ZjyBmr4UkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJAoFd7QApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKZBxBQR6M55ATV8KSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkg0Ks9IAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFMi4AgK9GU+gpi8FpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBQQ6NUekAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAlJACmRcAYHejCdQ05cCUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQAoI9GoPZFKBTz\/91Hz22WeRc+\/UqZNZbrnlMrkuTVoKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQAqUooBAbymqqU3dFRg0aJC54oorIucxePBgM3z48LrPUROQAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFJACtVJAoLdWSmuciirw+9\/\/3kyYMMEMHDiwRb\/bbbed2WGHHSo6njqTAlJAChSjwH\/+8x\/Ttm3bYproWikgBaSAFJACUkAKSAEpIAWkgBSQAmUpINBblnxqXC8FllpqKbPSSiuZF154oV5T0LhSQAqUqcCHH35oJk2aVLCX3\/zmN2aFFVYwyy+\/vFl66aXNfPPNF9nm5ZdfNm+99VbB\/uIu4AES\/RcbP\/zwgxkzZox5\/vnnzcyZM83UqVNtF4sssojp3LmzWWONNcw+++xjunXrVmzXul4KSAEpIAWkgBSQAlJACkgBKSAFpEBiBQR6E0ulC9OiwLfffmsByoEHHmhuvPHGtExL85ACUqBIBR5\/\/HFzxBFHFNVqww03NKeeeqrp3r17i3YXXXSRueqqq4rqz7\/4zjvvNBtvvHFR7cePH2+GDRtm\/vWvfxVs94c\/\/MFgLQO0buT46quvzKxZs4Il8vMa73SFFJACUkAKSAEpIAWkgBSQAlJAClRXAYHe6urbtL1zWBrBP+5btWqVSIfvv\/\/eHrDWvn17065du9g277zzjll77bXN\/vvvb1ZddVXz+uuvW\/C70UYbmcMOO8z+v0IKSIH0K1AK6HWrOvPMM+3DHj9qDXonTpxof+YUE1Qljx07Nu\/PuGL6S+O1xxxzjF2jC6x0Lr\/88jROVXOSAlJACkgBKSAFpIAUkAJSQAo0lAICvQ2VznQs5u233zZdu3a1k3nllVciK+\/8mU6ePNkMGTIk5xXuDTbYwPzud7+zHrwrr7xyzsIefvhhs+OOO0YuFojy5JNPmtVXXz0dYmgWUkAKxCpQDuil08cee8ysueaaQf+1BL08lNp2223NN998U3SGN998c3PDDTeY1q1bF902Cw34uf3II48EUxXozULWNEcpIAWkgBSQAlJACkgBKSAFGkEBgd5GyGLK1nDyySebESNGJAK9d9xxh9l7771jVwC4\/fvf\/26WXXbZ4JorrrjCDBo0yACDr7vuOgt6AEZAnilTpthXr2kT5+OZMrk0HSnQtApEgd6tt97arLXWWoEmANVx48ZFAlUOXvStGqJA72677WYWXHDBRBpTnbvKKqskuvbmm282Z511Vs61ANxddtnF\/Pa3v7VvJvD2AQ+yoqpZ77vvPrPeeuslGitrFwn0Zi1jmq8UkAJSQApIASkgBaSAFJACjaKAQG+jZDIF68B64dZbb815lTlfRa9f+cv0d9ppJ9O3b1\/DwUb333+\/mTBhgl0VIPfZZ581iy++uP393LlzDdYQK664Yo5Nw5w5c+wBbfhDzpgxw9o6KKSAFEivAlGg95JLLrGw1I+ff\/7ZVuqH\/Xw5OI2fDS6iQC8HNi6xxBIVF+HII48MfkbR+WqrrWZ422CBBRZoMRbev6ecckrO50DiAw44oOC8fv31V\/N\/\/\/d\/5qOPPjIcSsfBbsVUAvPzcPr06ebf\/\/63fdOBn5HFPgT7+uuvbR\/8d5lllrEH1uWzyCkX9H7xxReGg\/p++ukn06NHjxYaoQnXfPDBB4Y\/d7AIYk6LLbZYQT11gRSQAlJACkgBKSAFpIAUkAJSoJEVEOht5OzWYG3fffedOe2004LKNaCCH\/lA77777mtuu+02e\/lBBx1kRo8eHTQF7PC6L5V8xIUXXmj+\/Oc\/F1wRdg+TJk2yFb5UBiqkgBRIrwJJQa9bweGHH26eeOKJnAW99dZbpm3btvazWoJefr689957wVx4UHXZZZdFiv2f\/\/wnsLNxFwCzgdouOKgNmOviggsusADznHPOsT7kfmy55Zb283yHumGdMHz48BaHxAFoqTg++OCDDRXIcfHLL7\/Yn8k33XRT5EFzW2yxhSEfPXv2DMAxgJdD6XjQ5ltaMCYgnLj44ovt\/2NdMXLkyGB4ft7zZ8m5555rxowZYz\/nOvfAj99\/\/PHHtoo6vAdcJ6yHCu7wg4L03gGamRSQAlJACkgBKSAFpIAUkAJSoLIKCPRWVs+m643q2g4dOsSuOw70zp49O6jQXXTRRW11Vvj1av5Rj3UDse6665rXXnvN\/j8wgCqu8847L6d6DugMGAE2T506Nef176ZLjBYsBTKgQLGg94wzzrBvDfjBgx2q+4lagt5DDz3UVhm7AGbefvvtplu3bpHKU6H6448\/Bt\/xc7Njx47B74G3QFIX++23X4u1hju+8sorzfbbb5\/z8bx586znuX8YWtxWGDBggDnhhBNafP3555+bE0880TzzzDMFdxEHr\/GLCK8hqvGDDz5oNQrnCtDNnwvPP\/980MwHvY8++qg56aSTEnkik5tTTz216MrlgovVBVJACkgBKSAFpIAUkAJSQApIgZQrINCb8gRVe3q8AkuFFP9Az1cBy3VDhw41m222mfn9738fTAu4etxxx+VMc\/z48WbmzJn2szjQ6x+oduCBB5obb7wxcqkc6obFAzFt2jT76jFzBUAAVfbaa6+g3V133WX22GMPC3uBxMW83lxtndW\/FJACLRUoFvRidYDnrR+AQe55Igr0UpGa5JV+frbksyMIz\/7SSy81o0aNarEofj5ttdVWZpNNNrE\/r+aff\/5EqU8CSaM6wpccOwUX\/JxmzUmDCttdd9015\/J99tknB7gW6uvaa68122yzTVmgN2oMB3rxaebPnmLir3\/9q82DQgpIASkgBaSAFJACUkAKSAEp0EwKCPQ2U7Yj1uofnBZndwDkxTbBvWaMnYIPe8PdHn300ebqq6+2H8eBXqqtzj\/\/fHtNGNj6\/QGRASoEr+vyD3cHdPmM7\/Hwff\/994MD4PL11+Tp1vKlQKoUSAp6qeDHiiBcfQqYxdbAec5Ggd6kC+ZQNw53SxoAZoBovmB+WBzgM4tdQpcuXWIvzwd6saTBl5w3FcKBVQHrLine truncated
%---
@@ -275,7 +275,7 @@ for ii = 1
& contains(FileList.name,"Cl2p") ...
& (contains(FileList.name,"146") | contains(FileList.name,"148"));
FileList = nappBackground(FileList,647,648,'tableSelection',tmpDataSelection,'energyScale','kinetic',...
'mode','mean','showFigures','off');
'mode','mean','showFigures','on');
%% Plot again
nappPlot(FileList,tmpDataSelection,'tableVariable','spectrum_countsPerSecond','mode','AllInOne');
+22
View File
@@ -0,0 +1,22 @@
%% Start fresh
close all
clearvars
clc
%% Import Data
FileList = nappFileList('2026/testImport','mode','local','importLabView','off');
%% Display Data
disp(FileList(:,{'name','creationDate','lastModifiedDatestr','image','originalFileName'}))
%% Plot images
nappPlot(FileList);
%% Plot iterations
close all
nappPlot(FileList,'tableVariable','image','mode','iterations');
%% Generate spectra and plot
close all
FileList = nappGenerateSpectra(FileList);
nappPlot(FileList,'tableVariable','spectrum_countsPerSecond','mode','OneEach');
%% Generate spectra, remove background and plot
close all
FileList = nappGenerateSpectra(FileList);
nappPlot(FileList,'tableVariable','spectrum_countsPerSecond','mode','OneEach');
+1 -60
View File
@@ -183,66 +183,7 @@ if hasShirleyK
end
backgroundType = 'Shirley';
% if hasShirleyK
% % SHIRLEY BACKGROUND RECONSTRUCTION
% peakShirleyK_vals = fitData.peakShirleyK;
%
% % Reconstruct Shirley background using the same algorithm as in fitting
% bkgrd = zeros(size(energyRange));
%
% for i = 1:nPeaks
% iPeak = validIdx(i);
%
% % Extract parameters
% area = peakArea_vals(iPeak);
% FWHM = peakFWHM_vals(iPeak);
% pos = peakPos_vals(iPeak);
% if ismember('peakEta', fitData.Properties.VariableNames) && ~all(isnan(fitData.peakEta))
% eta = peakEta_vals(iPeak);
% else
% eta = 1;
% end
% K = peakShirleyK_vals(iPeak);
%
% % Find energy points after the peak
% idxafter = energyRange >= pos;
%
% if any(idxafter)
% % Calculate width parameters
% w = FWHM / sqrt(log(4)); % Convert FWHM to Gaussian w
% sigma = w / 2;
% gamma = FWHM / 2;
%
% % Gaussian tail fraction
% Gtail = 0.5 * (1 - erf((energyRange(idxafter) - pos) / (sqrt(2) * sigma)));
%
% % Lorentzian tail fraction
% Ltail = 0.5 - (1/pi) * atan((energyRange(idxafter) - pos) / gamma);
%
% % Pseudo-Voigt tail fraction
% tailfrac = eta * Gtail + (1 - eta) * Ltail;
%
% % Shirley contribution
% shirleycontrib = K * area * (0.5 - tailfrac);
% bkgrd(idxafter) = bkgrd(idxafter) + shirleycontrib;
%
% end
%
% end
%
% % Add constant offset C0
% if ismember('peakBackground', fitData.Properties.VariableNames)
% C0 = fitData.peakBackground(2); % Second element is C0
% bkgrd = bkgrd + C0;
% end
%
% if matches(p.Results.energyScale,'kinetic')
% % This is a little work around - needs confirmation if it does what
% % it should - be careful.
% bkgrd = flip(bkgrd);
% end
%
% backgroundType = 'Shirley';
else
% LINEAR BACKGROUND (existing code)
if ismember('peakBackground', fitData.Properties.VariableNames)
+42 -11
View File
@@ -145,17 +145,13 @@ if ~all(cell2mat(cellfun(@size,p.Results.DataTable(p.Results.tableSelection,:).(
end
% add empty table variables (if they don't exist)
existColumn = strcmp('logBackgroundRange',DataTable.Properties.VariableNames);
existColumn = strcmp('lognappBackgroundRange',DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.logBackgroundRange = NaN(size(DataTable,1),2);
DataTable.lognappBackgroundRange = NaN(size(DataTable,1),2);
end
existColumn = strcmp('logBackgroundMode',DataTable.Properties.VariableNames);
existColumn = strcmp('lognappBackgroundMode',DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.logBackgroundMode = cellstr(repmat(' ',size(p.Results.DataTable,1),1));
end
existColumn = strcmp('logBackgroundDate',DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.logBackgroundDate = cellstr(repmat(' ',size(p.Results.DataTable,1),1));
DataTable.lognappBackgroundMode = cellstr(repmat(' ',size(p.Results.DataTable,1),1));
end
% add empty variable to table
existColumn = strcmp('spectrum_countsNorm',DataTable.Properties.VariableNames);
@@ -361,8 +357,43 @@ else
DataTable(p.Results.tableSelection,:).(p.Results.tableVariable) = tmp;
end
% write log to table
DataTable.logBackgroundMode(p.Results.tableSelection,:) = cellstr(repmat(p.Results.mode,size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
DataTable.logBackgroundRange(p.Results.tableSelection,:) = repmat([p.Results.energyStart(1) p.Results.energyEnd(1)],size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
DataTable.logBackgroundDate(p.Results.tableSelection,:) = cellstr(repmat(datestr(now),size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
DataTable.lognappBackgroundMode(p.Results.tableSelection,:) = cellstr(repmat(p.Results.mode,size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
DataTable.lognappBackgroundRange(p.Results.tableSelection,:) = repmat([p.Results.energyStart(1) p.Results.energyEnd(1)],size(p.Results.DataTable(p.Results.tableSelection,:),1),1);
%--- Define variables for the Universal Logging Block ---
numRowsTable = height(DataTable);
processIdx = find(p.Results.tableSelection);
% -------------------------------------------------------------------
% 1. Dynamically get this function's name
thisFuncName = mfilename;
colDate = sprintf('log%sDate', thisFuncName);
colCaller = sprintf('log%sCaller', thisFuncName);
% 2. Probe for column existence, create empty string arrays if missing
if ~ismember(colDate, DataTable.Properties.VariableNames)
DataTable.(colDate) = repmat("", numRowsTable, 1);
end
if ~ismember(colCaller, DataTable.Properties.VariableNames)
DataTable.(colCaller) = repmat("", numRowsTable, 1);
end
% 3. Get current time as a string
currentTimeStr = string(datetime('now', 'Format', 'yyyy-MM-dd HH:mm:ss'));
% 4. Determine the calling script using the call stack
stackInfo = dbstack;
if length(stackInfo) > 1
callerScript = string(stackInfo(2).file); % The script that called this function
else
callerScript = " "; % Called directly from the command window
end
% 5. Write the log data only to the rows being processed
DataTable.(colDate)(processIdx) = currentTimeStr;
DataTable.(colCaller)(processIdx) = callerScript;
% -------------------------------------------------------------------------
end
+37 -13
View File
@@ -12,9 +12,7 @@ function DataTable = nappBindingEnergyXps(DataTable,varargin)
% *input*
% FileList: data table
% tableSelection (optional): logical array to filter data table
% tableVariable: choose to process either
% 'spectrum_counts','spectrum_countsPerSecond' (default)
%
%
%
% *output*
% new table variable bindingEnergy_eV holding the binding energy for
@@ -23,24 +21,15 @@ function DataTable = nappBindingEnergyXps(DataTable,varargin)
%
% See also nappnappAlignImages.m nappBindingEnergyXps nappFitGaussXps.m
% nappCopyShift.m nappDetermineShiftXps.m
defaultTableVariable = 'spectrum_countsPerSecond';
expectedTableVariable = {'spectrum_counts','spectrum_countsPerSecond'};
defaultTableSelection = true(size(DataTable,1),1);
% Parse input
p = inputParser;
addRequired(p,'DataTable',@istable);
addParameter(p,'tableSelection',defaultTableSelection,@islogical);
addParameter(p,'tableVariable',defaultTableVariable,...
@(x) any(validatestring(x,expectedTableVariable)));
parse(p,DataTable,varargin{:});
% check input (all elements of input variable need to have non-zero size)
if ~all(cell2mat(cellfun(@size,p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable),'UniformOutput',false)),'all')
disp('The table variable appears to be empty. I quit now')
error('The table variable appears to be empty.')
end
% add empty variable to table
existColumn = strcmp('bindingEnergy_eV',DataTable.Properties.VariableNames);
@@ -65,4 +54,39 @@ end
clearvars tmp_2
end
DataTable.bindingEnergy_eV(p.Results.tableSelection,:) = tmp_3;
% --- Define variables for the Universal Logging Block ---
numRowsTable = height(DataTable);
processIdx = find(p.Results.tableSelection);
% -------------------------------------------------------------------
% 1. Dynamically get this function's name
thisFuncName = mfilename;
colDate = sprintf('log%sDate', thisFuncName);
colCaller = sprintf('log%sCaller', thisFuncName);
% 2. Probe for column existence, create empty string arrays if missing
if ~ismember(colDate, DataTable.Properties.VariableNames)
DataTable.(colDate) = repmat("", numRowsTable, 1);
end
if ~ismember(colCaller, DataTable.Properties.VariableNames)
DataTable.(colCaller) = repmat("", numRowsTable, 1);
end
% 3. Get current time as a string
currentTimeStr = string(datetime('now', 'Format', 'yyyy-MM-dd HH:mm:ss'));
% 4. Determine the calling script using the call stack
stackInfo = dbstack;
if length(stackInfo) > 1
callerScript = string(stackInfo(2).file); % The script that called this function
else
callerScript = " "; % Called directly from the command window
end
% 5. Write the log data only to the rows being processed
DataTable.(colDate)(processIdx) = currentTimeStr;
DataTable.(colCaller)(processIdx) = callerScript;
% -------------------------------------------------------------------------
end
+91 -56
View File
@@ -1,13 +1,13 @@
function combinedSpectrum = nappCombineSpectra(DataTable,varargin)
%NAPPCOMBINESPECTRA Combine multiple PE or NEXAFS spectra through averaging or summation.
% This function combines selected photoelectron (PE) or X-ray absorption
% spectroscopy (NEXAFS) spectra into a single spectrum by averaging or
% summing. Data are automatically interpolated onto a common energy axis
% This function combines selected photoelectron (PE) or X-ray absorption
% spectroscopy (NEXAFS) spectra into a single spectrum by averaging or
% summing. Data are automatically interpolated onto a common energy axis
% to handle slight variations in energy sampling between acquisitions.
%
% The output format is controlled by the 'output' parameter:
% - 'simple' (default): Returns a numeric matrix [energy, intensity, (std)]
% suitable for quick plotting and analysis. Requires custom code for
% suitable for quick plotting and analysis. Requires custom code for
% plotting and further processing.
% - 'complete': Returns a MATLAB table (same format as input DataTable) with
% energy axis and combined spectrum plus metadata. Critically, this allows
@@ -15,7 +15,7 @@ function combinedSpectrum = nappCombineSpectra(DataTable,varargin)
% without conversion. Output table is named '<originalName>_combined.h5'
% where originalName is from the first selected row's name field. The
% mean of pass energy, sample temperature, ice temperature, pressure
% are added to the output.
% are added to the output.
%
% SYNTAX
% ------
@@ -72,12 +72,12 @@ function combinedSpectrum = nappCombineSpectra(DataTable,varargin)
%
% 'tableVariable' char vector (default: 'spectrum_counts')
% Select which spectrum type to combine. Must be one of:
%
%
% PE spectra:
% - 'spectrum_counts'
% - 'spectrum_counts'
% - 'spectrum_countsPerSecond'
% - 'spectrum_countsNorm'
%
%
% NEXAFS spectra:
% - 'nexafsSpectrum'
% - 'nexafsSpectrumPreBackground'
@@ -88,8 +88,8 @@ function combinedSpectrum = nappCombineSpectra(DataTable,varargin)
%
% 'tableRow' numeric scalar (default: 1)
% Index of the spectrum whose energy axis is used as reference for
% interpolation (index within the filtered table defined by
% 'tableSelection'). The combined spectrum's common energy grid
% interpolation (index within the filtered table defined by
% 'tableSelection'). The combined spectrum's common energy grid
% is extracted from this row. Range: 1 to number of selected rows.
%
% 'mode' char vector (default: 'sum')
@@ -113,15 +113,15 @@ function combinedSpectrum = nappCombineSpectra(DataTable,varargin)
% ----------------
% combinedSpectrum numeric matrix or table
% Combined spectroscopy data. Format depends on 'output' parameter:
%
%
% For 'simple' output (default):
% - Column 1: Energy values (eV) on common interpolated axis
% - Column 2: Combined intensity (sum or mean depending on mode)
% - Column 3: Standard deviation (only when mode = 'average')
%
%
% For 'complete' output:
% - Returns table with energy axis and spectrum(s) plus metadata columns
% (name, folder, creationDate, analysisDir, lastModifiedDatestr,
% (name, folder, creationDate, analysisDir, lastModifiedDatestr,
% lastModifiedDatenum) and is sorted by modification date
%
% NOTES
@@ -213,13 +213,13 @@ end
% vq(:,ii) = p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii};
% end
%else
xq = tmpX{p.Results.tableRow}(tmpStartIndex:tmpEndIndex);
% repeat this for all columns in input.
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
x = tmpX{ii};
v = p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii};
vq(:,ii) = interp1(x,v,xq);
end
xq = tmpX{p.Results.tableRow}(tmpStartIndex:tmpEndIndex);
% repeat this for all columns in input.
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
x = tmpX{ii};
v = p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii};
vq(:,ii) = interp1(x,v,xq);
end
% end
if contains(p.Results.output,'simple')
@@ -245,7 +245,7 @@ else
TmpFileList.spectrum_counts = sum(vq,2,'omitnan');
elseif contains(p.Results.mode,'average') && ~contains(p.Results.energyScale,'xRay')
TmpFileList.spectrum_countsPerSecond = mean(vq,2,'omitnan');
elseif contains(p.Results.mode,'average') && contains(p.Results.energyScale,'xRay')
elseif contains(p.Results.mode,'average') && contains(p.Results.energyScale,'xRay')
TmpFileList.spectrum_counts = mean(vq,2,'omitnan');
elseif contains(p.Results.mode,'subtract')
disp('Not supported yet') % FIXME: subtraction is not implemented yet.
@@ -253,9 +253,9 @@ else
% copy essential information
if contains(p.Results.energyScale,'xRay')
TmpFileList.name = [p.Results.DataTable(p.Results.tableSelection,:).name{1} '_combined.h5'];
TmpFileList.name = [p.Results.DataTable(p.Results.tableSelection,:).name{p.Results.tableRow} '_combined.h5'];
else
TmpFileList.name = [p.Results.DataTable(p.Results.tableSelection,:).name{1} '_combined.ibw'];
TmpFileList.name = [p.Results.DataTable(p.Results.tableSelection,:).name{p.Results.tableRow} '_combined.ibw'];
end
TmpFileList.folder = p.Results.DataTable(p.Results.tableSelection,:).folder(1);
TmpFileList.creationDate = p.Results.DataTable(p.Results.tableSelection,:).creationDate(1,:);
@@ -266,58 +266,91 @@ else
% add processed spectra
% Ensure all columns exist with appropriate sizing
if ~ismember('dataOrigin', p.Results.DataTable.Properties.VariableNames)
DataTable.dataOrigin = cellstr(repmat(" ",size(p.Results.DataTable,1),1));
if ~ismember('logCombineDataOriginStr', p.Results.DataTable.Properties.VariableNames)
DataTable.logCombineDataOriginStr = cellstr(repmat(" ",size(p.Results.DataTable,1),1));
end
if ~ismember('logCombineDataOrigin', p.Results.DataTable.Properties.VariableNames)
DataTable.logDataSource = cell(size(p.Results.DataTable, 1), 1);
end
tmpRow = p.Results.DataTable(p.Results.tableSelection,:);
% Store an array of the processed spectrum names wrapped in a cell
% so you can easily loop through it (e.g., for name = DataTable.logDataSource{i})
TmpFileList.logCombineDataOrigin = {string(tmpRow.name')};
allNames = "";
for ii = 1:size(tmpRow,1)
thisDateStr = datestr(tmpRow.lastModifiedDatenum(ii),'yyyymmdd_HHMM');
thisName = tmpRow.name{ii};
token = thisDateStr + "_" + thisName(1:4);
thisDateStr = datestr(tmpRow.lastModifiedDatenum(ii),'yyyymmdd_HHMM');
thisName = tmpRow.name{ii};
token = thisDateStr + "_" + thisName(1:4);
if ii == 1
allNames = token;
else
allNames = allNames + " | " + token;
if ii == 1
allNames = token;
else
allNames = allNames + " | " + token;
end
end
end
TmpFileList.dataOrigin = allNames;
TmpFileList.logCombineDataOriginStr = allNames;
if ismember('scientaPassEnergy_eV', p.Results.DataTable.Properties.VariableNames)
TmpFileList.scientaPassEnergy_eV = mean(p.Results.DataTable(p.Results.tableSelection,:).scientaPassEnergy_eV,1,'omitnan');
end
if ismember('sampleTemp_dC', p.Results.DataTable.Properties.VariableNames)
TmpFileList.sampleTemp_dC = mean(p.Results.DataTable(p.Results.tableSelection,:).sampleTemp_dC,1,'omitnan');
end
if ismember('iceTemp_dC', p.Results.DataTable.Properties.VariableNames)
TmpFileList.iceTemp_dC = mean(p.Results.DataTable(p.Results.tableSelection,:).iceTemp_dC,1,'omitnan');
end
if ismember('cellPressure_mbar', p.Results.DataTable.Properties.VariableNames)
TmpFileList.cellPressure_mbar = mean(p.Results.DataTable(p.Results.tableSelection,:).cellPressure_mbar,1,'omitnan');
end
if ismember('smplX_mm', p.Results.DataTable.Properties.VariableNames)
TmpFileList.smplX_mm = mean(p.Results.DataTable(p.Results.tableSelection,:).smplX_mm,1,'omitnan');
end
if ismember('smplY_mm', p.Results.DataTable.Properties.VariableNames)
TmpFileList.smplY_mm = mean(p.Results.DataTable(p.Results.tableSelection,:).smplY_mm,1,'omitnan');
end
if ismember('smplZ_mm', p.Results.DataTable.Properties.VariableNames)
TmpFileList.smplZ_mm = mean(p.Results.DataTable(p.Results.tableSelection,:).smplZ_mm,1,'omitnan');
end
if ismember('sealingTemp', p.Results.DataTable.Properties.VariableNames)
TmpFileList.sealingTemp = mean(p.Results.DataTable(p.Results.tableSelection,:).sealingTemp,1,'omitnan');
end
if ismember('sampleTemp_dC', p.Results.DataTable.Properties.VariableNames)
TmpFileList.sampleTemp_dC = mean(p.Results.DataTable(p.Results.tableSelection,:).sampleTemp_dC,1,'omitnan');
end
if ismember('iceTemp_dC', p.Results.DataTable.Properties.VariableNames)
TmpFileList.iceTemp_dC = mean(p.Results.DataTable(p.Results.tableSelection,:).iceTemp_dC,1,'omitnan');
end
if ismember('cellPressure_mbar', p.Results.DataTable.Properties.VariableNames)
TmpFileList.cellPressure_mbar = mean(p.Results.DataTable(p.Results.tableSelection,:).cellPressure_mbar,1,'omitnan');
end
if ismember('smplX_mm', p.Results.DataTable.Properties.VariableNames)
TmpFileList.smplX_mm = mean(p.Results.DataTable(p.Results.tableSelection,:).smplX_mm,1,'omitnan');
end
if ismember('smplY_mm', p.Results.DataTable.Properties.VariableNames)
TmpFileList.smplY_mm = mean(p.Results.DataTable(p.Results.tableSelection,:).smplY_mm,1,'omitnan');
end
if ismember('smplZ_mm', p.Results.DataTable.Properties.VariableNames)
TmpFileList.smplZ_mm = mean(p.Results.DataTable(p.Results.tableSelection,:).smplZ_mm,1,'omitnan');
end
if ismember('sealingTemp', p.Results.DataTable.Properties.VariableNames)
TmpFileList.sealingTemp = mean(p.Results.DataTable(p.Results.tableSelection,:).sealingTemp,1,'omitnan');
end
%% Sort by date
% rename date fields and delete those fields not needed
[TmpFileList.lastModifiedDatestr] = TmpFileList.date;
[TmpFileList.lastModifiedDatenum] = TmpFileList.datenum;
% -------------------------------------------------------------------------
% ADAPTED UNIVERSAL LOGGING BLOCK (For newly created rows)
% -------------------------------------------------------------------------
thisFuncName = mfilename;
colDate = sprintf('log%sDate', thisFuncName);
colCaller = sprintf('log%sCaller', thisFuncName);
% Get current time as a string
currentTimeStr = string(datetime('now', 'Format', 'yyyy-MM-dd HH:mm:ss'));
% Determine the calling script using the call stack
stackInfo = dbstack;
if length(stackInfo) > 1
callerScript = string(stackInfo(2).file); % The script that called this function
else
callerScript = " "; % Called directly from the command window
end
% Add the log data directly to the new struct
TmpFileList.(colDate) = currentTimeStr;
TmpFileList.(colCaller) = callerScript;
% -------------------------------------------------------------------------
% First, we need to convert into a table, because structures can not be sorted:
TmpFileList = struct2table(TmpFileList,'AsArray',true);
% Then, we sort the table based on the time (6th column, datenum)
TmpFileList = sortrows(TmpFileList,6);
% Then, remove un-needed columns
@@ -327,9 +360,11 @@ end
if exist("DataTable",'var')
TmpFileList = outerjoinRowToTable(TmpFileList,DataTable);
end
% Then, we sort the table based on the time (datenum)
combinedSpectrum = sortrows(TmpFileList,'lastModifiedDatenum');
end
end
+131 -217
View File
@@ -1,226 +1,140 @@
function DataTable = nappCopyShift(DataTable,varargin)
%NAPPCOPYSHIFT Copy energy shift from one XPS region to spectra of the same sequence but other regions.
% This function transfers energy shift calibration data (kinetic or binding
% energy) from a reference region to spectra of the same sequence iteration in a different
% region. It matches spectra based on filename and acquisition timestamp,
% enabling consistent energy axis calibration across XPS
% measurements of the same sequence (e.g., copying O1s shift to C1s spectra acquired simultaneously).
function DataTable = nappCopyShift(DataTable, processSelection, refSelection, options)
% NAPPCOPYSHIFT Copy binding energy shift from reference spectra to target spectra.
%
% This approach ensures that energy calibrations determined from a
% reference region (typically C1s or O1s) are consistently applied to
% other regions in the same sequence. Works with both spectral data in
% binding and in kinetic energy scale and with images - that is can be
% used to align all sweeps in one image. Multiple destination rows can
% receive the same shift value if acquired simultaneously (one-to-many
% copying).
% DataTable = NAPPCOPYSHIFT(DataTable, processSelection, refSelection)
% copies the calculated binding energy shift from a pool of reference spectra
% (where refSelection is true) to the target spectra (where processSelection
% is true) using a matching strategy.
%
% SYNTAX
% ------
% DataTable = NAPPCOPYSHIFT(DataTable)
% NOTE: This function requires that nappDetermineShift has already been
% run on the reference spectra to populate the 'bindingEnergyShift' column.
%
% DataTable = NAPPCOPYSHIFT(DataTable, tableSelection, 'Name', Value)
%
% EXAMPLES
% --------
% % Copy O1s kinetic energy shift to C1s spectra
% DataTable = nappCopyShift(DataTable, ...
% 'regionOld', 'O1s', ...
% 'regionNew', 'C1s', ...
% 'energyScale', 'kinetic');
%
% % Copy binding energy shift from N1s to Cl2p on selected rows
% selection = contains(DataTable.name, 'polymer_sample');
% DataTable = nappCopyShift(DataTable, selection, ...
% 'regionOld', 'N1s', ...
% 'regionNew', 'Cl2p', ...
% 'energyScale', 'binding');
%
% % Copy C1s calibration (binding energy) to all matching O1s spectra
% DataTable = nappCopyShift(DataTable, ...
% 'regionOld', 'C1s', ...
% 'regionNew', 'O1s');
%
% INPUT ARGUMENTS
% ---------------
% DataTable table
% Data table containing XPS spectra with energy shift calibration data
% and time stamps. Ideally the napp standard format, but must at least contain:
% - name field: spectrum identifiers with region designation (e.g.,
% 'sample_C1s', 'sample_O1s')
% - lastModifiedDatenum field: acquisition timestamps (MATLAB datenum format)
% - kineticEnergyShift or bindingEnergyShift field: calibration shift values
% (created by nappDetermineShiftXps)
%
% NAME-VALUE PAIR ARGUMENTS (optional)
% ------------------------------------
% 'tableSelection' logical array (default: all rows)
% Logical index to filter which rows in DataTable contain the source
% shift data (regionOld spectra). Only spectra in this selection will
% be processed as source regions. Their shifts will be copied to matching
% spectra in regionNew (which may or may not be in tableSelection).
% Example: contains(DataTable.name, 'C1s') to use only C1s as source
%
% 'regionOld' char vector (default: 'O1s')
% Source region containing the energy shift calibration data.
% Must be one of:
% - 'O1s'
% - 'C1s'
% - 'N1s'
%
% 'regionNew' char vector (default: 'C1s')
% Destination region to which shift data will be copied.
% Must be one of:
% - 'O1s'
% - 'C1s'
% - 'N1s'
% - 'Cl2p'
%
% 'energyScale' char vector (default: 'kinetic')
% Energy scale type for shift calibration:
% - 'kinetic': copies kineticEnergyShift column (used for image analysis)
% - 'binding': copies bindingEnergyShift column (used for spectral analysis)
%
% OUTPUT ARGUMENTS
% ----------------
% DataTable table
% Updated data table with energy shift values copied to destination region
% spectra. The appropriate column is populated:
% - kineticEnergyShift (if energyScale = 'kinetic')
% - bindingEnergyShift (if energyScale = 'binding')
%
% Shift values are matched and copied for all spectra in the destination
% region (regionNew) that share the same acquisition timestamp as spectra
% in the source region (regionOld, filtered by tableSelection).
%
% MATCHING ALGORITHM
% ------------------
% The function matches source spectra (regionOld) to destination spectra
% (regionNew) using:
% 1. Filename: region name is replaced (O1s → C1s, etc.)
% 2. Acquisition timestamp: year, month, day, hour, and minute must all match
%
% This ensures that shift calibrations from simultaneously acquired reference
% regions are correctly applied to their complementary spectra. An error is
% displayed if a matching spectrum cannot be found.
%
% NOTES
% -----
% - PREREQUISITE: Run nappDetermineShiftXps on the source region (regionOld)
% BEFORE running this function. This populates the shift column in DataTable.
% - Timestamp matching is strict: year, month, day, hour, and minute must all
% match exactly. Second-level precision is not used.
% - If regionOld and regionNew are the same, no copy operation is performed.
% - Timestamps with mismatches indicate possible data organization issues and
% trigger a diagnostic message.
% - The function operates on selected rows only when tableSelection is provided.
% Rows outside the selection are not processed as source regions.
%
% WORKFLOW EXAMPLE
% ----------------
% % Typical usage sequence for multi-region XPS dataset:
% % 1. Determine shift for reference region (C1s)
% DataTable = nappDetermineShiftXps(DataTable, ...
% contains(DataTable.name, 'C1s'), ...
% 'energyScale', 'binding');
%
% % 2. Copy C1s shift to complementary regions
% DataTable = nappCopyShift(DataTable, ...
% contains(DataTable.name, 'C1s'), ...
% 'regionOld', 'C1s', ...
% 'regionNew', 'O1s', ...
% 'energyScale', 'binding');
%
% DataTable = nappCopyShift(DataTable, ...
% contains(DataTable.name, 'C1s'), ...
% 'regionOld', 'C1s', ...
% 'regionNew', 'N1s', ...
% 'energyScale', 'binding');
%
% SEE ALSO
% --------
% nappDetermineShiftXps, nappBindingEnergyXps, nappAlignImages,
% nappFitGaussXps, datenum
% Name-Value arguments:
% matchStrategy - 'earlier' (default), 'after', 'spectrumNumber'
% timeVariable - Target time column ('lastModifiedDatenum' by default)
% Define conditions and defaults of input
% Old region must be also selected in tableSelection! it is kind like
% double.
defaultRegionOld = 'O1s';
expectedRegionOld = {'O1s','C1s','N1s'};
defaultRegionNew = 'C1s';
expectedRegionNew = {'O1s','C1s','N1s','Cl2p'};
defaultTableSelection = true(size(DataTable,1));
defaultEnergyScale = 'kinetic';
expectedEnergyScale = {'kinetic','binding'};
% Parse input
p = inputParser;
addRequired(p,'DataTable',@istable);
addOptional(p,'tableSelection',defaultTableSelection,@islogical);
addParameter(p,'regionOld',defaultRegionOld,...
@(x) any(validatestring(x,expectedRegionOld)));
addParameter(p,'regionNew',defaultRegionNew,...
@(x) any(validatestring(x,expectedRegionNew)));
addParameter(p,'energyScale',defaultEnergyScale,...
@(x) any(validatestring(x,expectedEnergyScale)));
parse(p,DataTable,varargin{:});
% The function operates as follows:
% 1. For each source spectrum/image (regionOld) in tableSelection:
% - Extract the energy shift value (kinetic or binding scale)
% - Extract the acquisition timestamp
% 2. Generate search criteria by replacing the region name in the source
% filename (e.g., "sample_O1s" becomes "sample_C1s")
% 3. Search entire DataTable for destination spectra/images (regionNew) that:
% - Have the transformed filename
% - Match the acquisition timestamp exactly (year, month, day, hour, minute)
% 4. Copy the source energy shift value to all matching destination rows
if contains(p.Results.energyScale,'kinetic')
% repeat this for all columns in input.
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
% get name and date
tmpName = replace(p.Results.DataTable(p.Results.tableSelection,:).name{ii}, ...
p.Results.regionOld,p.Results.regionNew);
tmpDate = p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatenum(ii);
% select spectra
tmpDataSelection = contains(p.Results.DataTable.name,tmpName)...
& ismember(year(p.Results.DataTable.lastModifiedDatenum),year(tmpDate))...
& ismember(month(p.Results.DataTable.lastModifiedDatenum),month(tmpDate))...
& ismember(day(p.Results.DataTable.lastModifiedDatenum),day(tmpDate))...
& ismember(hour(p.Results.DataTable.lastModifiedDatenum),hour(tmpDate))...
& ismember(minute(p.Results.DataTable.lastModifiedDatenum),minute(tmpDate));
arguments
DataTable table
processSelection logical {mustBeVector}
refSelection logical {mustBeVector}
if ~any(tmpDataSelection) == 1
disp('There is something wrong with the data time info')
disp(tmpName)
end
% replace the region in the name and copy the data
DataTable.kineticEnergyShift(tmpDataSelection,:) = p.Results.DataTable(p.Results.tableSelection,:).kineticEnergyShift(ii);
% Name-Value arguments
options.matchStrategy char {mustBeMember(options.matchStrategy, ...
{'earlier', 'after', 'spectrumNumber'})} = 'earlier'
options.timeVariable char {mustBeMember(options.timeVariable, ...
{'lastModifiedDatenum', 'creationDate'})} = 'lastModifiedDatenum'
end
elseif contains(p.Results.energyScale,'binding')
% repeat this for all columns in input.
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
% get name and date
tmpName = replace(p.Results.DataTable(p.Results.tableSelection,:).name{ii}, ...
p.Results.regionOld,p.Results.regionNew);
tmpDate = p.Results.DataTable(p.Results.tableSelection,:).lastModifiedDatenum(ii);
% select spectra
tmpDataSelection = contains(p.Results.DataTable.name,tmpName)...
& ismember(year(p.Results.DataTable.lastModifiedDatenum),year(tmpDate))...
& ismember(month(p.Results.DataTable.lastModifiedDatenum),month(tmpDate))...
& ismember(day(p.Results.DataTable.lastModifiedDatenum),day(tmpDate))...
& ismember(hour(p.Results.DataTable.lastModifiedDatenum),hour(tmpDate))...
& ismember(minute(p.Results.DataTable.lastModifiedDatenum),minute(tmpDate));
if ~any(tmpDataSelection) == 1
disp('There is something wrong with the data time info')
disp(tmpName)
numRowsTable = height(DataTable);
% Validate length of the logical arrays
if length(processSelection) ~= numRowsTable || length(refSelection) ~= numRowsTable
error('Logical selection arrays must have the exact same length as the DataTable height (%d).', numRowsTable);
end
% Ensure shift data exists
if ~ismember('bindingEnergyShift', DataTable.Properties.VariableNames)
error('The column "bindingEnergyShift" does not exist. Please run nappDetermineShift on your reference spectra first.');
end
% Initialize source logging column if it doesn't exist
if ~ismember('lognappCopyShiftSource', DataTable.Properties.VariableNames)
DataTable.lognappCopyShiftSource = cell(numRowsTable, 1);
end
%% Processing Loop
processIdx = find(processSelection);
refIdx = find(refSelection);
for i = 1:length(processIdx)
currRow = processIdx(i);
currName = DataTable.name{currRow};
% Safely extract time (handles both single numbers and 1x6 datevecs)
currTime = datenum(DataTable.(options.timeVariable)(currRow, :));
refTimes = datenum(DataTable.(options.timeVariable)(refIdx, :));
bestRefRow = NaN;
% Internal Matching Engine
switch options.matchStrategy
case 'earlier'
validRefs = refIdx(refTimes <= currTime);
if ~isempty(validRefs)
timeDiffs = currTime - refTimes(refTimes <= currTime);
[~, minIdx] = min(timeDiffs);
bestRefRow = validRefs(minIdx);
end
case 'after'
validRefs = refIdx(refTimes >= currTime);
if ~isempty(validRefs)
timeDiffs = refTimes(refTimes >= currTime) - currTime;
[~, minIdx] = min(timeDiffs);
bestRefRow = validRefs(minIdx);
end
case 'spectrumNumber'
% Extract the 4-digit number at the start of the name (e.g., '0033')
specNumStr = regexp(currName, '^\d{4}', 'match', 'once');
if ~isempty(specNumStr)
searchPattern = [specNumStr, '_'];
validRefs = refIdx(startsWith(DataTable.name(refIdx), searchPattern));
if ~isempty(validRefs)
bestRefRow = validRefs(1);
end
else
warning('Row %d: Could not extract a 4-digit spectrum number from name "%s".', currRow, currName);
end
end
% replace the region in the name and copy the data
DataTable.bindingEnergyShift(tmpDataSelection,:) = p.Results.DataTable(p.Results.tableSelection,:).bindingEnergyShift(ii);
% Validate we found a match
if isnan(bestRefRow)
warning('Row %d (%s): No matching reference found for strategy "%s". Skipping.', ...
currRow, currName, options.matchStrategy);
continue;
end
% Extract shift from reference row
referenceShift = DataTable.bindingEnergyShift(bestRefRow);
if isnan(referenceShift)
warning('Row %d: Matched reference row %d (%s) does not have a valid calculated shift. Skipping.', ...
currRow, bestRefRow, DataTable.name{bestRefRow});
continue;
end
% Copy the shift and log the exact name of the reference used
DataTable.bindingEnergyShift(currRow) = referenceShift;
DataTable.lognappCopyShiftSource{currRow} = DataTable.name{bestRefRow};
% 1. Dynamically get this function's name
thisFuncName = mfilename;
colDate = sprintf('log%sDate', thisFuncName);
colCaller = sprintf('log%sCaller', thisFuncName);
% 2. Probe for column existence, create empty string arrays if missing
if ~ismember(colDate, DataTable.Properties.VariableNames)
DataTable.(colDate) = repmat("", numRowsTable, 1);
end
if ~ismember(colCaller, DataTable.Properties.VariableNames)
DataTable.(colCaller) = repmat("", numRowsTable, 1);
end
% 3. Get current time as a string
currentTimeStr = string(datetime('now', 'Format', 'yyyy-MM-dd HH:mm:ss'));
% 4. Determine the calling script using the call stack
stackInfo = dbstack;
if length(stackInfo) > 1
callerScript = string(stackInfo(2).file); % The script that called this function
else
callerScript = " "; % Called directly from the command window
end
% 5. Write the log data only to the rows being processed
DataTable.(colDate)(processIdx) = currentTimeStr;
DataTable.(colCaller)(processIdx) = callerScript;
% -------------------------------------------------------------------------
end
end
end
+56 -598
View File
@@ -1,609 +1,67 @@
function DataTable = nappDetermineShiftXps(DataTable, varargin)
%NAPPDETERMINESHIFTXPS Determine energy shift calibration from XPS images or spectra.
% This function calculates the energy shift needed to calibrate XPS
% spectra to a binding energy reference or align all sequence iterations
% of the same file to a common kinetic energy. For spectra data, it
% computes absolute binding energy shifts relative to a reference binding
% energy value. For images, it computes relative kinetic energy shifts
% between sequence iterations. Shifts are determined by fitting Gaussian
% peaks or finding maxima in the spectra (simpler option using Matlab's
% findpeaks function).
function DataTable = nappDetermineShift(DataTable, processSelection, options)
% NAPPDETERMINESHIFT Calculate binding energy axis shifts based on a spectrum's own fitted peak.
%
% Needs X-ray energy in data table. Run addPhotonEnergy.m first.
% DataTable = NAPPDETERMINESHIFT(DataTable, processSelection) calculates
% the binding energy shift for spectra where processSelection is true, based
% on their own fitted peak position (internal reference).
%
% NOTE: This function requires that peak fitting (e.g., nappFitGaussXps)
% has already been performed so that the 'peakPos' column exists.
%
% SYNTAX
% ------
% DataTable = NAPPDETERMINESHIFTXPS(DataTable)
%
% DataTable = NAPPDETERMINESHIFTXPS(DataTable, eKinStart, eKinEnd, 'Name', Value)
%
% EXAMPLES
% --------
% % Determine binding energy shift for C1s spectra using peak finding
% DataTable = nappDetermineShiftXps(DataTable, ...
% 'tableVariable', 'spectrum_countsPerSecond', ...
% 'binEnReference', 285.0, ...
% 'mode', 'findPeak');
%
% % Determine kinetic energy shift for imaging data using the first
% iteration as reference
% DataTable = nappDetermineShiftXps(DataTable, 100, 200, ...
% 'tableVariable', 'image', ...
% 'kinEnReference', 1, ...
% 'showFigures', 'on');
%
% % Determine binding energy shift using Gaussian fitting with custom
% parameters specified in tmpFitParameters
% FitPar.fitMode = 'position';
% FitPar.refPeak = 1;
% DataTable = nappDetermineShiftXps(DataTable, 280, 290, ...
% 'tableVariable', 'spectrum_countsPerSecond', ...
% 'binEnReference', 284.8, ...
% 'mode', 'gaussFit', ...
% 'FitParameter', tmpFitParameters);
%
% tmpFitParameters.peakArea = [1e5 0.5 0.1 0.1 0.1] ;
% tmpFitParameters.peakWidth = 1.2;
% tmpFitParameters.peakPos = [198 1.6 10 10 10];
%
% tmpFitParameters.peakAreaUpperBond = [Inf 0.5 0.1 0.1 0.1];
% tmpFitParameters.peakWidthUpperBond = [3 NaN NaN NaN NaN];
% tmpFitParameters.peakPosUpperBond = [200 1.6 10 10 10];
%
% tmpFitParameters.peakAreaLowerBond = [100 10 0.5 0.1 0.1 0.1];
% tmpFitParameters.peakWidthLowerBond = [1.2 NaN NaN NaN NaN];
% tmpFitParameters.peakPosLowerBxxond = [195 1.3 0.1 0.1 0.1];
%
% tmpFitParameters.backgroundRange = [6 5];
% tmpFitParameters.weight = [198 200 0.1];
% tmpFitParameters.fitMode = 'widthPosition';
%
% PROCESSING OVERVIEW
% -------------------
% The function operates differently depending on data type:
%
% FOR IMAGES (tableVariable = 'image' or 'imageRoh'):
% 1. For each image in tableSelection:
% - Extract kinetic energy axis (scientaEkin_eV or scientaEkinRoh_eV)
% - Fit 2-peak Gaussian model to each sequence iteration (WIP: change
% this to use nappFitGaussXPS.m)
% - Extract peak position from fitting results
% - Normalize shifts relative to reference iteration (kinEnReference)
% 2. Result: kineticEnergyShift column contains shifts relative to reference iteration
% (reference iteration has shift = 0)
%
% FOR SPECTRA (tableVariable = 'spectrum_counts', 'spectrum_countsPerSecond', or 'spectrum_countsNorm'):
% 1. For each spectrum in tableSelection:
% - Optional: restrict energy range using eKinStart/eKinEnd
% - Find peak position using either:
% * findPeak method: standard matlab peak detection
% * gaussFit method: Gaussian fitting with global optimization
% - Compute binding energy shift as: xRayPhotonEnergy - peakPosition - binEnReference
% 2. Result: bindingEnergyShift column contains absolute shifts relative to reference BE
% (positive shift means peak is at lower kinetic energy than expected)
%
% PEAK DETECTION METHODS
% ----------------------
% Two methods are available for finding peak positions in spectral
%
% 1. 'findPeak' (default): Fast automated detection using MATLAB's findpeaks
% function with moving mean smoothing. Uses minPeakWidth, minPeakHeight,
% and movMeanWindow parameters to control sensitivity. Best for well-defined
% peaks with good signal-to-noise ratio. Accuracy: ±0.1-0.2 eV typical.
%
% 2. 'gaussFit': Slower but more accurate Gaussian fitting with global
% optimization using GlobalSearch. Fits background, Gaussian peaks,
% and extracts precise peak positions. Requires FitParameter structure.
% Best for noisy data or when high precision is required. Accuracy: ±0.05 eV typical.
%
% IMPORTANT LIMITATION: This function requires distinct photoelectron peaks
% to determine energy shifts. It will NOT work for background-only spectra
% or featureless data. The fitting algorithms assume at least one measurable
% peak is present in the specified energy range.
%
% INPUT ARGUMENTS
% ---------------
% DataTable table
% Data table containing XPS image or spectral data. Must contain:
% - scientaEkin_eV or scientaEkinRoh_eV: kinetic energy axis
% - tableVariable data: images or spectra
% - xRayEkin_eV: X-ray photon energy (eV) for each row
%
% eKinStart numeric scalar (optional)
% Lower kinetic energy bound for peak fitting (eV). If omitted, uses
% first energy point. Restricts the fitting region to improve accuracy.
%
% eKinEnd numeric scalar (optional)
% Upper kinetic energy bound for peak fitting (eV). If omitted, uses
% last energy point. Restricts the fitting region to improve accuracy.
%
% NAME-VALUE PAIR ARGUMENTS (optional)
% ------------------------------------
% 'tableSelection' logical array (default: all rows)
% Logical index to filter which rows in DataTable to process.
% Example: contains(DataTable.name, 'C1s') to process only C1s spectra
%
% 'tableVariable' char vector (default: 'spectrum_countsPerSecond')
% Data type to process. Must be one of:
%
% Spectral data (compute binding energy shifts):
% - 'spectrum_counts'
% - 'spectrum_countsPerSecond'
% - 'spectrum_countsNorm'
%
% Imaging data (compute kinetic energy shifts):
% - 'image'
% - 'imageRoh'
%
% 'mode' char vector (default: 'findPeak')
% Peak detection method (spectral data only):
% - 'findPeak': automated peak detection using moving mean smoothing
% - 'gaussFit': 2-peak Gaussian fitting with global optimization
%
% 'binEnReference' numeric scalar (required for spectra)
% Reference binding energy value (eV) for spectral calibration.
% Typically the known BE of the primary peak (e.g., 285.0 eV for C1s C-H).
% Example: 'binEnReference', 285.0
%
% 'kinEnReference' numeric scalar (default: 1)
% Reference iteration index for imaging data. All kinetic energy shifts
% are computed relative to this iteration. Reference iteration gets shift = 0.
% Range: 1 to number of image columns.
%
% 'mode' char vector (default: 'findPeak')
% Peak finding method for spectra:
% - 'findPeak': uses findpeaks with smoothing and height/width constraints
% - 'gaussFit': uses nappFitGaussXps with global optimization (slower, more accurate)
%
% 'minPeakWidth' numeric scalar (default: 0.1)
% Minimum peak width (eV) for findPeak method. Peaks narrower than this
% are rejected. Typical range: 0.05-0.5 eV depending on spectrometer resolution.
%
% 'minPeakHeight' numeric scalar (default: 0.1)
% Minimum peak height (intensity) for findPeak method. Peaks below this
% are rejected. Units match tableVariable data.
%
% 'movMeanWindow' numeric scalar (default: 1)
% Moving mean window width (number of points) for smoothing before peak
% detection in findPeak method. Reduces noise; typical range: 1-5 points.
%
% 'FitParameter' struct
% Structure containing Gaussian fitting parameters for gaussFit mode.
% Required fields:
% - fitMode: 'position', 'width', 'unconstrained', etc.
% - refPeak: peak number (1 or 2) whose position is used for shift calculation
% Example: FitPar.fitMode = 'position'; FitPar.refPeak = 1;
%
% 'refPeak' numeric scalar (default: 1)
% Peak number (1 or 2) whose position is used for binding energy shift
% calculation in gaussFit mode. Peak 1 is typically the main photoelectron peak.
%
% 'showFigures' char vector (default: 'off')
% Display fitting results:
% - 'on': show Gaussian fit plot, peak table, and peak finding results
% - 'off': suppress all figure output
%
% OUTPUT ARGUMENTS
% ----------------
% DataTable table
% Updated data table with new columns:
%
% For imaging data (tableVariable = 'image' or 'imageRoh'):
% - kineticEnergyShift: column vector of relative kinetic energy shifts (eV)
% relative to kinEnReference iteration. Reference = 0.
%
% For spectral data (tableVariable = 'spectrum_*'):
% - bindingEnergyShift: column vector of absolute binding energy shifts (eV)
% relative to binEnReference. Typically small values (±0.5 eV range).
%
% For gaussFit mode on spectra, additional columns are added:
% - peakPosition: [peak1, peak2] positions (eV) for each spectrum
% - peakArea: [peak1, peak2] areas (eV·counts) for each spectrum
% - peakFWHM: [peak1, peak2] full-width half-maximum (eV) for each spectrum
% - peakBackground: linear background parameters [slope, intercept]
%
% NOTES
% -----
% - PREREQUISITE: X-ray photon energy (xRayEkin_eV) must be present in DataTable.
% If empty, function returns with warning.
% - For imaging: Gaussian fitting assumes 2 peaks in each iteration. Adjust
% eKinStart/eKinEnd to isolate peak region if data is complex.
% - For spectra: findPeak method is fast but less accurate (±0.1-0.2 eV typical).
% gaussFit method is slower but more accurate (±0.05 eV typical).
% - Peak detection may fail if signal-to-noise is poor. Check showFigures output
% to diagnose fitting quality.
% - For imageRoh variant: uses scientaEkinRoh_eV if available; falls back to
% scientaEkin_eV if not populated.
% - Binding energy shifts can be negative (peak at higher BE than reference) or
% positive (peak at lower BE than reference).
% - Figure windows are automatically closed after processing to prevent clutter.
%
% SEE ALSO
% --------
% nappCopyShift, nappBindingEnergyXps, nappFitGaussXps, nappAlignImages,
% findpeaks, GaussFitOnePeak
defaultKinEnReference = 1;
defaultTableVariable = 'spectrum_countsPerSecond';
expectedTableVariable = {'spectrum_counts','spectrum_countsPerSecond','spectrum_countsNorm','image','imageRoh'};
defaultTableSelection = true(size(DataTable,1));
defaultMinPeakWidth = 0.1;
defaultMinPeakHeight = 0.1;
defaultMovMeanWindow = 1;
defaultRefPeak = 1;
defaultShowFigures = 'off';
expectedShowFigures = {'on','off'};
defaultMode = 'findPeak';
expectedMode = {'gaussFit','findPeak'};
% defaultFitMode = 'widthPosition';
% expectedFitMode = {'unconstrained','widthPosition','position','width','unconstrainedAndWidthPosition'};
% Name-Value arguments:
% referenceBindingEnergy - The theoretical energy to align to (e.g., 285.0 for C1s)
% peakNumber - Which peak position to use if multiple exist (1 by default)
%%
% Parse input
p = inputParser;
addRequired(p,'DataTable',@istable);
addOptional(p,'eKinStart',@isnumeric)
addOptional(p,'eKinEnd',@isnumeric)
addParameter(p,'FitParameter',@isstruct);
addParameter(p,'binEnReference',@isnumeric)
addParameter(p,'kinEnReference',defaultKinEnReference,@isnumeric)
addParameter(p,'tableSelection',defaultTableSelection,@islogical);
addParameter(p,'minPeakWidth',defaultMinPeakWidth,@isnumeric);
addParameter(p,'minPeakHeight',defaultMinPeakHeight,@isnumeric);
addParameter(p,'movMeanWindow',defaultMovMeanWindow ,@isnumeric);
addParameter(p,'tableVariable',defaultTableVariable,...
@(x) any(validatestring(x,expectedTableVariable)));
addParameter(p,'showFigures',defaultShowFigures,...
@(x) any(validatestring(x,expectedShowFigures)));
addParameter(p,'mode',defaultMode, @(x) any(validatestring(x,expectedMode)));
% addParameter(p,'fitMode',defaultFitMode, @(x) any(validatestring(x,expectedFitMode)));
addParameter(p,'refPeak',defaultRefPeak,@isnumeric);
parse(p,DataTable,varargin{:});
% check input (all elements of input variable need to have non-zero size)
if ~all(cell2mat(cellfun(@size,p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable),'UniformOutput',false)),'all')
disp('The table variable appears to be empty. I quit now')
error('The table variable appears to be empty.')
end
% add empty variable to table
if contains(p.Results.tableVariable,'image')
existColumn = strcmp('kineticEnergyShift',DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.kineticEnergyShift = cell(size(DataTable,1),1);
arguments
DataTable table
processSelection logical {mustBeVector}
% Name-Value arguments
options.referenceBindingEnergy (1,1) double = 285.0 % Default to C1s binding energy
options.peakNumber (1,1) double {mustBeInteger, mustBePositive} = 1
end
else
existColumn = strcmp('bindingEnergyShift',DataTable.Properties.VariableNames);
if ~any(existColumn)
DataTable.bindingEnergyShift = NaN(size(DataTable,1),1);
numRowsTable = height(DataTable);
% Validate length of the logical array
if length(processSelection) ~= numRowsTable
error('processSelection must have the exact same length as the DataTable height (%d).', numRowsTable);
end
end
%Colors; define PSI cooperate identity colours
PsiFarbe.hellgrau = [226 226 226]/255;
PsiFarbe.mittelgrau = [184 184 184]/255;
PsiFarbe.dunkelgrau = [78 78 77]/255;
PsiFarbe.blaugrau = [236 236 243]/255; % This is actually not a PSI colour
PsiFarbe.gelb = [239 200 37]/255;
PsiFarbe.hellorange = [227 164 31]/255;
PsiFarbe.dunkelorange = [207 92 22]/255;
PsiFarbe.hellrot = [164 36 23]/255;
PsiFarbe.dunkelbraun = [114 85 65]/255;
PsiFarbe.hellbraun = [127 119 47]/255;
PsiFarbe.mittelgruen = [135 150 59]/255;
PsiFarbe.hellgruen = [195 214 47]/255;
PsiFarbe.dunkelgruen = [72 130 33]/255;
PsiFarbe.dunkelrot = [104 47 86]/255;
PsiFarbe.dunkelblau = [37 65 108]/255;
PsiFarbe.mittelgruenblau = [61 164 168]/255;
PsiFarbe.hellblau = [58 162 190]/255;
PsiFarbe.mittelblau = [50 118 158]/255;
% confirm that X-ray energy is set
if any(isnan(cell2mat(p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV)))
disp('Opps, X-ray energy is empty. Please add manually. Will stop now');
return
end
if matches(p.Results.tableVariable,'image')
% repeat this for all columns in input.
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
%%
try
if isnumeric(p.Results.eKinStart)
start = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}...
>= p.Results.eKinStart,1);
stop = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}...
>= p.Results.eKinEnd,1);
else
start = 1;
stop = length(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii});
end
catch
warning('There is something wrong with the eKinStart and/or eKinEnd parameters');
disp('There is something wrong with the eKinStart and/or eKinEnd parameters');
end
for ij = 1:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)
[B,x1,y1] = GaussFitOnePeak([p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(start:stop)',...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(start:stop,ij)]);
tmp_1(ij) = p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}-B(3);
% plot result
if matches(p.Results.showFigures,'on')
% define equations to be plotted
Gauss = @(x,Hgt, Pos, Wdt) Hgt./(Wdt.*sqrt(pi/2))*exp(-2.*((x - Pos).^2/Wdt.^2));
linear = @(x,slp,intrcpt) slp*x+intrcpt;
figure( 'Name', 'Gauss Multi Fit ')
tiledlayout(1,1)
nexttile;
%Define gauss peaks with hight, position, width from fitting results
yData_pk1= Gauss(x1 ,B(1), B(3), B(2));
yData_pk2= Gauss(x1 ,B(4), B(6), B(5));
bkgrd = linear(x1,B(7),B(8));
% plot data
plot(x1,y1,'.')
hold on
% plot fit
h = plot(x1,yData_pk1+yData_pk2+bkgrd);
h.LineWidth=2;
h.Color = PsiFarbe.dunkelblau;
% plot each gauss peak
h = plot(x1,yData_pk1+bkgrd);
h.LineWidth=1.5;
h.Color = PsiFarbe.gelb;
h = plot(x1,yData_pk2+bkgrd);
h.LineWidth=1.5;
h.Color = PsiFarbe.gelb;
legend OFF
xlabel('Kinetic Energy [eV]');
ylabel('PE intensity [-]');
grid on
% List results in table
disp('Results');
disp(' ' );
disp(cell2table({sprintf('%.1f',B(3)),...
sprintf('%.1f',B(2)*sqrt(log(4))),...
sprintf('%.1f',B(2)),...
sprintf('%7.0f',B(1))},...
'VariableNames',{'position';'FWHW';'width';'area'},...
'RowNames',{'pk 1'}));
end
end
%%
DataTable(p.Results.tableSelection,:).kineticEnergyShift{ii} = tmp_1-tmp_1(p.Results.kinEnReference);
clearvars tmp_1
fh = findobj( 'Type', 'Figure', 'Name', 'Gauss Multi Fit ');
close(fh)
fh = findobj( 'Type', 'Figure', 'Name', 'GlobalSearch');
close(fh)
% Ensure peak positions exist (Fit must be run first!)
if ~ismember('peakPos', DataTable.Properties.VariableNames)
error('The column "peakPos" does not exist. Please run nappFitGaussXps before calculating shifts.');
end
elseif matches(p.Results.tableVariable,'imageRoh')
% repeat this for all columns in input.
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
%%
try
if isnumeric(p.Results.eKinStart) && isempty(DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii})
start = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}...
>= p.Results.eKinStart,1);
stop = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}...
>= p.Results.eKinEnd,1);
elseif isnumeric(p.Results.eKinStart) && ~isempty(DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii})
start = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii}...
>= p.Results.eKinStart,1);
stop = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii}...
>= p.Results.eKinEnd,1);
elseif isempty(DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii})
start = 1;
stop = length(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii});
else
start = 1;
stop = length(DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii});
end
catch
warning('There is something wrong with the eKinStart and/or eKinEnd parameters');
disp('There is something wrong with the eKinStart and/or eKinEnd parameters');
end
for ij = 1:size(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii},2)
if isempty(DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii})
[B,x1,y1] = GaussFitOnePeak([p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(start:stop)',...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(start:stop,ij)]);
else
[B,x1,y1] = GaussFitOnePeak([DataTable(p.Results.tableSelection,:).scientaEkinRoh_eV{ii}(start:stop)',...
p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(start:stop,ij)]);
end
tmp_1(ij) = p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}-B(3);
% plot result
if matches(p.Results.showFigures,'on')
% define equations to be plotted
Gauss = @(x,Hgt, Pos, Wdt) Hgt./(Wdt.*sqrt(pi/2))*exp(-2.*((x - Pos).^2/Wdt.^2));
linear = @(x,slp,intrcpt) slp*x+intrcpt;
figure( 'Name', 'Gauss Multi Fit ')
tiledlayout(1,1)
nexttile;
%Define gauss peaks with hight, position, width from fitting results
yData_pk1= Gauss(x1 ,B(1), B(3), B(2));
yData_pk2= Gauss(x1 ,B(4), B(6), B(5));
bkgrd = linear(x1,B(7),B(8));
% plot data
plot(x1,y1,'.')
hold on
% plot fit
h = plot(x1,yData_pk1+yData_pk2+bkgrd);
h.LineWidth=2;
h.Color = PsiFarbe.dunkelblau;
% plot each gauss peak
h = plot(x1,yData_pk1+bkgrd);
h.LineWidth=1.5;
h.Color = PsiFarbe.gelb;
h = plot(x1,yData_pk2+bkgrd);
h.LineWidth=1.5;
h.Color = PsiFarbe.gelb;
legend OFF
xlabel('Kinetic Energy [eV]');
ylabel('PE intensity [-]');
grid on
% List results in table
disp('Results');
disp(' ' );
disp(cell2table({sprintf('%.1f',B(3)),...
sprintf('%.1f',B(2)*sqrt(log(4))),...
sprintf('%.1f',B(2)),...
sprintf('%7.0f',B(1))},...
'VariableNames',{'position';'FWHW';'width';'area'},...
'RowNames',{'pk 1'}));
end
end
%%
DataTable(p.Results.tableSelection,:).kineticEnergyShift{ii} = tmp_1-tmp_1(p.Results.kinEnReference);
clearvars tmp_1
fh = findobj( 'Type', 'Figure', 'Name', 'Gauss Multi Fit ');
close(fh)
fh = findobj( 'Type', 'Figure', 'Name', 'GlobalSearch');
close(fh)
% Initialize new columns to store the shift data if they don't exist
if ~ismember('bindingEnergyShift', DataTable.Properties.VariableNames)
DataTable.bindingEnergyShift = zeros(numRowsTable, 1);
end
else
% repeat this for all columns in input.
if matches(p.Results.mode,'findPeak')
for ii = 1:size(p.Results.DataTable(p.Results.tableSelection,:),1)
%%
try
if isnumeric(p.Results.eKinStart)
start = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}...
>= p.Results.eKinStart,1);
stop = find(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}...
>= p.Results.eKinEnd,1);
else
start = 1;
stop = length(p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii});
end
catch
warning('There is something wrong with the eKinStart and/or eKinEnd parameters');
disp('There is something wrong with the eKinStart and/or eKinEnd parameters');
end
if contains(p.Results.showFigures,'on')
figure
findpeaks(movmean(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(start:stop),...
p.Results.movMeanWindow),...
p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(start:stop),...
'MinPeakWidth',p.Results.minPeakWidth,'MinPeakHeight',p.Results.minPeakHeight)
end
[pks,locs]=findpeaks(movmean(p.Results.DataTable(p.Results.tableSelection,:).(p.Results.tableVariable){ii}(start:stop),...
p.Results.movMeanWindow),...
p.Results.DataTable(p.Results.tableSelection,:).scientaEkin_eV{ii}(start:stop),...
'MinPeakWidth',p.Results.minPeakWidth,'MinPeakHeight',p.Results.minPeakHeight);
%%
[~,I] = max(pks);
tmp_1(ii,1) = p.Results.DataTable(p.Results.tableSelection,:).xRayEkin_eV{ii}-locs(I)-p.Results.binEnReference;
clearvars tmp_2
if ~ismember('energyShiftSource', DataTable.Properties.VariableNames)
DataTable.energyShiftSource = cell(numRowsTable, 1);
end
%% Processing Loop
processIdx = find(processSelection);
for i = 1:length(processIdx)
currRow = processIdx(i);
currName = DataTable.name{currRow};
% Extract the peak position
refPositions = DataTable.peakPos(currRow, :);
if size(refPositions, 2) < options.peakNumber || isnan(refPositions(options.peakNumber))
warning('Row %d (%s): peakNumber %d does not contain a valid fitted position. Skipping.', ...
currRow, currName, options.peakNumber);
continue;
end
DataTable.bindingEnergyShift(p.Results.tableSelection) = tmp_1;
elseif matches(p.Results.mode,'gaussFit')
tmpFitResults = nappFitGaussXps(DataTable,p.Results.FitParameter,p.Results.tableSelection,...
'energyScale','kinetic','mode',p.Results.FitParameter.fitMode,'showFigures','on','tableVariable',p.Results.tableVariable);
DataTable.bindingEnergyShift(p.Results.tableSelection) = tmpFitResults(p.Results.tableSelection,:).xRayEkinRange_eV(:,1) - tmpFitResults(p.Results.tableSelection,:).peakPosition(:,p.Results.FitParameter.refPeak) - repmat(p.Results.binEnReference,size(DataTable.bindingEnergyShift(p.Results.tableSelection)));
DataTable.peakPosition(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakPosition;
DataTable.peakArea(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakArea;
DataTable.peakFWHM(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakFWHM;
% added 6.2025 tbr
DataTable.peakBackground(p.Results.tableSelection,:) = tmpFitResults(p.Results.tableSelection,:).peakBackground;
%%
% Calculate the shift: Shift = Reference Binding Energy - Measured Energy
measuredEnergy = refPositions(options.peakNumber);
calculatedShift = options.referenceBindingEnergy - measuredEnergy;
% Log the shift and its source
DataTable.bindingEnergyShift(currRow) = calculatedShift;
DataTable.energyShiftSource{currRow} = 'self';
end
end
try
fh = findobj( 'Type', 'Figure', 'Name', 'Gauss Multi Fit ');
close(fh)
catch
end
try
fh = findobj( 'Type', 'Figure', 'Name', 'GlobalSearch');
close(fh)
catch
end
end
function [B,x1,y1] = GaussFitOnePeak(data1)
[x1, y1] = prepareCurveData(data1(:,1),data1(:,2));
% make data slimmer so that background makes sense
[~,I] = max(y1);
tmp1 = find(x1>=x1(I)-8,1);
tmp2 = find(x1>=x1(I)+5,1);
if isempty(tmp2)
y1 = y1(tmp1:end);
x1 = x1(tmp1:end);
else
y1 = y1(tmp1:tmp2);
x1 = x1(tmp1:tmp2);
end
[~,I] = max(y1);
% Define equation to fit data
% I use the area Gauss equations here, which I took from the OriginPro
% documentation. https://www.originlab.com/doc/Origin-Help/Gauss-FitFunc
%
% Gauss = area/(width*sqrt(pi/2)) * exp(-2*(x-position)^2/width^2)
%
% where FWHM = width * sqrt(ln(4))
% Data set 1:
yfcn1 = @(b,x)...
b(1)/(b(2)*sqrt(pi/2))*exp(-2.*((x(:,1) - b(3)).^2/b(2).^2)) ... % Gauss peak 1: C-H, Ac-
+ b(4)/(b(5)*sqrt(pi/2))*exp(-2.*((x(:,1)- b(6)).^2/b(5).^2))... % Gauss peak 2: C-OOH, Ac-
+b(7).*x(:,1)+b(8); % linear background
B0 = [1e5 1.5 x1(I) ...
1e5 1.0 x1(I)-4 ...
1 0];
% lower bonds
lb = [100 0.5 x1(I)-1. ...
100 1.0 x1(I)-5 ...
-Inf -Inf];
% upper bond
ub = [Inf 3 x1(I)+1 ...
Inf 5 x1(I)-1 ...
Inf Inf];
% Fit equations: Gauss eq. 1 with data
yfcn = @(b,x) yfcn1(b,x);
% We find an optimal fit by minimising the residuals:
fitfcnw = @(b) sum((y1 - yfcn(b,x1)).^2);
problem = createOptimProblem('fmincon', 'x0',B0, 'lb',lb,'ub',ub, 'objective',fitfcnw);
gs = GlobalSearch('PlotFcns',@gsplotbestf);
B = run(gs,problem);
end
+9 -1
View File
@@ -306,7 +306,7 @@ elseif contains(p.Results.mode,'data')
end
end
if contains(p.Results.mode,'data')
dataPath = fullfile(server,'5505','Data',dataPath);
dataPath = fullfile(server,'5505','Data','beamtimes',dataPath);
else
dataPath = fullfile(server,'NAPP','SC Data',dataPath);
end
@@ -639,6 +639,7 @@ if ~isempty(TmpFileList{1})
globalAnalyzerSlit = '';
globalWorkFunction = NaN;
globalExEnergy = NaN;
globalSample = '';
if ~isempty(regionStarts)
globalHeader = fileLines(1:regionStarts(1)-1);
@@ -660,6 +661,8 @@ if ~isempty(TmpFileList{1})
globalWorkFunction = sscanf(strtrim(extractAfter(lineStr, '# Eff. Workfunction:')), '%f');
elseif startsWith(lineStr, '# Excitation Energy:')
globalExEnergy = sscanf(strtrim(extractAfter(lineStr, '# Excitation Energy:')), '%f');
elseif startsWith(lineStr, '# Comment:')
globalSample = strtrim(extractAfter(lineStr, '# Comment:'));
% =========================================================================
% OFFLINE XPS BUG FIX (Mg vs Al Source)
% If the file lacks "Monochromator" in the header and the energy is
@@ -700,6 +703,9 @@ if ~isempty(TmpFileList{1})
regionEntry.scientaAnalyzerSlit = globalAnalyzerSlit;
regionEntry.scientaWorkfunction_eV = globalWorkFunction;
regionEntry.creationDate = osDateVec;
if ~isempty(globalSample)
regionEntry.sample = globalSample;
end
% Scan the header lines directly
for L = 1:min(150, length(regionBlock)) % Metadata is always at the top
@@ -751,6 +757,8 @@ if ~isempty(TmpFileList{1})
regionEntry.scientaWorkfunction_eV = sscanf(strtrim(extractAfter(lineStr, '# Work Function:')), '%f');
elseif startsWith(lineStr, '# Eff. Workfunction:')
regionEntry.scientaWorkfunction_eV = sscanf(strtrim(extractAfter(lineStr, '# Eff. Workfunction:')), '%f');
elseif startsWith(lineStr, '# Comment:')
regionEntry.sample = strtrim(extractAfter(lineStr, '# Comment:'));
end
end
+73 -50
View File
@@ -2056,7 +2056,7 @@ for ii = 1:size(DataTable(p.Results.tableSelection,:),1)
end
%--------------------------------------------------------------------------
%% Core fitting part,
%% Core fitting part,
% the fitting is done here (kinetic energy scale)
%--------------------------------------------------------------------------
clearvars currentParameterVector
@@ -2066,6 +2066,21 @@ for ii = 1:size(DataTable(p.Results.tableSelection,:),1)
objectiveFunction = @(currentParameterVector) sum((fitIntensityValues - modelEvaluationFunction(currentParameterVector,fitEnergyValues)).^2);
optimizationProblem = createOptimProblem('fmincon', 'x0',initialParameterVector, 'lb',lowerBoundsParameterVector,'ub',upperBoundsParameterVector, 'objective',objectiveFunction);
globalSearchOptimizer = GlobalSearch('PlotFcns',@gsplotbestf);
% -------------------------------------------------------------------------
% PUBLISH MODE DETECTION
% If MATLAB is publishing a document, completely silence the optimization
% output and live plots so they don't flood the final PDF/HTML.
stackInfo = dbstack;
if any(contains({stackInfo.name}, 'publish')) || any(contains({stackInfo.name}, 'evalmxdom'))
globalSearchOptimizer.Display = 'off'; % Turns off the scrolling text
% globalSearchOptimizer.PlotFcns = []; % (Commented out: leaves the live fitting plot active)
% Silence the local fmincon solver by attaching options directly to the optimizationProblem
optimizationProblem.options = optimoptions('fmincon', 'Display', 'off');
end
% -------------------------------------------------------------------------
currentParameterVector = run(globalSearchOptimizer,optimizationProblem);
elseif contains(p.Results.energyScale,'binding')
%--------------------------------------------------------------------------
@@ -2090,7 +2105,7 @@ for ii = 1:size(DataTable(p.Results.tableSelection,:),1)
fitIntensityValues = fitIntensityValues(tmp1:tmp2);
fitEnergyValues = fitEnergyValues(tmp1:tmp2);
end
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
%% Core fitting part
% the fitting is done here (binding energy scale)
%--------------------------------------------------------------------------
@@ -2961,26 +2976,7 @@ elseif matches(p.Results.mode, 'TwoUnconstrainedAndWidthPositionPseudoVoigtPeak'
DataTable(p.Results.tableSelection,:).peakShirleyK(ii, :) = NaN;
end
%% Print Results
if matches(p.Results.showFigures,'on')
disp(DataTable(p.Results.tableSelection,["name","peakPosition"]))
disp(DataTable(p.Results.tableSelection,["name","peakArea"]))
disp(DataTable(p.Results.tableSelection,["name","peakFWHM"]))
disp(DataTable(p.Results.tableSelection,["name","peakBackground"]))
try
if ~isnan(DataTable(p.Results.tableSelection,:).peakEta(1))
disp(DataTable(p.Results.tableSelection,["name","peakEta",]))
end
catch
end
try
if ~isnan(DataTable(p.Results.tableSelection,:).peakShirleyK(1))
disp(DataTable(p.Results.tableSelection,["name","peakShirleyK"]))
end
catch
end
end
%% Plot Results
%
% This uses nappPlot and then moves the figure in a tiledlayout to also
@@ -3020,8 +3016,62 @@ elseif matches(p.Results.mode, 'TwoUnconstrainedAndWidthPositionPseudoVoigtPeak'
close(ancestor(axOld,'figure'));
end
% --- Define variables for the Universal Logging Block ---
numRowsTable = height(DataTable);
processIdx = find(p.Results.tableSelection);
% -------------------------------------------------------------------
% 1. Dynamically get this function's name
thisFuncName = mfilename;
colDate = sprintf('log%sDate', thisFuncName);
colCaller = sprintf('log%sCaller', thisFuncName);
% 2. Probe for column existence, create empty string arrays if missing
if ~ismember(colDate, DataTable.Properties.VariableNames)
DataTable.(colDate) = repmat("", numRowsTable, 1);
end
if ~ismember(colCaller, DataTable.Properties.VariableNames)
DataTable.(colCaller) = repmat("", numRowsTable, 1);
end
% 3. Get current time as a string
currentTimeStr = string(datetime('now', 'Format', 'yyyy-MM-dd HH:mm:ss'));
% 4. Determine the calling script using the call stack
stackInfo = dbstack;
if length(stackInfo) > 1
callerScript = string(stackInfo(2).file); % The script that called this function
else
callerScript = " "; % Called directly from the command window
end
% 5. Write the log data only to the rows being processed
DataTable.(colDate)(processIdx) = currentTimeStr;
DataTable.(colCaller)(processIdx) = callerScript;
end
%% Print Results
if matches(p.Results.showFigures,'on')
disp(DataTable(p.Results.tableSelection,["name","peakPosition"]))
disp(DataTable(p.Results.tableSelection,["name","peakArea"]))
disp(DataTable(p.Results.tableSelection,["name","peakFWHM"]))
disp(DataTable(p.Results.tableSelection,["name","peakBackground"]))
try
if ~isnan(DataTable(p.Results.tableSelection,:).peakEta(1))
disp(DataTable(p.Results.tableSelection,["name","peakEta",]))
end
catch
end
try
if ~isnan(DataTable(p.Results.tableSelection,:).peakShirleyK(1))
disp(DataTable(p.Results.tableSelection,["name","peakShirleyK"]))
end
catch
end
end
end
@@ -3331,34 +3381,7 @@ for iPeak = 1:nPeaks
B = B + shirleycontrib;
end
% % Calculate sigma and gamma from FWHM
% % These match the definitions used in your helper functions
% w = fwhm2w(FWHM); % Convert FWHM to width parameter
% sigma = w / 2; % Gaussian sigma
% gamma = FWHM / 2; % Lorentzian gamma
%
% if matches(p.Results.energyScale, 'binding')
% % Background on HIGH binding energy side (E >= E0, right)
% idxregion = (E >= pos);
% else % kinetic
% % error('ERROR: Shirley works only in binding energy mode')
% E = max(E)+100-E;
% pos = max(E)+100-pos;
% idxregion = (E >= pos);
% end
%
% % Use complementary CDF
% Gtail = 0.5 * (1 - erf((E(idxregion) - pos) / (sqrt(2) * sigma)));
% Ltail = 0.5 - (1/pi) * atan((E(idxregion) - pos) / gamma);
% tailfrac = eta * Gtail + (1 - eta) * Ltail;
% shirleycontrib = K * area * (0.5 - tailfrac);
% Btemp = zeros(size(E));
% Btemp(idxregion) = shirleycontrib;
% B = B + Btemp;
% end
% if matches(p.Results.energyScale, 'kinetic')
% %B = flip(B);
% end
end
+33 -1
View File
@@ -208,6 +208,38 @@ end
% write log to table
DataTable.logGenerateMode(p.Results.tableSelection,:) = cellstr(repmat(p.Results.mode,size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
DataTable.logGenerateRange(p.Results.tableSelection,:) = [tmp_4 tmp_5];
DataTable.logGenerateDate(p.Results.tableSelection,:) = cellstr(repmat(datestr(now),size(p.Results.DataTable(p.Results.tableSelection,:),1),1));
% --- Define variables for the Universal Logging Block ---
numRowsTable = height(DataTable);
processIdx = find(p.Results.tableSelection);
% -------------------------------------------------------------------
% 1. Dynamically get this function's name
thisFuncName = mfilename;
colDate = sprintf('log%sDate', thisFuncName);
colCaller = sprintf('log%sCaller', thisFuncName);
% 2. Probe for column existence, create empty string arrays if missing
if ~ismember(colDate, DataTable.Properties.VariableNames)
DataTable.(colDate) = repmat("", numRowsTable, 1);
end
if ~ismember(colCaller, DataTable.Properties.VariableNames)
DataTable.(colCaller) = repmat("", numRowsTable, 1);
end
% 3. Get current time as a string
currentTimeStr = string(datetime('now', 'Format', 'yyyy-MM-dd HH:mm:ss'));
% 4. Determine the calling script using the call stack
stackInfo = dbstack;
if length(stackInfo) > 1
callerScript = string(stackInfo(2).file); % The script that called this function
else
callerScript = " "; % Called directly from the command window
end
% 5. Write the log data only to the rows being processed
DataTable.(colDate)(processIdx) = currentTimeStr;
DataTable.(colCaller)(processIdx) = callerScript;
end
+185
View File
@@ -0,0 +1,185 @@
function DataTable = nappNorm(DataTable, processSelection, refSelection, options)
% NAPPNORM Normalize XPS spectra based on provided reference selection or self-maximum.
%
% DataTable = NAPPNORM(DataTable, processSelection, refSelection) normalizes
% the spectra where processSelection is true, dividing them by the peak area
% of matched spectra from the pool where refSelection is true. Both must
% be logical arrays matching the height of the DataTable.
%
% DataTable = NAPPNORM(DataTable, processSelection) scales each spectrum
% selected by the logical array by its own maximum value.
%
% Name-Value arguments:
% matchStrategy - 'earlier', 'after', 'spectrumNumber', 'internalMax'
% tableVariable - Target column ('spectrum_countsPerSecond' by default)
% timeVariable - Target time column ('lastModifiedDatenum' by default)
% peakNumber - Which peak area to use if multiple exist (1 by default)
arguments
DataTable table
processSelection logical {mustBeVector}
% refSelection is optional. If omitted, it defaults to empty.
refSelection logical {mustBeVector} = false(0,1);
% Name-Value arguments
options.matchStrategy char {mustBeMember(options.matchStrategy, ...
{'earlier', 'after', 'spectrumNumber', 'internalMax'})} = 'earlier'
options.tableVariable char {mustBeMember(options.tableVariable, ...
{'spectrum_counts', 'spectrum_countsPerSecond', 'spectrum_countsNorm'})} = 'spectrum_countsPerSecond'
options.timeVariable char {mustBeMember(options.timeVariable, ...
{'lastModifiedDatenum', 'creationDate'})} = 'lastModifiedDatenum'
options.peakNumber (1,1) double {mustBeInteger, mustBePositive} = 1
end
numRowsTable = height(DataTable);
% Validate length of the logical arrays
if length(processSelection) ~= numRowsTable
error('processSelection must have the exact same length as the DataTable height (%d).', numRowsTable);
end
if ~isempty(refSelection) && any(refSelection) && length(refSelection) ~= numRowsTable
error('refSelection must have the exact same length as the DataTable height (%d).', numRowsTable);
end
% Auto-detect mode: If no valid reference array is passed OR 'internalMax' is chosen
if strcmpi(options.matchStrategy, 'internalMax') || isempty(refSelection) || ~any(refSelection)
mode = 'maximum';
else
mode = 'referenceArea';
end
% Initialize new columns if they don't exist
if ~ismember('spectrum_countsNorm', DataTable.Properties.VariableNames)
DataTable.spectrum_countsNorm = cell(numRowsTable, 1);
end
if ~ismember('lognappNormMode', DataTable.Properties.VariableNames)
DataTable.lognappNormMode = cell(numRowsTable, 1);
end
if ~ismember('lognappNormWith', DataTable.Properties.VariableNames)
DataTable.lognappNormWith = cell(numRowsTable, 1); % New column for spectrum name
end
%% Processing Loop
processIdx = find(processSelection);
refIdx = find(refSelection);
for i = 1:length(processIdx)
currRow = processIdx(i);
yData = DataTable.(options.tableVariable){currRow};
currTime = datenum(DataTable.(options.timeVariable)(currRow, :));
refTimes = datenum(DataTable.(options.timeVariable)(refIdx, :));
currName = DataTable.name{currRow};
bestRefRow = NaN;
if isempty(yData)
continue;
end
switch mode
case 'maximum'
normFactor = max(yData);
if normFactor == 0, normFactor = 1; end % Protect against /0
DataTable.spectrum_countsNorm{currRow} = yData ./ normFactor;
DataTable.logNormMode{currRow} = 'maximum';
DataTable.logNormWith{currRow} = num2str(normFactor); % Log internal maximum
case 'referenceArea'
% Internal Matching Engine using Code Words
switch options.matchStrategy
case 'earlier'
validRefs = refIdx(refTimes <= currTime);
if ~isempty(validRefs)
timeDiffs = currTime - refTimes(refTimes <= currTime);
[~, minIdx] = min(timeDiffs);
bestRefRow = validRefs(minIdx);
end
case 'after'
validRefs = refIdx(refTimes >= currTime);
if ~isempty(validRefs)
timeDiffs = refTimes(refTimes >= currTime) - currTime;
[~, minIdx] = min(timeDiffs);
bestRefRow = validRefs(minIdx);
end
case 'spectrumNumber'
% Extract the 4-digit number at the start of the name (e.g., '0033')
specNumStr = regexp(currName, '^\d{4}', 'match', 'once');
if ~isempty(specNumStr)
% Find references that start with 'XXXX_'
searchPattern = [specNumStr, '_'];
validRefs = refIdx(startsWith(DataTable.name(refIdx), searchPattern));
if ~isempty(validRefs)
bestRefRow = validRefs(1); % Take the first exact match
end
else
warning('Row %d: Could not extract a 4-digit spectrum number from name "%s".', currRow, currName);
end
end
% Validate we found a match
if isnan(bestRefRow)
warning('Row %d (%s): No matching reference found for strategy "%s". Skipping.', ...
currRow, currName, options.matchStrategy);
continue;
end
% Extract area and validate
refAreas = DataTable.peakArea(bestRefRow,:);
if size(refAreas,2) < options.peakNumber
warning('Row %d: peakNumber %d exceeds available peaks in reference row %d. Skipping.', ...
currRow, options.peakNumber, bestRefRow);
continue;
end
normFactor = refAreas(options.peakNumber);
if normFactor == 0
warning('Row %d: Reference area in row %d is zero. Skipping.', currRow, bestRefRow);
continue;
end
% Apply normalization and log the exact name of the reference
DataTable.spectrum_countsNorm{currRow} = yData ./ normFactor;
DataTable.lognappNormMode{currRow} = sprintf('referenceArea (Row %d)', bestRefRow);
DataTable.lognappNormWith{currRow} = DataTable.name{bestRefRow};
% -------------------------------------------------------------------------
% 1. Dynamically get this function's name
thisFuncName = mfilename;
colDate = sprintf('log%sDate', thisFuncName);
colCaller = sprintf('log%sCaller', thisFuncName);
% 2. Probe for column existence, create empty string arrays if missing
if ~ismember(colDate, DataTable.Properties.VariableNames)
DataTable.(colDate) = repmat("", numRowsTable, 1);
end
if ~ismember(colCaller, DataTable.Properties.VariableNames)
DataTable.(colCaller) = repmat("", numRowsTable, 1);
end
% 3. Get current time as a string
currentTimeStr = string(datetime('now', 'Format', 'yyyy-MM-dd HH:mm:ss'));
% 4. Determine the calling script using the call stack
stackInfo = dbstack;
if length(stackInfo) > 1
callerScript = string(stackInfo(2).file); % The script that called this function
else
callerScript = " "; % Called directly from the command window
end
% 5. Write the log data only to the rows being processed
DataTable.(colDate)(processIdx) = currentTimeStr;
DataTable.(colCaller)(processIdx) = callerScript;
% -------------------------------------------------------------------------
end
end
end
+35 -2
View File
@@ -82,6 +82,16 @@ store image data, spectra, meta‑data, fit results, etc.
Everyone in the group is more than welcome to contribute new functions and
examples so that the next beamtime is easier for everyone. 🤝
- **Modern MATLAB Arguments & Auto-Completion**
The toolbox is transitioning from the older `inputParser` to MATLAB's modern `arguments` block (introduced in R2019b). Functions like `nappNorm`, `nappDetermineShift`, and `nappCopyShift` now use this modern structure.
- **Benefit:** Y
You no longer need to manually update `functionSignatures.json` for these functions. MATLAB automatically reads the `arguments` block to generate real-time code suggestions, tab-completion, and tooltips in the Editor.
**Universal Execution Logging**
Data provenance is critical. All `napp...` processing functions now feature a **Universal Logging Block**. When a function modifies a spectrum, it automatically records *when* it was processed and *what script* called the function.
* You will see new columns like `logNappNormDate` and `logNappNormCaller` magically appear in your table. If you run a function from the command window, the caller will simply log as `" "`.
## 🧭 Keep an Overview — FAIR and open research
@@ -177,8 +187,21 @@ SpectrumList.mat
↓FigureHexylamineN1sLjIce.m → FigureHexylamineN1sLjIce.mat
``````
Reuse `.mat` outputs to skip re-running previous steps 🧠💤
Reuse `.mat` outputs to skip re-running previous steps 🧠💤. We have cleanly decoupled the energy calibration pipeline into a highly modular, three-step process.
1. **Fit the Reference Standards (`nappFitGaussXps`)**
First, fit your reference spectra (e.g., C1s or Au4f) to find their exact measured positions. This generates the `peakPos` column.
2. **Calculate the Internal Shift (`nappDetermineShift`)**
Compare the measured `peakPos` of your standard to your theoretical target energy (e.g., 285.0 eV for C1s). This function acts as a pure calculator and outputs the required `bindingEnergyShift` using the `'internalSelf'` method.
3. **Distribute the Shift (`nappCopyShift`)**
Use the matching engine to copy the calculated `bindingEnergyShift` from your calibration standards to your target spectra (e.g., O1s).
**The Matching Engine (`matchStrategy`)**
Functions that combine or compare spectra (like `nappNorm` and `nappCopyShift`) now use a unified matching engine to pair target spectra with reference spectra. You can choose from:
* `'earlier'`: Finds the closest reference spectrum taken *before* the target.
* `'after'`: Finds the closest reference spectrum taken *after* the target.
* `'spectrumNumber'`: Matches the 4-digit sequence number at the start of the filename (e.g., `0045_O1s` finds `0045_C1s`).
* `'internalSelf'` / `'internalMax'`: The spectrum references itself (e.g., normalizing to its own maximum, or calculating its own energy drift).
***
## Prerequisites
@@ -454,6 +477,16 @@ These variables are typically created or updated by fitting/analysis functions.
- `peakPosition`
Fitted peak position(s).
- `bindingEnergyShift`
The absolute shift required to align a spectrum to a theoretical reference energy (calculated by `nappDetermineShift`).
- `energyShiftSource`
Logs exactly where the shift value came from (e.g., `'self'` if calculated internally, or the exact filename of the C1s spectrum it was copied from).
- `log[FunctionName]Date` (e.g., `logNappNormDate`)
String representation of the exact date and time the row was processed by that specific function.
- `log[FunctionName]Caller` (e.g., `logNappNormCaller`)
The exact file path of the script that executed the function, ensuring you always know which script modified your data.
- `logDataSource`
(Specifically for `nappCombineSpectra`). A cell containing an array of strings with the exact filenames of all raw spectra that were averaged/summed together to create the combined row.
***
@@ -567,7 +600,7 @@ Contents of beamtime:
nappFitGaussXpsDevelopment - Playground to add Shirley background :-).
nappGenerateSpectra - Generate 1D spectra from image spectra.
nappPlot - NAPPLOT Plot photoelectron spectra and NEXAFS images from a data table.
nappScale - Normalize XPS and NEXAFS spectra.
nappNorm - Normalize XPS spectra.
``````
Additionally, little helper functions can be found in the utils folder:
+1 -43
View File
@@ -1,19 +1,6 @@
{
"_schemaVersion": "1.0.0",
"nappScale": {
"inputs": [
{"name": "DataTable", "kind": "required", "type": ["table"]},
{"name": "tableSelection", "kind": "optional", "type": ["logical"]},
{"name": "energyStart", "kind": "optional", "type": ["numeric"]},
{"name": "energyEnd", "kind": "optional", "type": ["numeric"]},
{"name": "tableVariable", "kind": "namevalue", "type": ["choices={'spectrum_counts','spectrum_countsPerSecond','spectrum_countsNorm'}"]},
{"name": "regionOld", "kind": "namevalue", "type": ["choices={'O1s','C1s','N1s','Cl2p'}"]},
{"name": "regionNew", "kind": "namevalue", "type": ["choices={'O1s','C1s','N1s'}"]},
{"name": "peakNumber", "kind": "namevalue", "type": ["numeric"]},
{"name": "mode", "kind": "namevalue", "type": ["choices={'intensity','area'}"]}
]
},
"nappPlot": {
"inputs": [
@@ -63,35 +50,6 @@
]
},
"nappDetermineShiftXps": {
"inputs": [
{"name": "DataTable", "kind": "required", "type": ["table"]},
{"name": "eKinStart", "kind": "optional", "type": ["numeric"]},
{"name": "eKinEnd", "kind": "optional", "type": ["numeric"]},
{"name": "FitParameter", "kind": "namevalue", "type": ["struct"]},
{"name": "binEnReference", "kind": "namevalue", "type": ["numeric"]},
{"name": "kinEnReference", "kind": "namevalue", "type": ["numeric"]},
{"name": "tableSelection", "kind": "namevalue", "type": ["logical"]},
{"name": "minPeakWidth", "kind": "namevalue", "type": ["numeric"]},
{"name": "minPeakHeight", "kind": "namevalue", "type": ["numeric"]},
{"name": "movMeanWindow", "kind": "namevalue", "type": ["numeric"]},
{"name": "tableVariable", "kind": "namevalue", "type": ["choices={'spectrum_counts','spectrum_countsPerSecond','spectrum_countsNorm','image','imageRoh'}"]},
{"name": "showFigures", "kind": "namevalue", "type": ["choices={'on','off'}"]},
{"name": "mode", "kind": "namevalue", "type": ["choices={'gaussFit','findPeak'}"]},
{"name": "refPeak", "kind": "namevalue", "type": ["numeric"]}
]
},
"nappCopyShift": {
"inputs": [
{"name": "DataTable", "kind": "required", "type": ["table"]},
{"name": "tableSelection", "kind": "optional", "type": ["logical"]},
{"name": "regionOld", "kind": "namevalue", "type": ["choices={'O1s','C1s','N1s'}"]},
{"name": "regionNew", "kind": "namevalue", "type": ["choices={'O1s','C1s','N1s','Cl2p'}"]},
{"name": "energyScale", "kind": "namevalue", "type": ["choices={'kinetic','binding'}"]}
]
},
"nappCombineSpectra": {
"inputs": [
{"name": "DataTable", "kind": "required", "type": ["table"]},